音频时钟¶
本文描述了 ASoC 和一般数字音频中的音频时钟术语。注意:音频时钟可能很复杂!
主时钟¶
每个音频子系统都由一个主时钟驱动(有时称为 MCLK 或 SYSCLK)。这个音频主时钟可以从多个来源(例如晶体、PLL、CPU 时钟)获得,并负责产生正确的音频播放和捕获采样率。
一些主时钟(例如 PLL 和基于 CPU 的时钟)是可配置的,它们的频率可以通过软件更改(取决于系统用途和节省功耗)。其他主时钟的频率是固定的(即晶体)。
DAI 时钟¶
数字音频接口通常由位时钟(通常称为 BCLK)驱动。此时钟用于在编解码器和 CPU 之间的链路上传输数字音频数据。
DAI 还有一个帧时钟来指示每个音频帧的开始。这个时钟有时被称为 LRC(左右时钟)或 FRAME。这个时钟以精确的采样率运行(LRC = 采样率)。
位时钟可以按如下方式生成:-
BCLK = MCLK / x, 或
BCLK = LRC * x, 或
BCLK = LRC * 通道数 * 字长
这种关系取决于特定的编解码器或 SoC CPU。一般来说,最好将 BCLK 配置为尽可能低的速度(取决于您的采样率、通道数和字长)以节省功耗。
最好使用编解码器(如果可能)来驱动(或主控)音频时钟,因为它通常比 CPU 提供更精确的采样率。
ASoC 提供的时钟 API¶
-
int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir)¶
配置 DAI 系统或主时钟。
参数
struct snd_soc_dai *dai
DAI
int clk_id
DAI 特定的时钟 ID
unsigned int freq
新的时钟频率,单位为 Hz
int dir
新的时钟方向(SND_SOC_CLOCK_IN 或 SND_SOC_CLOCK_OUT)
描述
配置 DAI 主时钟 (MCLK) 或系统时钟 (SYSCLK)。
-
int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)¶
配置 DAI 时钟分频器。
参数
struct snd_soc_dai *dai
DAI
int div_id
DAI 特定的时钟分频器 ID
int div
新的时钟分频值。
描述
配置时钟分频器。这用于从系统或主时钟中获得最佳的 DAI 位时钟和帧时钟。最好将 DAI 位时钟和帧时钟设置得尽可能低,以节省系统功耗。
-
int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out)¶
配置 DAI PLL。
参数
struct snd_soc_dai *dai
DAI
int pll_id
DAI 特定的 PLL ID
int source
PLL 的 DAI 特定源
unsigned int freq_in
PLL 输入时钟频率,单位为 Hz
unsigned int freq_out
请求的 PLL 输出时钟频率,单位为 Hz
描述
配置并启用 PLL,以根据输入时钟生成输出时钟。
-
int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)¶
配置 BCLK 与采样率的比率。
参数
struct snd_soc_dai *dai
DAI
unsigned int ratio
BCLK 与采样率的比率。
描述
将 DAI 配置为预设的 BCLK 与采样率的比率。