TI中文支持网
TI专业的中文技术问题搜集分享网站

audio模式问题咨询

在移植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

赞(0)
未经允许不得转载:TI中文支持网 » audio模式问题咨询
分享到: 更多 (0)