音频时钟产生原理
codec内部DAC/ADC需要一个内部音频master clock(CODEC_CLK),工作频率要求是256*fs(ref),从codec驱动看fs(ref)计算公式如下所示,可见fs(ref)频率只有44100和48000。
fsref = (params_rate(params) % 11025 == 0) ? 44100 : 48000;
ADC/DAC的采样率为 fS(ref)/NCODEC or 2 × fS(ref)/NCODEC,NCODEC取值范围为1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, or 6。
CODEC_CLK 可以通过简单的clock divider(CLKDIV_CLKIN) 或者 PLL电路(PLL_CLKIN)产生。
codec可以使用MCLK或BCLK作为外部时钟源,如果使用BCLK,那MCLK pin可以断开不接。MCLK也可以接在BCLK上或者MCLK由cpu或外部晶振提供时钟。
1:clock divider计算fs(ref)公式如下所示:
fS(ref) = CLKDIV_IN/(128 × Q)
Q = 2, 3, …, 17. Q is register programmable and can be set in page 0, register 3, bits D6–D3.
CLKDIV_IN can be MCLK or BCLK, selected by register 102, bits D7–D6.
2:PLL计算fs(ref)公式如下所示:
fS(ref) = (PLLCLK_IN × K × R)/(2048 × P)
where
P = 1, 2, 3,…, 8
R = 1, 2, …, 16
K = J.D
J = 1, 2, 3, …, 63
D = 0000, 0001, 0002, 0003, …, 9998, 9999
PLLCLK_IN can be MCLK or BCLK, selected by Page 0, register 102, bits D5–D4
评估外部时钟源MCLK或BCLK 频率是否满足codec要求?
确认外部时钟源是否满足codec要求 主要看经过clock divider或PLL处理后fS(ref)频率是否满足44100或48000。
基于clock divider计算公式,当fS(ref)等于48000时,需要的最小外部时钟源频率是12.288MHZ,这就需要MCLK由cpu或外部晶振提供时钟。PCM接口和I2S接口的BCLK时钟频率都无法满足。
当clock divider无法满足要求时,驱动会使能PLL来提供时钟。
下图是为满足fS(ref)频率,不同MCLK频率下PLL参数配置,下图可知当fS(ref)等于48000时,需要MCLK最小值是2.048MHZ。
I2S接口的BCLK是无法满足要求,以48000采样率、双声道、16bits计算其BCLK频率为1.536mMHZ。mdm9x07平台的PCM接口
可以配置输出2.048或4.096MHZ频率满足要求。换句话说就是如果想把DAI配置成I2S,那MCLK必须由CPU或外部晶振提供频率,同时如果
使用clock divider,MCLK最小是12.288MHZ,如果使用PLL,MCLK最小是2.048MHZ。
举例
如上电路图,MCLK是连接在BCLK上,这样DAI无法配置成I2S接口,只能使用PCM接口。PCM接口的采样率只支持8k和16K、单声道。主要用于语音通话。如果使用aplay/arec播放录制更高频率的音频数据会导致设置 hw params失败。
参考资料
https://elixir.bootlin.com/linux/v4.15.18/source/sound/soc/codecs/tlv320aic3x.c
TLV320AIC3104IRHBR.pdf datasheet