linux之ALSA驱动篇

Linux-alsa驱动分析
简述:asoc(alsa sustem on chip)是slsa在soc方向的发展和演变,但是依旧率属于alsa,只是在alsa的基础上进行了CPU代码和codec的再次封装。
对于现在的内核而言,asoc由3部分组成。
(1) codec层,这部分属于面向codec的编程,与CPU的平台无关。
(2) platform层,这部分是与CPU进行相关的操作,它主要是处理DMA与IIS等CPU的数字借口
(3) machine层,次层属于codec与machine的交互,主要是将codc与machine进行绑定。
我们可以这里理解:codec认为自己通用与所有的CPU,而machine层认为自己可以连接所有的codec芯片,而中间的连接方式由platform进行管理。
一:asoc Codec层驱动
在asoc框架下,codec主要负责codec dai(codec digital audio interface)音频数字接口以及PCM(playback and capture manage)的配置。
相关的数据结构如下、

2.6x版本的内核与3.xx版本的内核在次数据结构上有一定的差别,在3.4.x上,
Dai的playback与capture放入到snd_soc_dai_driver上,以及对dai的相关参数配置等都归属于snd_soc_dai_driver中。

1.1、snd_soc_dai_driver数据结构
如下数据结构所示,主要提供dai的总线操作,比如probe,remove等ops,

1.1.1、snd_soc_dai_ops数据结构
Snd_soc_dai_ops主要是提供了codec的时钟,PLL以及clkdiv的设置,主要是依靠set_syssck(),set_pll(),以及set_clkdiv()这三个函数进行设置codec的sck与pull,clk_div参数进行配置,同时也需要关系一下音频采集的一些操作,由startup(),shutdown(),hw_params(),hw_free(),prepare(),trigger()等相关函数来实现。

1.1.2、snd_soc_pcm_stream数据分析
该数据主要用户配置codec的播放/录音等相关参数配置,formats表示音频的格式,rates表示音频的Rate,rate_xxx表示支持的rate范围,channel表示音频的输入/输出channel,一颗codec最大支持8个channel,sig_bits表示音频数据的bits数。

1.2、snd_pcm_runtime数据结构

Snd_pcm_runtime字面上的意思表示pcm实时的数据信息,从它的数据结构中可知,主要是提供codec实时的缓冲区信息,codec的硬件参数与软件参数,Hw_ptr_base表示播放/录制音频的buffer存放区,hw_paras表示硬件配置参数,主要是codec类型,rate参数,channel等,sw_params表示软件参数,DMA的通过设置DMA的起始地址(dma_addr),传输大小(dma_bytes),以及传输目的地(dma_area+dma_bytes)这三要素。
1.3、snd_soc_dapm_widge数据

二:asoc platform层分析
在asoc platform层是链接codec与machine的,他同时存在codec的snd_soc_dai_driver下的snd_soc_dai_opr这个DAI的相关操作,在codec中会确定DMA的三要素,所以DMA的相关驱动实现都会在platform层进行实现,主要由ALSA的snd_pcm_ops的trigger(),pointer()来具体实现。
2.1、ASOC platform的驱动组成
一、DAI部分

二、DMA部分
DMA的主要操作函数为snd_pcm_ops

三、asoc machine层分析

-------------------------------未完,待续----------------------------------------------------------------------------------------

你可能感兴趣的:(LINUX篇)