音訊時鐘¶
本文描述了 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 *daiDAI
int clk_idDAI 特定的時鐘 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 *daiDAI
int div_idDAI 特定的時鐘分頻器 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 *daiDAI
int pll_idDAI 特定的 PLL ID
int sourcePLL 的 DAI 特定來源
unsigned int freq_inPLL 輸入時鐘頻率,單位為 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 *daiDAI
unsigned int ratioBCLK 與取樣率的比率。
描述
為預設的 BCLK 與取樣率比率配置 DAI。