alsa驱动分析(2.6.21内核)之二
4. 通常的使用流程的分析
通常使用 alsalib 来播放声音包括以下几个步骤:
1, open, 这个和 oss 相同,对应于 alsa 就是 snd_pcm_open ;
2, param 设置,这个就是 snd_pcm_hw_params;
3, 上层的 alsa 在设置 param 的成功以后或者出错的时候恢复都需要调用 snd_pcm_prepare;
4, write 函数;
现在一个个的来看;
4.1.1 open 过程介绍
如下图所示:
就是我先前说的分成三部分,先是 cpu 级别的,包括 clock 的 enabe ,中断的申请,空间的申请;
然后就是平台级别的包括 DMA 所需要的空间的分配等;
不过这里 codec 级别的没有提供相关的函数,由 machine 提供了一些函数主要是设置 channel ,格式,频率范围等等;
4.1.2 snd_pcm_hw_params 流程分析
流程就是这样,至于里面做的具体的事情,我觉得只需要对照 spec 看看就知道了,具体的寄存器设置下面有一点讲解,主要是格式的设置(采样率的设置会留到 prepare 的时候),至于中断上来的时候那个更新 hw_ptr 函数很有用,这样上层就可以知道数据到底写了多少或者说还有多少空间可以写;
4.1.3 prepare 流程分析
当 alsa 层调用 snd_pcm_prepare 的时候会触发驱动对应的 prepare 的函数执行 , 如下:
可以看出基本上还是分为了三段,一段是 cpu 级别的,主要是对于 ssp port 的设置,具体设置如下:
对于 voice 通道, littleton_micco_voice_prepare 的设置:
the sscr0 0xc0163f,sscr1 0xf01dc0,sspsp 0x800085
其中对于 pcm 的 ssp 地址是:
#define SSCR0_P4 __REG(0x41A00000) /* SSP Port 4 Control Register 0 */
#define SSCR1_P4 __REG(0x41A00004) /* SSP Port 4 Control Register 1 */
#define SSPSP_P4 __REG(0x41A0002C) /* SSP Port 4 Programmable Serial Protocol */
所以结果就相当于:
SSCR0_P4 0x41A00000 : 0xc0163f —— 》 0000 , 0000 , 1100 , 0000 , 0001 , 0110 , 0011 , 1111
对于这个地址高 8 位为 0 ,
31 ( MOD ) - 》 0 :普通模式; 30 ( ACS ) - 》 0 :时钟选择是由 NCS 和 ECS 位绝决定,看后面;
29 ( FPCKE ) - 》 0 : FIFO packing mode disabled ; 28 () - 》 0 : reserved
27 ( 52MM ) - 》 0 : 13mbps 模式; 26 : 24 ( FRDC ) - 》 0 :每帧的时隙数
23 ( TIM ) ->1: 表示禁止传输 fifo underrun 中断; 22 ( RIM ) - 》 1 :表示禁止接收 fifo overrun 中断
21 ( NCS ) ->0: 表示时钟选择由 ECS 决定; 20 ( EDSS ) - 》 0 :表示前面填充 DSS 来达到 8-16 位
19 : 8 ( SCR ) - 》 0x16: 决定串口 bit 率, =sspx clock/(scr+1) ???; 7 ( SSE ) - 》 0 :表示 disable port
6 ( ECS ) - 》 0 :表示片内的时钟用来计算 serial clock rate ; 5 : 4 ( FRF ) - 》 0b11 :表示 psp 模式用来模拟 I2S 协议
3 : 0 ( DSS ) - 》 0b1111 :表示 16bit 数据( EDSS 为 0 )
SSCR1_P4 0x41A00004: 0xf01dc0—— 》 0000 , 0000 , 1111 , 0000 , 0001 , 1101 , 1100 , 0000
对于这个地址高 8 位也为 0 ,
31 ( TTELP ) - 》 0 :表示最后一个 bit 传输( LSB )传完后有半个时钟处于高阻(三态)状态;
30(TTE)- 》 0 :表示传输信号不是三态的; 29 ( EBCEI ) - 》 0 : bit 传输错误不产生中断
28 ( SCFR ) - 》 0 :表示 SSPSCLK 的时钟信号需要连续的工作,主模式 ignore ; 27 ( ECRA ) - 》 0 :表示禁止其它 ssp 向它发起始终请求
26 ( ECRB ) - 》 0 :表示同 27 ; 25 ( SCLKDIR ) - 》 0 :表示主模式, SSP 端口,驱动 SSPSCLK ;