在移植wm8523的时候, 遇到了音频格式的一些问题.
wm8523使用I2S格式通信, 格式如下
同事在代码中dai_fmt设置如下
SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_NB_IF
对于SND_SOC_DAIFMT_CBS_CFS
按照 3352的TRM描述
mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE);
mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, AFSXE);
mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE);
mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, AFSRE);
mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, ACLKX | ACLKR);
mcasp_set_bits(mcasp, DAVINCI_MCASP_PDIR_REG, AFSX | AFSR);
这里的主要意思就是
ACLKX 即 BCLK 来自可编程位时钟分频器输出的内部发送时钟源。
ACLKX 配置成输出
LRCLK 为内部生成的发送帧同步。
对于SND_SOC_DAIFMT_I2S 这里会多一个设置
/* FS need to be inverted */
inv_fs = true;
FS需要翻转,这个也没有问题
对于SND_SOC_DAIFMT_NB_IF
mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, ACLKXPOL);
mcasp_set_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG, ACLKRPOL);
fs_pol_rising = false;
这里的以上是主机在BCLK下降沿时发送数据,则外部的codec在BCLK上升沿接收数据,这个是合理的
因为这里有IF所以标记 fs_pol_rising = flase 也就是下降沿
以上都没有问题
但是后面还有如下代码
if (inv_fs)
fs_pol_rising = !fs_pol_rising;
if (fs_pol_rising) {
mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
} else {
mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);
}
到这里 fs_pol_rising变成了true, 这里和设置的 SND_SOC_DAIFMT_NB_IF
中的IF fs翻转岂不是冲突了?
fs不翻转感觉也不符合上面的i2s LRCLK的时序啊
请帮忙解析一下,为什么这里会这样,还是说我理解的有问题.
linux4.14 代码位置
sound/soc/davinci/davinci-mcasp.c
Thanks!
Shine:
图片显示不出来,需要插入图片,mcasp是支持I2S格式的。
linux底层驱动的移植,可以到e2e上论坛咨询,有专门的驱动工程师解答。
e2e.ti.com/…/791