ALSA总结
简介
阅读前,请先阅读这几篇前序文章:
原理
如上图,每个模块都有自己的driver,DMA是platform_driver,cpu和codec则是dai_driver;每个模块将自己注册给ACore,Acore就有了调用各个模块的能力;
1)当Acore实例化声卡时,就会调用每个模块的初始化工作;比如.set_clk设置时钟,.set_fmt设置数字接口的格式,是I2S、Left_J还是DSP A等等
2)当上层启动/暂停播放音频业务,往下传递数据或截止时,会调用.trigger等等
DMA
DMA负责快速将内存数据转移到CPU_DAI上,其中:
- open时,dma内容已分配好,
这里将会初始化内存的访问规则,比如为了高效读写内容,要求以32 bit对齐访问内存;同时将dma支持的buffer、period、channel等参数返回给应用层以便其选择 - hw_param 传递下来的sampleRate、format和channel
这里就是通过这些参数来设置DMA的发送规则,fifo队列、brust和递增寻址等 - trigger和prepare
因为dma发送数据给CPU_DAI时,发送完后都是中断触发,trigger用于准备和启动中断的 - pointer
pointer很重要,他能从buffer中获取已发送数据的偏移,通过这个偏移,应用层可以知道数据发送多少了 - 中断函数
除此之外就是一些DMA的中断内容,中断回调函数,其工作:触发中断、清除中断标志,通知上层发送下一帧数据
CPU_DAI和Codec_DAI
这两个部分主要就是设置数字接口DAI的通讯参数,
I2S、TDM、slot_num和slot_width,要理解这些参数如何设置,还有时钟信号MCLK、BCLK、LRCLK;
他们往往都来源于SampleRate、format和channel参数,要清楚大致的计算逻辑;
Codec DSP之外的知识
因为DSP芯片内部包含许多内部组件,如mixer、mux、PGA、DRC等等,codec的功能就是控制其工作、上下电,这就涉及一个重要的东西:DAPM系统,相对复杂,直接跳转到另外的博客查看把!