音频时钟¶
本文描述了 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 与采样率的比率。
描述
为预设的 BCLK 与采样率比率配置 DAI。