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驅動的工做細節和關聯。