音频时钟

本文描述了 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。