Linux音(yin)頻ASoC架構驅動(dong)解析
							時(shi)間:2018-09-29      來源:未知 
							近來(lai)對音(yin)(yin)頻芯(xin)片興趣頗濃(nong),想(xiang)在片選系統上(shang)實現音(yin)(yin)頻驅動(dong),仔(zi)細研究發現,Linux內(nei)核(he)系統(3.0)可以配置兩種音(yin)(yin)頻編程接口驅動(dong),其驅動(dong)架(jia)構的組(zu)成如下:
1) Linux OSS 音頻(pin)設備(bei)驅動(dong)架構(gou)的組成:mixer 接(jie)口、dsp 接(jie)口及用戶(hu)空間編(bian)程方法(fa)。
2) Linux ALSA 音(yin)頻設備(bei)驅動架構(gou)的組成:card 和組件(jian)管理、PCM 設備(bei)、control 接口(kou)、AC97 API(或者是其他音(yin)頻芯(xin)片API接口(kou))及用戶空間編程方法。
1.ASoC的由來:
由于OSS音(yin)頻(pin)驅動架構是(shi)一(yi)個沒有完全開(kai)放(fang)源代(dai)碼的商(shang)業產品,而ALSA音(yin)頻(pin)驅動架構恰(qia)好彌補(bu)了這一(yi)空白。
ASoC--ALSA System on Chip (即ALSA在(zai)片選(xuan)系(xi)統上的(de)(de)應用),是(shi)建立在(zai)標準ALSA驅動(dong)層上,為了更好地支持嵌入式處理器和(he)移動(dong)設備(bei)中(zhong)的(de)(de)音(yin)(yin)頻Codec的(de)(de)一套軟件體系(xi)。在(zai)ASoc出現(xian)之(zhi)前,內核對于SoC中(zhong)的(de)(de)音(yin)(yin)頻已(yi)經有部分的(de)(de)支持,不(bu)過會有一些局限性:
• Codec驅動與SoC CPU的(de)底層耦合過(guo)于緊(jin)密,這(zhe)種不理想會導致(zhi)代碼的(de)重復(fu),例如,僅是wm8731的(de)驅動,當時Linux中(zhong)有分別針對4個平臺的(de)驅動代碼。
• 音頻事(shi)件(jian)沒有標準的方(fang)法來通(tong)(tong)知(zhi)用戶,例如耳(er)機、麥克風的插(cha)拔(ba)和(he)檢測,這些事(shi)件(jian)在(zai)移動設(she)備中是非常普通(tong)(tong)的,而且通(tong)(tong)常都需要特(te)定于機器的代碼進(jin)行(xing)重(zhong)新(xin)對音頻路勁(jing)進(jin)行(xing)配置。
• 當進行播放或錄音時,驅動會讓整個codec處于(yu)(yu)上電狀(zhuang)態(tai),這(zhe)對(dui)于(yu)(yu)PC沒問題,但(dan)對(dui)于(yu)(yu)移動設備來(lai)說,這(zhe)意(yi)味著浪費大量的電量。同(tong)時也不支(zhi)持通過(guo)改(gai)變過(guo)取樣頻率和偏置電流(liu)來(lai)達到省電的目的。
ASoC正是為了解(jie)決(jue)上述種種問題(ti)而(er)提出的(de),目前已(yi)經被整合至內核的(de)代碼樹中:sound/soc。ASoC不能單獨存(cun)在,他只是建立在標準(zhun)ALSA驅(qu)動上的(de)一(yi)個它(ta)必(bi)須和標準(zhun)的(de)ALSA驅(qu)動框架(jia)相結合才能工作(zuo)。
2.音頻設(she)備硬件接口
2.1 PCM 接口
PCM也是一(yi)種4線制接口。與I2S非常相像,但支持一(yi)個更(geng)靈活的協議。它(ta)有位時(shi)鐘(BCLK)和同(tong)步時(shi)鐘(SYNC)用(yong)來在Tx和Rx在傳送和接收音頻數(shu)據是同(tong)步連接。位時(shi)鐘通常因采樣率的不同(tong)而(er)(er)不同(tong),然(ran)而(er)(er)同(tong)步時(shi)鐘(SYNC)與采樣頻率相同(tong)。PCM同(tong)樣支持時(shi)分(fen)復用(yong),可以幾個設備同(tong)時(shi)使用(yong)總線(這有時(shi)被稱為network模式)。
2.2 IIS 接口
I2S是一個4線數字(zi)音(yin)頻接(jie)口,常用(yong)于(yu)HiFi,STB便攜設備(bei)。Tx 和(he)Rx信號線用(yong)于(yu)音(yin)頻傳輸。而位時鐘和(he)左(zuo)右(you)時鐘(LRC)用(yong)于(yu)同步(bu)鏈接(jie)。I2S具有靈活性(xing),因(yin)為控制(zhi)器和(he)解碼器都可以控制(zhi)位時鐘和(he)左(zuo)右(you)時鐘。位時鐘因(yin)采(cai)樣(yang)率(lv)和(he)主系(xi)統時鐘而有不同。LRCLK與采(cai)樣(yang)率(lv)相同。少數設備(bei)支(zhi)持獨(du)立的(de)ADC和(he)DAC的(de)LRCLK。這使在不同采(cai)樣(yang)率(lv)情況下同步(bu)捕獲和(he)回放成為可能(neng)。
2.3 AC97 接(jie)口
AC97是(shi)一種(zhong)個(ge)人電腦聲卡上(shang)常(chang)(chang)見(jian)的(de)五線(xian)接口(kou)。現在(zai)在(zai)很多便攜(xie)設備中也很流行。這個(ge)數字音頻接口(kou)有一個(ge)復位(wei)線(xian),分時(shi)在(zai)SDATA_OUT(回放)和SDATA_IN(捕獲) 線(xian)上(shang)傳送數據。位(wei)時(shi)鐘常(chang)(chang)由解碼器驅動(dong)(通(tong)常(chang)(chang)是(shi)12.288MHz).幀時(shi)鐘(通(tong)常(chang)(chang)48kHz)總是(shi)由控制器驅動(dong)。每個(ge)AC97幀21uS,并分為13個(ge)時(shi)間槽。
2.4 音(yin)頻(pin)系統(tong)結構(gou)
通常,就像軟件領(ling)域里的抽象和重用一(yi)樣,嵌入式(shi)設備(bei)的音頻系統(tong)可以被劃分(fen)(fen)為(wei)板(ban)載(zai)硬(ying)件(Machine)、Soc(Platform)、Codec三大部(bu)分(fen)(fen),如下圖所示:
  
3. 軟(ruan)件架(jia)構
在軟件層(ceng)面(mian),ASoC也(ye)把嵌(qian)入式設備的音頻系統同(tong)樣分為3大(da)部分,Machine,Platform和Codec。
• Codec驅(qu)(qu)動(dong) ASoC中的(de)一(yi)個重要設計原則就是要求(qiu)Codec驅(qu)(qu)動(dong)是平臺無關(guan)的(de),它包(bao)含了(le)一(yi)些(xie)音頻(pin)的(de)控件(Controls),音頻(pin)接口,DAMP(動(dong)態音頻(pin)電源管理)的(de)定(ding)(ding)義(yi)和(he)某些(xie)Codec IO功能(neng)。為了(le)保證硬件無關(guan)性,任何特定(ding)(ding)于(yu)平臺和(he)機器的(de)代碼(ma)都要移到Platform和(he)Machine驅(qu)(qu)動(dong)中。所有的(de)Codec驅(qu)(qu)動(dong)都要提供以(yi)下(xia)特性:
o Codec DAI 和 PCM的配(pei)置信息;
o Codec的IO控制(zhi)方(fang)式(I2C,SPI等);
o Mixer和(he)其他(ta)的音頻控件;
o Codec的ALSA音頻(pin)操作接口;
也可以(yi)增(zeng)加提供以(yi)下功能(neng):
o DAPM描述信息;
o DAPM事(shi)件處理程序;
o DAC數字靜音控制
• Platform驅(qu)動 它包(bao)含了該(gai)SoC平臺的(de)音(yin)頻DMA和音(yin)頻接口(kou)的(de)配(pei)置和控制(I2S,PCM,AC97等(deng)等(deng));它也不能包(bao)含任何與板子(zi)或機器相關的(de)代碼。
• Machine驅(qu)(qu)(qu)動(dong) Machine驅(qu)(qu)(qu)動(dong)負(fu)責(ze)處(chu)理機(ji)器特有的(de)一(yi)些(xie)控件和音頻事(shi)件(例如,當播放音頻時(shi),需(xu)要(yao)先(xian)行打開一(yi)個(ge)放大器);單獨的(de)Platform和Codec驅(qu)(qu)(qu)動(dong)是不能工作(zuo)的(de),它(ta)必須由Machine驅(qu)(qu)(qu)動(dong)把它(ta)們結合(he)在一(yi)起才能完成整個(ge)設備的(de)音頻處(chu)理工作(zuo)。
4. CLASS SOC
整個(ge)ASoC是(shi)由一些列(lie)struct組(zu)成(cheng),要(yao)搞清楚ASoC的(de)(de)工(gong)作機理,必須要(yao)理解這一系(xi)(xi)(xi)列(lie)struct之間(jian)的(de)(de)關(guan)系(xi)(xi)(xi)和作用,下面的(de)(de)關(guan)系(xi)(xi)(xi)圖展示了ASoC中重(zhong)要(yao)的(de)(de)數據結構之間(jian)的(de)(de)關(guan)聯方式:
  
Kernel 3.0中的ASoC數據結構(gou)
通(tong)過snd_soc_card結構,又引出了(le)Machine驅動的另(ling)外兩個(ge)(ge)個(ge)(ge)數據結構:
snd_soc_dai_link(實例(li):smdk_dai[] )
snd_soc_ops(實例:smdk_ops )
snd_soc_dai_link看名字就知(zhi)道,很明顯(xian)它是(shi)起(qi)耦合鏈(lian)接作(zuo)用(yong)的。它指(zhi)定了Platform、Codec、codec_dai、cpu_dai的名字,稍(shao)后Machine驅(qu)動(dong)將(jiang)會(hui)利用(yong)這(zhe)些名字去匹配(pei)已經在系統中注冊的platform,codec,dai。
snd_soc_ops連接Platform和Codec的(de)dai_link對應的(de)ops操(cao)作(zuo)函(han)數,本(ben)例就是smdk_ops,它只實現(xian)了hw_params函(han)數:smdk_hw_params。
到此為止(zhi),主要(yao)的部分machine的平臺設備注冊我(wo)們(men)完成了。

