ASoC--ALSA System on Chip ,是创建在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。在ASoc出现以前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性:数据结构
ASoC正是为了解决上述种种问题而提出的,目前已经被整合至内核的代码树中:sound/soc。ASoC不能单独存在,他只是创建在标准ALSA驱动上的一个它必须和标准的ALSA驱动框架相结合才能工做。架构
/********************************************************************************************/
声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢!
/********************************************************************************************/
框架
一般,就像软件领域里的抽象和重用同样,嵌入式设备的音频系统能够被划分为板载硬件(Machine)、Soc(Platform)、Codec三大部分,以下图所示:.net
图2.1 音频系统结构设计
在软件层面,ASoC也把嵌入式设备的音频系统一样分为3大部分,Machine,Platform和Codec。code
必要时,也能够提供如下功能:orm
整个ASoC是由一些列数据结构组成,要搞清楚ASoC的工做机理,必需要理解这一系列数据结构之间的关系和做用,下面的关系图展现了ASoC中重要的数据结构之间的关联方式:blog
图4.1 Kernel-2.6.35-ASoC中各个结构的静态关系接口
ASoC把声卡实现为一个Platform Device,而后利用Platform_device结构中的dev字段:dev.drvdata,它实际上指向一个snd_soc_device结构。能够认为snd_soc_device是整个ASoC数据结构的根本,由他开始,引出一系列的数据结构用于表述音频的各类特性和功能。snd_soc_device结构引出了snd_soc_card和soc_codec_device两个结构,而后snd_soc_card又引出了snd_soc_platform、snd_soc_dai_link和snd_soc_codec结构。如上所述,ASoC被划分为Machine、Platform和Codec三大部分,若是从这些数据结构看来,snd_codec_device和snd_soc_card表明着Machine驱动,snd_soc_platform则表明着Platform驱动,snd_soc_codec和soc_codec_device则表明了Codec驱动,而snd_soc_dai_link则负责链接Platform和Codec。事件
5. 3.0版内核对ASoC的改进
原本写这篇文章的时候参考的内核版本是2.6.35,不过有CSDN的朋友提出在内核版本3.0版本中,ASoC作了较大的变化。故特地下载了3.0的代码,发现确实有所变化,下面先贴出数据结构的静态关系图:
图5.1 Kernel 3.0中的ASoC数据结构
由上图咱们能够看出,3.0中的数据结构更为合理和清晰,取消了snd_soc_device结构,直接用snd_soc_card取代了它,而且强化了snd_soc_pcm_runtime的做用,同时还增长了另外两个数据结构snd_soc_codec_driver和snd_soc_platform_driver,用于明确表明Codec驱动和Platform驱动。
后续的章节中将会逐一介绍Machine和Platform以及Codec驱动的工做细节和关联。