参考资料
https://www.cnblogs.com/bobfly1984/p/14277682.html
codec DAI介绍
lv320aic3104 codec DAI支持 left-justified 、right-justified、I2S、DSP、TDM操作模式。这些模式都是MSB-FIRST。
WCLK定义一个帧的开始,通过编程实现脉冲信号或矩形波信号。其频率对应ADC/DAC采样率。
BCLK用于在数据线DIN/DOUT上输入和输出数据。
TDM模式是在DSP A/B模式基础上通过修改offset寄存器实现。当offset等于0时,从信号时序角度看TDM模式就是DSP A/B模式,换句话说DSP A/B模式其实是TDM模式的特例。
offset就是在每帧里数据开始有效对应的bit clock。
在TDM模式里支持和标准电话PCM接口通信,标准电话PCM接口采用DSP A模式。codec的DSP模式其实就是 DSP B模式。在DSP B模式下修改offset实现DSP A模式。
codec DAI时序
1:Right-Justified Mode
2:Left-Justified Mode
3:I2S Mode
4:DSP Mode
每个数据在bit clock的下降沿有效。
5:TDM数据传输模式
TDM模式
基于DSP A/B模式,通过修改可编程的offset实现TDM数据传输。offset就是在每个帧内数据开始有效对应的bit clock。
对于输出数据而言,除了输出有效数据到DOUT 期间,在剩余bit clocks期间DOUT可以编程为高阻抗状态,这允许多个codecs
通过编程不同的offset在共享的DOUT line上输出数据,每个codec数据只是在不同的slot时隙上。
对于输入数据而言,codec只关注offset指定的数据,忽略其它bit clock期间的数据。
从代码角度看DSP B模式如何转化成DSP A模式或TDM模式
codec的datasheet如下所示,这个DSP 模式从信号时序看就是DSP B模式。
上面参数中width参数就是slot占用的bits数,tdm_delay参数代表第几个slot,delay参数就是上面说的offset。
width和tdm_delay参数是通过回调函数set_tdm_slot()设置的,当tdm_delay参数等于0时,默认就是DSP B模式。基于DSP B模式延迟一个bit clock就是DSP A模式。
tdm_delay参数决定了数据在哪个slot上有效。
时钟是否翻转
从代码确认codec在DSP A/B模式下仅仅支持 SND_SOC_DAIFMT_IB_NF。这个宏的详细描述如下所示:
可见codec在DSP A/B模式下,仅仅支持数据在BCLK的下降沿有效。
mdm9x07平台 pcm接口时序
通过示波器测量,PCM接口master和slave模式在波形上是一样的。同时 frame format是DSP A模式,信号极性是SND_SOC_DAIFMT_IB_NF。
1:master mode
2:slave mode
mdm9x7平台 TDM接口时序
TMD 接口格式支持不同的frame sync 模式:one slot、short、long。
codec DAI实现方案
基于TI tlv320aic3104 codec调试之clock这篇博客的分析,确认cpu需要通过pcm接口和codec dai进行通信。通过上面分析cpu pcm接口工作在DSP A模式,因此配置codec dai工作在DSP A模式即可,同时信号极性是SND_SOC_DAIFMT_IB_NF。
为简单实现,通过machine驱动定义的be_hw_params_fixup()回调函数实现保持后端CPU DAI和codec DAI的hw params 固定不变,即设置采样率16k,采样精度16bit,声道数1。
由于DAI配置为PCM接口,采样率只能设置为16K和8K,如果要动态切换cpu和codec的hw params,必须在audio或voice use case开始前设置。