1. 程式人生 > >Linux音訊ASoC架構驅動解析

Linux音訊ASoC架構驅動解析

http://emb.hqyj.com/Column/8592.html
時間:2018-09-29作者:華清遠見
近來對音訊晶片興趣頗濃,想在片選系統上實現音訊驅動,仔細研究發現,Linux核心系統(3.0)可以配置兩種音訊程式設計介面驅動,其驅動架構的組成如下:

  1. Linux OSS 音訊裝置驅動架構的組成:mixer 介面、dsp 介面及使用者空間程式設計方法。

  2. Linux ALSA 音訊裝置驅動架構的組成:card 和元件管理、PCM 裝置、control 介面、AC97 API(或者是其他音訊晶片API介面)及使用者空間程式設計方法。

1.ASoC的由來:

由於OSS音訊驅動架構是一個沒有完全開放原始碼的商業產品,而ALSA音訊驅動架構恰好彌補了這一空白。

ASoC–ALSA System on Chip (即ALSA在片選系統上的應用),是建立在標準ALSA驅動層上,為了更好地支援嵌入式處理器和移動裝置中的音訊Codec的一套軟體體系。在ASoc出現之前,核心對於SoC中的音訊已經有部分的支援,不過會有一些侷限性:

• Codec驅動與SoC CPU的底層耦合過於緊密,這種不理想會導致程式碼的重複,例如,僅是wm8731的驅動,當時Linux中有分別針對4個平臺的驅動程式碼。

• 音訊事件沒有標準的方法來通知使用者,例如耳機、麥克風的插拔和檢測,這些事件在移動裝置中是非常普通的,而且通常都需要特定於機器的程式碼進行重新對音訊路勁進行配置。

• 當進行播放或錄音時,驅動會讓整個codec處於上電狀態,這對於PC沒問題,但對於移動裝置來說,這意味著浪費大量的電量。同時也不支援通過改變過取樣頻率和偏置電流來達到省電的目的。

ASoC正是為了解決上述種種問題而提出的,目前已經被整合至核心的程式碼樹中:sound/soc。ASoC不能單獨存在,他只是建立在標準ALSA驅動上的一個它必須和標準的ALSA驅動框架相結合才能工作。

2.音訊裝置硬體介面

2.1 PCM 介面

  PCM也是一種4線制介面。與I2S非常相像,但支援一個更靈活的協議。它有位時鐘(BCLK)和同步時鐘(SYNC)用來在Tx和Rx在傳送和接收音訊資料是同步連線。位時鐘通常因取樣率的不同而不同,然而同步時鐘(SYNC)與取樣頻率相同。PCM同樣支援時分複用,可以幾個裝置同時使用匯流排(這有時被稱為network模式)。

2.2 IIS 介面

 I2S是一個4線數字音訊介面,常用於HiFi,STB便攜裝置。Tx  和Rx訊號線用於音訊傳輸。而位時鐘和左右時鐘(LRC)用於同步連結。I2S具有靈活性,因為控制器和解碼器都可以控制位時鐘和左右時鐘。位時鐘因取樣率和主系統時鐘而有不同。LRCLK與取樣率相同。少數裝置支援獨立的ADC和DAC的LRCLK。這使在不同取樣率情況下同步捕獲和回放成為可能。

2.3 AC97 介面

   AC97是一種個人電腦音效卡上常見的五線介面。現在在很多便攜裝置中也很流行。這個數字音訊介面有一個復位線,分時在SDATA_OUT(回放)和SDATA_IN(捕獲) 線上傳送資料。位時鐘常由解碼器驅動(通常是12.288MHz).幀時鐘(通常48kHz)總是由控制器驅動。每個AC97幀21uS,並分為13個時間槽。

2.4 音訊系統結構

     通常,就像軟體領域裡的抽象和重用一樣,嵌入式裝置的音訊系統可以被劃分為板載硬體(Machine)、Soc(Platform)、Codec三大部分,如下圖所示:
  1. 軟體架構

在軟體層面,ASoC也把嵌入式裝置的音訊系統同樣分為3大部分,Machine,Platform和Codec。

• Codec驅動 ASoC中的一個重要設計原則就是要求Codec驅動是平臺無關的,它包含了一些音訊的控制元件(Controls),音訊介面,DAMP(動態音訊電源管理)的定義和某些Codec IO功能。為了保證硬體無關性,任何特定於平臺和機器的程式碼都要移到Platform和Machine驅動中。所有的Codec驅動都要提供以下特性:

o Codec DAI 和 PCM的配置資訊;

o Codec的IO控制方式(I2C,SPI等);

o Mixer和其他的音訊控制元件;

o Codec的ALSA音訊操作介面;

也可以增加提供以下功能:

o DAPM描述資訊;

o DAPM事件處理程式;

o DAC數字靜音控制

• Platform驅動 它包含了該SoC平臺的音訊DMA和音訊介面的配置和控制(I2S,PCM,AC97等等);它也不能包含任何與板子或機器相關的程式碼。

• Machine驅動 Machine驅動負責處理機器特有的一些控制元件和音訊事件(例如,當播放音訊時,需要先行開啟一個放大器);單獨的Platform和Codec驅動是不能工作的,它必須由Machine驅動把它們結合在一起才能完成整個裝置的音訊處理工作。

  1. CLASS SOC

整個ASoC是由一些列struct組成,要搞清楚ASoC的工作機理,必須要理解這一系列struct之間的關係和作用,下面的關係圖展示了ASoC中重要的資料結構之間的關聯方式:

Kernel 3.0中的ASoC資料結構

通過snd_soc_card結構,又引出了Machine驅動的另外兩個個數據結構:

snd_soc_dai_link(例項:smdk_dai[] )

snd_soc_ops(例項:smdk_ops )

snd_soc_dai_link看名字就知道,很明顯它是起耦合連結作用的。它指定了Platform、Codec、codec_dai、cpu_dai的名字,稍後Machine驅動將會利用這些名字去匹配已經在系統中註冊的platform,codec,dai。

snd_soc_ops連線Platform和Codec的dai_link對應的ops操作函式,本例就是smdk_ops,它只實現了hw_params函式:smdk_hw_params。

到此為止,主要的部分machine的平臺設備註冊我們完成了。