alsa驱动分析之二

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

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值