1. ASoC的由來
-
Codec驅動與SoC CPU的底層耦合過於緊密,這種不理想會導致代碼的重複,例如,僅是wm8731的驅動,當時Linux中有分別針對4個平臺的驅動代碼。
-
音頻事件沒有標準的方法來通知用戶,例如耳機、麥克風的插拔和檢測,這些事件在移動設備中是非常普通的,而且通常都需要特定於機器的代碼進行重新對音頻路徑進行配置。
-
當進行播放或錄音時,驅動會讓整個codec處於上電狀態,這對於PC沒問題,但對於移動設備來說,這意味着浪費大量的電量。同時也不支持通過改變過取樣頻率和偏置電流來達到省電的目的。
2. 硬件架構
-
Machine 是指某一款機器,可以是某款設備,某款開發板,又或者是某款智能手機,由此可以看出Machine幾乎是不可重用的,每個Machine上的硬件實現可能都不一樣,CPU不一樣,Codec不一樣,音頻的輸入、輸出設備也不一樣,Machine爲CPU、Codec、輸入輸出設備提供了一個載體。
-
Platform 一般是指某一個SoC平臺,比如pxaxxx,s3cxxxx,omapxxx等等,與音頻相關的通常包含該SoC中的時鐘、DMA、I2S、PCM等等,只要指定了SoC,那麼我們可以認爲它會有一個對應的Platform,它只與SoC相關,與Machine無關,這樣我們就可以把Platform抽象出來,使得同一款SoC不用做任何的改動,就可以用在不同的Machine中。實際上,把Platform認爲是某個SoC更好理解。
-
Codec 字面上的意思就是編解碼器,Codec裏面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多種輸入(Mic、Line-in、I2S、PCM)和多個輸出(耳機、喇叭、聽筒,Line-out),Codec和Platform一樣,是可重用的部件,同一個Codec可以被不同的Machine使用。嵌入式Codec通常通過I2C對內部的寄存器進行控制。
3. 軟件架構
-
Codec驅動 ASoC中的一個重要設計原則就是要求Codec驅動是平臺無關的,它包含了一些音頻的控件(Controls),音頻接口,DAMP(動態音頻電源管理)的定義和某些Codec IO功能。爲了保證硬件無關性,任何特定於平臺和機器的代碼都要移到Platform和Machine驅動中。所有的Codec驅動都要提供以下特性:
-
Codec DAI 和 PCM的配置信息;
-
Codec的IO控制方式(I2C,SPI等);
-
Mixer和其他的音頻控件;
-
Codec的ALSA音頻操作接口;
-
-
-
DAPM描述信息;
-
DAPM事件處理程序;
-
DAC數字靜音控制
-
-
Platform驅動 它包含了該SoC平臺的音頻DMA和音頻接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何與板子或機器相關的代碼。
-
Machine驅動 Machine驅動負責處理機器特有的一些控件和音頻事件(例如,當播放音頻時,需要先行打開一個放大器);單獨的Platform和Codec驅動是不能工作的,它必須由Machine驅動把它們結合在一起才能完成整個設備的音頻處理工作。
4. 數據結構
5. 3.0版內核對ASoC的改進