第一范文网 - 专业文章范例文档资料分享平台

alsa(audio)驱动分析

来源:用户分享 时间:2025/5/19 18:14:35 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

How to Mount Maemo File System——Guide System Analysis and Design Documents snd_pcm_hw_params Issue: <0.5> Issue Date: <10/29/2007> substream->ops->hw_params(substream, params)调用soc_pcm_hw_paramsif (cpu_dai->ops.hw_params)if (platform->pcm_ops->hw_params) pxa3xx_pcm_dma_irqcpu_dai->ops.hw_params只是设置,有中断才调用platform->pcm_ops->hw_params(substreif (dcsr & am, params);DCSR_ENDINTR) pxa3xx_pcm_hw_paramssnd_pcm_period_elapsed上一次中断传输顺利完成pxa3xx_ssp_hw_params这里对ssp端口进行设置 pxa_request_dma(prtd->params->name, DMA_PRIO_LOW,pxa3xx_pcm_dma_irq, substream)snd_pcm_update_hw_ptr_interrupt 流程就是这样,至于里面做的具体的事情,我觉得只需要对照spec看看就知道了,具体的寄存器设置下面有一点讲解,主要是格式的设置(采样率的设置会留到prepare的时候),至于中断上来的时候那个更新hw_ptr函数很有用,这样上层就可以知道数据到底写了多少或者说还有多少空间可以写; 4.1.3

当alsa层调用snd_pcm_prepare的时候会触发驱动对应的prepare的函数执行,如下: prepare流程分析

?Tech, 2005 Page 9 of 22

How to Mount Maemo File System——Guide System Analysis and Design Documents 这是内核层代码snd_pcm_prepare Issue: <0.5> Issue Date: <10/29/2007> snd_pcm_action_nonatomic(&snd_pcm_action_prepare,substream, f_flags); snd_pcm_pre_prepare snd_pcm_do_preparesnd_pcm_post_preparesubstream->ops->prepare(substream)substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_RESET, NULL)soc_pcm_prepare这里是遍历整个门列表,查找门的sname也就是流名字,如果和strstr现在建立的流的名字,那么就把w->active设成1,这在后面的dapm_power_widget里面会根据这个标志为来判断是否应该power on,这样就避免了打开一些根本用不到的门machine->ops->prepareplatform->pcm_ops->preparecodec_dai->ops.prepareif (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)littleton_micco_hifi_prepare对于hifi通道littleton_micco_voice_prepare对于pcm通道(play,record)这里是录音和播放共存的代码pxa3xx_pcm_preparemicco_hifi_prepare对于hifi通道micco_voice_prepare对于pcm通道(play,record)这里主要是设置波特率snd_soc_dapm_stream_event(codec,codec_dai->playback.stream_name,SND_SOC_DAPM_STREAM_START);DCSR(prtd->dma_ch) &= ~DCSR_RUN;DCSR(prtd->dma_ch) = 0;DCMD(prtd->dma_ch) = 0;*prtd->params->drcmr = prtd->dma_ch | DRCMR_MAPVLD;清DMA相关标志dapm_power_widgets(codec, event);可以看出基本上还是分为了三段,一段是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 */ 所以结果就相当于:

?Tech, 2005

Page 10 of 22

How to Mount Maemo File System——Guide System Analysis and Design Documents 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; 24(SFRMDIR)-》0:表示主模式,SSP端口,驱动SSPSFRM信号;

23(RWOT)-》1:表示只接收不传输???;22(TRAIL)-》1:表示trailing bytes 由dma burst来处理; 21(TSRE)-》1:表示传输DMA sevice request 是enabled;20(RSRE)-》1:表示接收DMA service request允许

19(TINTE)-》0:表示接收超时中断disable;18(PINTE)-》0:表示外设trail byte 中断disable; 17:保留;16(IFS)->0:表示帧的极性由PSP的极性位决定;

15(STRF)-》0:表示传输FIFO(读,写)由SSDR_X来决定;14(EFWR)-》0:表示FIFO读写特别函数disable

13:10(RFT)-》0b0111:表示到达什么级别rxfifo断言中断;9:6(TFT)-》0111:表示TXFIFO断言中断级别

5:保留;4(SPH)-》0:表示在每一个帧开始之前要等一个时钟,结束后要等0.5个时钟; 3(SPO)-》0:表示SSPSCLK在inactive的时候是低电平;2(LBM)-》0:表示非循环模式

1(RIE)-》0:表示RXFIFO门槛到达的中断disable;0(RIE)->0:表示接收FIFO门槛到达中断disable

SSPSP_P4 0x41A0002C: 0x800085-》0000,0000,1000,0000,0000,0000,1000,0101 这个地址的高8位为0,

31:reverved;30:28(EDMYSTOP)-》0:extended dummy stop;

27:26(EDMYSTART)-》0:extended dummy start;25(FSRT)-》0:下一帧的开始由前面的扩展STOP决定;

24:23(DMYSTOP)-》0b01:表示最后一bit传输完毕后保持active的clock数1clock的延迟;22:保留 21:16(SFRMWDTH)-》0:表示最小位帧宽度;15:9(SFRMDLY)-》0:serial frame dealy 8:7(DMYSTRT)-》0b01:表示1clock的延迟在开始的时候;6:4(STRTDLY)-》0:start delay 3(ETDS)-》0:表示结束时的传输状态为low;2(SFRMP)-》1:serial frame的极性; 1:0(SCMODE)-》0b01:data driven 上升沿,数据采样下降沿,idle状态,低;

对于littleton_micco_hifi_prepare的设置:

The sscr0 e1c0003f,sscr1 701dc0,sspsp 40200004,sstsa 3,ssrsa 3,ssacd 60,ssacdd 6590040 其中对于I2s的spp地址是: #define SSCR0_P3 __REG(0x41900000) /* SSP Port 3 Control Register 0 */

?Tech, 2005

Page 11 of 22

Issue: <0.5> Issue Date: <10/29/2007> How to Mount Maemo File System——Guide System Analysis and Design Documents #define SSCR1_P3 __REG(0x41900004) /* SSP Port 3 Control Register 1 */ #define SSPSP_P3 __REG(0x4190002C) /* SSP Port 3 Programmable Serial Protocol */ #define SSTSA_P3 __REG(0x41900030) /* SSP Port 3 Tx Timeslot Active */ #define SSRSA_P3 __REG(0x41900034) /* SSP Port 3 Rx Timeslot Active */ #define SSACD_P3 __REG(0x4190003C) /* SSP Port 3 Audio Clock Divider */

#define SSACDD_P3 __REG(0x41900040) /* SSP Port 3 Audio Clock Dither Divider Register */

SSCR0_P3==__REG(0x41900000):e1c0003f——》1110,0001,1100,0000,0000,0000,0011,1111 31 (MOD)-》1:网络模式;30(ACS)-》1:时钟选择是audio clock和audio clock divider决定,由ssacd寄存器决定;

29(FPCKE)-》1:FIFO packing mode enabled;28()-》0:reserved 27(52MM)-》0:13mbps模式;26:24(FRDC)-》1:每帧的时隙数

23(TIM)->1:表示禁止传输fifo underrun中断;22(RIM)-》1:表示禁止接收fifo overrun中断

21(NCS)->0:这里ignore,由ACS决定了(为1);20(EDSS)-》0:表示前面填充DSS来达到8-16位 19:8(SCR)-》0:由ACS那里决定;7(SSE)-》0:表示disable port,工作时应为1

6(ECS)-》0:表示片内的时钟用来计算serial clock rate;5:4(FRF)-》0b11:表示psp模式用来模拟I2S协议

3:0(DSS)-》0b1111:表示16bit数据(EDSS为0)

SSCR1_P3==__REG(0x41900004):701dc0——》0000,0000,0111,0000,0001,1101,1100,0000 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; 24(SFRMDIR)-》0:表示主模式,SSP端口,驱动SSPSFRM信号;

23(RWOT)-》0:接收和传输都可以;22(TRAIL)-》1:表示trailing bytes 由dma burst来处理;

21(TSRE)-》1:表示传输DMA sevice request 是enabled;20(RSRE)-》1:表示接收DMA service request允许

19(TINTE)-》0:表示接收超时中断disable;18(PINTE)-》0:表示外设trail byte 中断disable; 17:保留;16(IFS)->0:表示帧的极性由PSP的极性位决定;

15(STRF)-》0:表示传输FIFO(读,写)由SSDR_X来决定;14(EFWR)-》0:表示FIFO读写特别函数disable

13:10(RFT)-》0b0111:表示到达什么级别rxfifo断言中断;9:6(TFT)-》0111:表示TXFIFO断言中断级别

5:保留;4(SPH)-》0:表示在每一个帧开始之前要等一个时钟,结束后要等0.5个时钟; 3(SPO)-》0:表示SSPSCLK在inactive的时候是低电平;2(LBM)-》0:表示非循环模式

1(RIE)-》0:表示RXFIFO门槛到达的中断disable,0(RIE)->0:表示接收FIFO门槛到达中断disable

SSPSP_P3==__REG(0x4190002C):40200004——》0100,0000,0010,0000,0000,0000,0000,0100 31:reverved;30:28(EDMYSTOP)-》4:extended dummy stop;

27:26(EDMYSTART)-》0:extended dummy start;25(FSRT)-》0:下一帧的开始由前面的扩展STOP决定;

24:23(DMYSTOP)-》0b00:表示最后一bit传输完毕后保持active的clock数的延迟;22:保留 21:16(SFRMWDTH)-》0b20:表示最小位帧宽度;15:9(SFRMDLY)-》0:serial frame dealy 8:7(DMYSTRT)-》0b00:表示0clock的延迟在开始的时候;6:4(STRTDLY)-》0:start delay 3(ETDS)-》0:表示结束时的传输状态为low;2(SFRMP)-》1:serial frame的极性; 1:0(SCMODE)-》0b00:data driven 下降沿,数据采样上升沿,idle状态,低;

SSTSA_P3==__REG(0x41900030):3——》0011

?Tech, 2005

Page 12 of 22

Issue: <0.5> Issue Date: <10/29/2007>

搜索更多关于: alsa(audio)驱动分析 的文档
alsa(audio)驱动分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c19fli5ekjq5a66i6tkx2_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top