Hi All
在用DaVinci处理器的McASP采集音频:
1. 音频时序是立体声2个声道,时钟,数据,同步三个信号输入给McASP;
2. FrameSync是高电平时长32个bit,低电平时长32个bit;
3. 有效数据是左对齐,时长16个bit;
问题是这样的:
1. McASP采集这样的时序,是按照16bit采集,还是32bit采集?
2. 配置McASP的寄存器:XFMT的SLOT为32,WORD为16,RROT为4,MASK为0000FFFF是否正确?
3. 从Linux用户空间看,采集进来的数据是16bit还是32bit?
Chris Meng:
你好,
请问你使用的是具体哪款芯片?不同芯片的Mcasp也会有些区别。
从frame sync配置的寄存器看,只有两个选择,一个bit,或者一个word,所以word配置16的话,frame sync的宽度就有问题,所以word还是需要配置为32-bit。
Receive Frame Sync Control Register (AFSRCTL)4 FRWID Receive frame sync width select bit indicates the width of the receive frame sync (AFSR) during itsactive period.0 Single bit.1 Single word. Single word is not supported if RMOD is set to burst mode.
我没有使用过RROT/RMASK,但我觉得这两个寄存器只能改变输入的数据,但不能改变McASP内部认为的数据的宽度。你可以尝试确认一下。
最好还是能够调整外部音频信号的格式。
VampireDaVinci:
回复 Chris Meng:
Hi Chris
感谢回复,我贴几个图,详细说明一下,CPU目前是DM385;
现在McASP的输入的音频时序是这样的,如下图,黄色的波形是48KHz的FrameSync同步脉冲,蓝色的是数据,数据是MSB,16bit,左对齐;
我仔细通读了TRM里的McASP一个章节,在TRM里P1856页定义了Slot,Word,Slot表示Sync脉冲开槽时间,Word表示有效数据长度,在我们这个时序要求下,SLOT=32bit,WORD=16bit
在P1885页,对于左对齐,MSB在前的数据,RROT=SLOT-WORD,RRVRS=1,结合后面的图可以看懂,McASP左对齐MSB在前的先陆续进入FIFO,然后由于RRVRS=1,做一个左右对调的操作,MSB就在高比特这一侧了,
然后做一个右移RROT比特的操作,对于我们的这个时序,应该是读入16bit有效数据再读入16bit无效数据,然后左右镜像对调,再右移16bit,得到:PPPP-PPPP-PPPP-PPPP-M …. L 这样一个32bit的数据。
那么问题来了,在驱动里的mcasp_davinci.c函数里,配置时序的函数认为 SLOT是等于WORD的,可以看出 下面一段代码的 DAVINCI_AUDIO_WORD_X 下面设置的 fmt 值就是SLOT值,对于我们
这样的时序,应该怎么修改呢?
是否在:DAVINCI_AUDIO_WORD_16 这个分支 下设置SLOT=32,RROT=4(右移16bit),MASK=0000FFFF,这样通过ALSA接口读出来的是16bit的有效数据?
Chris Meng:
回复 VampireDaVinci:
Jason,
你的问题我基本清楚。
我提到的frame sync宽度设置问题,你是否如何想的?
VampireDaVinci:
回复 Chris Meng:
(AFSRCTL) 这个寄存器对FrameSync的设置有2个地方:
1. FrameSync宽度是bit-width还是word-width,FRWID位,对于word-width描述的很清楚,McASP对FrameSync的高电平期间的全部有时钟的数据都采集进来作为一个声道,在FrameSync的低电平期间的全部有时钟的数据采集进来作为另一个声道,如果用这种模式,我这个时序只能按照32bit数据采集到Linux的用户空间而不是16bit,这32bit数据的高16bit就Padding成0;如果是bit-width,我没有找到对应的时序图,我想是一个时钟周期的FrameSync表示了一帧的开始,然后McASP就一直采集数据直到下一个FrameSync来到,但是McASP会采集多少bit数据?是按照SLOT-Size采吗?
2. FrameSync是外部产生还是内部产生,FSRM位,这个就没太明白时序是怎么产生的,如果选则内部产生FrameSync,那是根据什么参数产生的?
如果1的答案是我猜想的这样,我这个时序就可以设置为:bit-width,slot=16,internal-sync,那么McASP只要拿到一个上升沿/下降沿就在内部产生一个16bit的FrameSynce,把数据采集进来,抓到Linux内核空间也是16bit。
Chris Meng:
回复 VampireDaVinci:
Jason,
现在McAsp接收clock和frame sync是外部auido codec给的么?这个音频时序可以修改么?
如果是内部产生framesync,就是根据FRWID的配置来产生的。
VampireDaVinci:
回复 Chris Meng:
Hi Chris
1. 外部Codec时序是不能修改的;
2. “内部产生的FrameSync是根据FRWID的配置来产生的” 这句话不能理解,
如果FRWID配置成bit-width或者word-width,按照我这个时序,McASP将在内部产生多大的FrameSync?我理解应该是按照外部输入帧同步的上升沿/下降沿作为触发,FrameSync宽度是按照SLOT寄存器长度内部产生的。
这个理解对不对?
Chris Meng:
回复 VampireDaVinci:
Jason,
FS可以是DM芯片内部产生,或者是外部输入,如果是内部产生,是根据FRWID的配置来产生的。
如果采集的时钟和帧同步是外部输入给McASP的,能否尝试:XFMT的SLOT为32,WORD为16,RROT为0,MASK为FFFF0000,两个slot?
VampireDaVinci:
回复 Chris Meng:
Hi Chris
这个设置就是我之前说的,一个Frame有2个SLOT,1个SLOT=32个时钟周期,RROT和PADDING之后,变成了每个声道采样数据长度是32bit,但是高2字节是Padding的Zero-bit 。
VampireDaVinci:
回复 Chris Meng:
Hi Chris
膜拜 。。。。
这样理论上是可行的