當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Linux音頻ASoC架構(gòu)驅(qū)動(dòng)解析
Linux音頻ASoC架構(gòu)驅(qū)動(dòng)解析
時(shí)間:2018-09-29 來(lái)源:未知
近來(lái)對(duì)音頻芯片興趣頗濃,想在片選系統(tǒng)上實(shí)現(xiàn)音頻驅(qū)動(dòng),仔細(xì)研究發(fā)現(xiàn),Linux內(nèi)核系統(tǒng)(3.0)可以配置兩種音頻編程接口驅(qū)動(dòng),其驅(qū)動(dòng)架構(gòu)的組成如下:
1) Linux OSS 音頻設(shè)備驅(qū)動(dòng)架構(gòu)的組成:mixer 接口、dsp 接口及用戶空間編程方法。
2) Linux ALSA 音頻設(shè)備驅(qū)動(dòng)架構(gòu)的組成:card 和組件管理、PCM 設(shè)備、control 接口、AC97 API(或者是其他音頻芯片API接口)及用戶空間編程方法。
1.ASoC的由來(lái):
由于OSS音頻驅(qū)動(dòng)架構(gòu)是一個(gè)沒(méi)有完全開放源代碼的商業(yè)產(chǎn)品,而ALSA音頻驅(qū)動(dòng)架構(gòu)恰好彌補(bǔ)了這一空白。
ASoC--ALSA System on Chip (即ALSA在片選系統(tǒng)上的應(yīng)用),是建立在標(biāo)準(zhǔn)ALSA驅(qū)動(dòng)層上,為了更好地支持嵌入式處理器和移動(dòng)設(shè)備中的音頻Codec的一套軟件體系。在ASoc出現(xiàn)之前,內(nèi)核對(duì)于SoC中的音頻已經(jīng)有部分的支持,不過(guò)會(huì)有一些局限性:
• Codec驅(qū)動(dòng)與SoC CPU的底層耦合過(guò)于緊密,這種不理想會(huì)導(dǎo)致代碼的重復(fù),例如,僅是wm8731的驅(qū)動(dòng),當(dāng)時(shí)Linux中有分別針對(duì)4個(gè)平臺(tái)的驅(qū)動(dòng)代碼。
• 音頻事件沒(méi)有標(biāo)準(zhǔn)的方法來(lái)通知用戶,例如耳機(jī)、麥克風(fēng)的插拔和檢測(cè),這些事件在移動(dòng)設(shè)備中是非常普通的,而且通常都需要特定于機(jī)器的代碼進(jìn)行重新對(duì)音頻路勁進(jìn)行配置。
• 當(dāng)進(jìn)行播放或錄音時(shí),驅(qū)動(dòng)會(huì)讓整個(gè)codec處于上電狀態(tài),這對(duì)于PC沒(méi)問(wèn)題,但對(duì)于移動(dòng)設(shè)備來(lái)說(shuō),這意味著浪費(fèi)大量的電量。同時(shí)也不支持通過(guò)改變過(guò)取樣頻率和偏置電流來(lái)達(dá)到省電的目的。
ASoC正是為了解決上述種種問(wèn)題而提出的,目前已經(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é)合才能工作。
2.音頻設(shè)備硬件接口
2.1 PCM 接口
PCM也是一種4線制接口。與I2S非常相像,但支持一個(gè)更靈活的協(xié)議。它有位時(shí)鐘(BCLK)和同步時(shí)鐘(SYNC)用來(lái)在Tx和Rx在傳送和接收音頻數(shù)據(jù)是同步連接。位時(shí)鐘通常因采樣率的不同而不同,然而同步時(shí)鐘(SYNC)與采樣頻率相同。PCM同樣支持時(shí)分復(fù)用,可以幾個(gè)設(shè)備同時(shí)使用總線(這有時(shí)被稱為network模式)。
2.2 IIS 接口
I2S是一個(gè)4線數(shù)字音頻接口,常用于HiFi,STB便攜設(shè)備。Tx 和Rx信號(hào)線用于音頻傳輸。而位時(shí)鐘和左右時(shí)鐘(LRC)用于同步鏈接。I2S具有靈活性,因?yàn)榭刂破骱徒獯a器都可以控制位時(shí)鐘和左右時(shí)鐘。位時(shí)鐘因采樣率和主系統(tǒng)時(shí)鐘而有不同。LRCLK與采樣率相同。少數(shù)設(shè)備支持獨(dú)立的ADC和DAC的LRCLK。這使在不同采樣率情況下同步捕獲和回放成為可能。
2.3 AC97 接口
AC97是一種個(gè)人電腦聲卡上常見的五線接口。現(xiàn)在在很多便攜設(shè)備中也很流行。這個(gè)數(shù)字音頻接口有一個(gè)復(fù)位線,分時(shí)在SDATA_OUT(回放)和SDATA_IN(捕獲) 線上傳送數(shù)據(jù)。位時(shí)鐘常由解碼器驅(qū)動(dòng)(通常是12.288MHz).幀時(shí)鐘(通常48kHz)總是由控制器驅(qū)動(dòng)。每個(gè)AC97幀21uS,并分為13個(gè)時(shí)間槽。
2.4 音頻系統(tǒng)結(jié)構(gòu)
通常,就像軟件領(lǐng)域里的抽象和重用一樣,嵌入式設(shè)備的音頻系統(tǒng)可以被劃分為板載硬件(Machine)、Soc(Platform)、Codec三大部分,如下圖所示:

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)無(wú)關(guān)的,它包含了一些音頻的控件(Controls),音頻接口,DAMP(動(dòng)態(tài)音頻電源管理)的定義和某些Codec IO功能。為了保證硬件無(wú)關(guān)性,任何特定于平臺(tái)和機(jī)器的代碼都要移到Platform和Machine驅(qū)動(dòng)中。所有的Codec驅(qū)動(dòng)都要提供以下特性:
o Codec DAI 和 PCM的配置信息;
o Codec的IO控制方式(I2C,SPI等);
o Mixer和其他的音頻控件;
o Codec的ALSA音頻操作接口;
也可以增加提供以下功能:
o DAPM描述信息;
o DAPM事件處理程序;
o 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. CLASS SOC
整個(gè)ASoC是由一些列struct組成,要搞清楚ASoC的工作機(jī)理,必須要理解這一系列struct之間的關(guān)系和作用,下面的關(guān)系圖展示了ASoC中重要的數(shù)據(jù)結(jié)構(gòu)之間的關(guān)聯(lián)方式:

Kernel 3.0中的ASoC數(shù)據(jù)結(jié)構(gòu)
通過(guò)snd_soc_card結(jié)構(gòu),又引出了Machine驅(qū)動(dòng)的另外兩個(gè)個(gè)數(shù)據(jù)結(jié)構(gòu):
snd_soc_dai_link(實(shí)例:smdk_dai[] )
snd_soc_ops(實(shí)例:smdk_ops )
snd_soc_dai_link看名字就知道,很明顯它是起耦合鏈接作用的。它指定了Platform、Codec、codec_dai、cpu_dai的名字,稍后Machine驅(qū)動(dòng)將會(huì)利用這些名字去匹配已經(jīng)在系統(tǒng)中注冊(cè)的platform,codec,dai。
snd_soc_ops連接Platform和Codec的dai_link對(duì)應(yīng)的ops操作函數(shù),本例就是smdk_ops,它只實(shí)現(xiàn)了hw_params函數(shù):smdk_hw_params。
到此為止,主要的部分machine的平臺(tái)設(shè)備注冊(cè)我們完成了。

