声卡驱动是好久之前看的,因为最近需要跟进wm9714连接pcm voice card的问题,所以又回头审视了下。做个小节如下。
声卡的驱动主要干两件事:和上级搞好关系与和底层搞好关系。
但是声卡的上下层有些特殊,声卡的上层,阶级制度森严,是大名顶顶的alsa。alsa那写的可不是一般的好啊,好的代码都有个特点,看不太懂,一般的接口规范就是几个ioctl调用下来,alsa确实ioctl套ioctl,我映像最深的就是一堆ITEM。所以呢,sound目录下core里面的很多代码,都是用来保证alsa接口的,什么ioctl.c, compat_ioctl.c,大家看不懂就别看了。以后再看。
那么和底层的接口,主要就是soc目录中几个文件的内容。这几个文件讲了这么几件事:machine是什么(主要就是将cpu和codec的音频特称,主要是围绕着流来说的),platform是什么(主要就是讲pcm相关东西,这就是和具体的pcm控制器相关的知识),codec是什么(主要是讲codec的一些特性)。
我们主要就是从应用上来讲控制过程。首先是open(包括 clock 的 enabe ,中断的申请, DMA 所需要的空间, 设置 channel ,格式,频率范围等等) ,open完后是param设置(主要是格式的设置,还有hw_ptr函数 ),然后是prepare(主要是codec初始化,还有power on也会牵涉到dapm),最后是write(由trigger触发,把数据拷回用户区)。
另外还有amixer的控制过程,通过调用/dev下的设备节点,调用kctl->put(kctl, control), 再调用snd_ctl_elem_write,实际上在这中间implement了dapm的作用。