1.? ASoC的由來
ASoC--ALSA System on Chip ,是建立在標(biāo)準(zhǔn)ALSA驅(qū)動(dòng)層上,為了更好地支持嵌入式處理器和移動(dòng)設(shè)備中的音頻Codec的一套軟件體系。在ASoc出現(xiàn)之前,內(nèi)核對(duì)于SoC中的音頻已經(jīng)有部分的支持,不過會(huì)有一些局限性:
Codec驅(qū)動(dòng)與SoC CPU的底層耦合過于緊密,這種不理想會(huì)導(dǎo)致代碼的重復(fù),例如,僅是wm8731的驅(qū)動(dòng),當(dāng)時(shí)Linux中有分別針對(duì)4個(gè)平臺(tái)的驅(qū)動(dòng)代碼。
音頻事件沒有標(biāo)準(zhǔn)的方法來通知用戶,例如耳機(jī)、麥克風(fēng)的插拔和檢測,這些事件在移動(dòng)設(shè)備中是非常普通的,而且通常都需要特定于機(jī)器的代碼進(jìn)行重新對(duì)音頻路勁進(jìn)行配置。
當(dāng)進(jìn)行播放或錄音時(shí),驅(qū)動(dòng)會(huì)讓整個(gè)codec處于上電狀態(tài),這對(duì)于PC沒問題,但對(duì)于移動(dòng)設(shè)備來說,這意味著浪費(fèi)大量的電量。同時(shí)也不支持通過改變過取樣頻率和偏置電流來達(dá)到省電的目的。
ASoC正是為了解決上述種種問題而提出的,目前已經(jīng)被整合至內(nèi)核的代碼樹中:sound/soc。ASoC不能單獨(dú)存在,他只是建立在標(biāo)準(zhǔn)ALSA驅(qū)動(dòng)上的一個(gè)它必須和標(biāo)準(zhǔn)的ALSA驅(qū)動(dòng)框架相結(jié)合才能工作。
/********************************************************************************************/
聲明:本博內(nèi)容均由http://blog.csdn.net/droidphone原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,謝謝!
/********************************************************************************************/
?
2.? 硬件架構(gòu)
通常,就像軟件領(lǐng)域里的抽象和重用一樣,嵌入式設(shè)備的音頻系統(tǒng)可以被劃分為板載硬件(Machine)、Soc(Platform)、Codec三大部分,如下圖所示:
圖2.1? 音頻系統(tǒng)結(jié)構(gòu)
Machine? 是指某一款機(jī)器,可以是某款設(shè)備,某款開發(fā)板,又或者是某款智能手機(jī),由此可以看出Machine幾乎是不可重用的,每個(gè)Machine上的硬件實(shí)現(xiàn)可能都不一樣,CPU不一樣,Codec不一樣,音頻的輸入、輸出設(shè)備也不一樣,Machine為CPU、Codec、輸入輸出設(shè)備提供了一個(gè)載體。
Platform? 一般是指某一個(gè)SoC平臺(tái),比如pxaxxx,s3cxxxx,omapxxx等等,與音頻相關(guān)的通常包含該SoC中的時(shí)鐘、DMA、I2S、PCM等等,只要指定了SoC,那么我們可以認(rèn)為它會(huì)有一個(gè)對(duì)應(yīng)的Platform,它只與SoC相關(guān),與Machine無關(guān),這樣我們就可以把Platform抽象出來,使得同一款SoC不用做任何的改動(dòng),就可以用在不同的Machine中。實(shí)際上,把Platform認(rèn)為是某個(gè)SoC更好理解。
Codec? 字面上的意思就是編解碼器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多種輸入(Mic、Line-in、I2S、PCM)和多個(gè)輸出(耳機(jī)、喇叭、聽筒,Line-out),Codec和Platform一樣,是可重用的部件,同一個(gè)Codec可以被不同的Machine使用。嵌入式Codec通常通過I2C對(duì)內(nèi)部的寄存器進(jìn)行控制。?
3.? 軟件架構(gòu)
在軟件層面,ASoC也把嵌入式設(shè)備的音頻系統(tǒng)同樣分為3大部分,Machine,Platform和Codec。
Codec驅(qū)動(dòng)? ASoC中的一個(gè)重要設(shè)計(jì)原則就是要求Codec驅(qū)動(dòng)是平臺(tái)無關(guān)的,它包含了一些音頻的控件(Controls),音頻接口,DAMP(動(dòng)態(tài)音頻電源管理)的定義和某些Codec IO功能。為了保證硬件無關(guān)性,任何特定于平臺(tái)和機(jī)器的代碼都要移到Platform和Machine驅(qū)動(dòng)中。所有的Codec驅(qū)動(dòng)都要提供以下特性:
Codec DAI 和 PCM的配置信息;
Codec的IO控制方式(I2C,SPI等);
Mixer和其他的音頻控件;
Codec的ALSA音頻操作接口;
必要時(shí),也可以提供以下功能:
DAPM描述信息;
DAPM事件處理程序;
DAC數(shù)字靜音控制
Platform驅(qū)動(dòng)? 它包含了該SoC平臺(tái)的音頻DMA和音頻接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何與板子或機(jī)器相關(guān)的代碼。
Machine驅(qū)動(dòng)? Machine驅(qū)動(dòng)負(fù)責(zé)處理機(jī)器特有的一些控件和音頻事件(例如,當(dāng)播放音頻時(shí),需要先行打開一個(gè)放大器);單獨(dú)的Platform和Codec驅(qū)動(dòng)是不能工作的,它必須由Machine驅(qū)動(dòng)把它們結(jié)合在一起才能完成整個(gè)設(shè)備的音頻處理工作。
4.? 數(shù)據(jù)結(jié)構(gòu)
整個(gè)ASoC是由一些列數(shù)據(jù)結(jié)構(gòu)組成,要搞清楚ASoC的工作機(jī)理,必須要理解這一系列數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系和作用,下面的關(guān)系圖展示了ASoC中重要的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)聯(lián)方式:
圖4.1 ?Kernel-2.6.35-ASoC中各個(gè)結(jié)構(gòu)的靜態(tài)關(guān)系
ASoC把聲卡實(shí)現(xiàn)為一個(gè)Platform Device,然后利用Platform_device結(jié)構(gòu)中的dev字段:dev.drvdata,它實(shí)際上指向一個(gè)snd_soc_device結(jié)構(gòu)。可以認(rèn)為snd_soc_device是整個(gè)ASoC數(shù)據(jù)結(jié)構(gòu)的根本,由他開始,引出一系列的數(shù)據(jù)結(jié)構(gòu)用于表述音頻的各種特性和功能。snd_soc_device結(jié)構(gòu)引出了snd_soc_card和soc_codec_device兩個(gè)結(jié)構(gòu),然后snd_soc_card又引出了snd_soc_platform、snd_soc_dai_link和snd_soc_codec結(jié)構(gòu)。如上所述,ASoC被劃分為Machine、Platform和Codec三大部分,如果從這些數(shù)據(jù)結(jié)構(gòu)看來,snd_codec_device和snd_soc_card代表著Machine驅(qū)動(dòng),snd_soc_platform則代表著Platform驅(qū)動(dòng),snd_soc_codec和soc_codec_device則代表了Codec驅(qū)動(dòng),而snd_soc_dai_link則負(fù)責(zé)連接Platform和Codec。
5.? 3.0版內(nèi)核對(duì)ASoC的改進(jìn)
本來寫這篇文章的時(shí)候參考的內(nèi)核版本是2.6.35,不過有CSDN的朋友提出在內(nèi)核版本3.0版本中,ASoC做了較大的變化。故特意下載了3.0的代碼,發(fā)現(xiàn)確實(shí)有所變化,下面先貼出數(shù)據(jù)結(jié)構(gòu)的靜態(tài)關(guān)系圖:
圖5.1?? Kernel 3.0中的ASoC數(shù)據(jù)結(jié)構(gòu)
由上圖我們可以看出,3.0中的數(shù)據(jù)結(jié)構(gòu)更為合理和清晰,取消了snd_soc_device結(jié)構(gòu),直接用snd_soc_card取代了它,并且強(qiáng)化了snd_soc_pcm_runtime的作用,同時(shí)還增加了另外兩個(gè)數(shù)據(jù)結(jié)構(gòu)snd_soc_codec_driver和snd_soc_platform_driver,用于明確代表Codec驅(qū)動(dòng)和Platform驅(qū)動(dòng)。
后續(xù)的章節(jié)中將會(huì)逐一介紹Machine和Platform以及Codec驅(qū)動(dòng)的工作細(xì)節(jié)和關(guān)聯(lián)。
?
評(píng)論
查看更多