ASOC框架(一)
前言
ASoC–ALSA System on Chip,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系,我们使用ASOC框架的话就不用调用snd_card_create等函数来创建我们的声卡,目前已经被整合至内核的代码树中:sound/soc,ASOC把声卡的驱动分为三部分,分别为machine,platform,codec
如上图所示,我们对machine,platform,codec三部分做简要的介绍
machine:单板相关,表明platform是哪个,CPU DAI是哪个,DMA是哪个,表明codec是哪个,code DAI是哪个,驱动负责处理机器特有的一些控件和音频事件,单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工
platform:DAI设置接口,DMA传数据,包含了该SoC平台的音频DMA和音频接口的配置和控制
codec:DAI,控制接口,Codec驱动是平台无关的
深一步分析
从上图可以看出我们的mini2440单板在初始化的时候会根据设备名字"s3c24xx_uda134x"匹配到驱动端,然后调用驱动的probe,该probe函数又注册了一个名为"soc-audio"平台设备,而且该平台设备中还有名字为"snd_soc_s3c24xx_uda134x"的私有数据,该私有数据是ASOC框架的关键,是一个struct snd_soc_card类型的数据,当"soc-audio"平台设备匹配到对应的驱动而调用其probe函数时,在probe函数中会取出"soc-audio"平台设备的私有数据,然后注册它,下面我们看看这个重要的私有数据做了什么事
对于"s3c24xx-iis"
snd_soc_dai_link则负责连接Platform和Codec,以我的理解它代表的是machine端的驱动,代表着CPU的DAI接口
对于"samsung-audio"
snd_soc_platform_drive代表Platform驱动,有DMA等的操作
对于"uda134x-codec"
snd_soc_codec_driver代表Codec驱动,可以看到soc_codec_dev_uda134x里面有read,write函数,表示读写寄存器,很显然这就对应我们上图中的Codec端的三线控制接口,uda134x_dai则代表Codec端的DAI接口,它的fops函数里面有启动,暂停,静音,设置时钟等操作,可以看出它与我们的CPU DAI接口是类似的,这是因为它们要保持格式的一致,才能准确传输数据