音訊時鐘

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