音频时钟

本文描述了 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 与采样率的比率。