1. 程式人生 > >Linux-ASoC驅動歸納總結

Linux-ASoC驅動歸納總結

原文連結:http://blog.csdn.net/sunruichen/article/details/8568273
Linux-ASoC驅動歸納總結:

(1)CODEC驅動:由核心原始碼sound/soc/codecs/uda134x.c實現,功能如下:

A: snd_soc_codec 結構體是對CODEC本身I/O控制以及動態音訊電源管理(Dynamic Audio Power Management,DAPM)的描述。它描述I2C、SPI或AC’97如何讀寫CODEC暫存器並容納DAPM連結串列,核心成員為read()、write()、hw_write()、hw_read()、dapm_widgets、dapm_paths等。

B: CODEC DAI(Digital Audio Interfaces)和配置PCM,由結構體snd_soc_dai來描述,形容playback、capture的屬性以及DAI介面的操作。

C: 描述CODEC的時鐘、PLL以及各式設定,主要包括set_sysclk()、set_pll()、set_clkdiv()、set_fmt()等成員函式。

 D:巨集來描述CODEC的mixer控制,這組巨集可以方便地將mixer名和對應的暫存器進行繫結

(2)平臺驅動:由核心原始碼sound/soc/s3c24xx/s3c24xx-i2s.c實現CPU端的DAI驅動,由sound/soc/s3c24xx/s3c24xx_pcm.c實現CPU端的DMA驅動

首先,在ASoC平臺驅動部分,同樣存在著CODEC驅動中的snd_soc_dai、snd_soc_dai_ops、snd_soc_ops(這個結構體在linux2.6.32.2中已經交給snd_soc_dai_ops結構體來描述)這3個結構體的例項用於描述DAI和DAI上操作,不過不同的是,在平臺驅動中,它們只描述CPU相關的部分而不描述CODEC。除此之外,在ASoC平臺驅動中,必須實現完整的DMA驅動,即傳統ALSA的snd_pcm_ops結構體成員函式trigger()、pointer()等。因此ASoC平臺驅動通常由DAI和DMA兩部分組成:

snd_soc_dai、snd_soc_dai_ops、snd_soc_ops這3個結構體和在CODEC驅動中一樣,只是在這裡只描述CPU相關的部分,對CPU中設計到的暫存器進行設定;

(3)板驅動:由核心原始碼sound/soc/s3c24xx/s3c24xx_uda134x.c實現,它將第一部分和第二部分進行繫結。這個繫結用資料結構snd_soc_dai_link描述.

(4) 在以上三部分之上的是ASoC核心層,由核心原始碼中的sound/soc/soc-core.c實現,檢視其原始碼發現它完全是一個傳統的ALSA驅動。

ASoC被分為Machine(link),Platfor(cpu)m和Codec三大部件,Platform驅動的主要作用是完成音訊資料的管理,最終通過CPU的數字音訊介面(DAI)把音訊資料傳送給Codec進行處理,最終由Codec輸出驅動耳機或者是喇叭的音信訊號。

machine檔案的名字一般是platform_codec這樣的形式,它主要用來連線platform和codec,缺少了它的platform和codec是工作不了的。

ASoC有把Platform(CPU)驅動分為兩個部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver負責管理音訊資料,把音訊資料通過dma或其他操作傳送至cpu dai中,dai_driver則主要完成cpu一側的dai的引數配置,同時也會通過一定的途徑把必要的dma等引數與snd_soc_platform_driver進行互動。

Codec驅動的程式碼要做到平臺無關性,要使得Machine(link)驅動能夠使用該Codec,Codec驅動的首要任務就是確定snd_soc_codec和snd_soc_dai的例項,並把它們註冊到系統中,註冊後的codec和dai才能為Machine驅動所用。

上面為sound的執行時序圖(非常重要) 另外,在linux3.0中將platform(link)改為snd_soc_card這個資料結構。

從上面來看,音訊完全和上節所講的SD卡的驅動架構(card-core-host)一樣,也是linux通用的驅動架構分層方式,四層:

第一層:core層只關心軟體功能實現,不考慮CPU 和具體的外設,為最上層.

第二層:CPU層由各平臺廠商提供程式碼.

第三層:cpu和外設適配層.

第四層:具體的外設驅動,由外設廠家提供程式碼.

(Android的分層完全借簽了linux的分層架構).

Linux3.0音效卡程式碼層次架構

理解了上述原理,不管的是USB晶片,還是ac97等等其它晶片,原理都是一樣的,core不變,cpu針對不同型別的外設有處理,不同外設驅動由廠家提供,再加不同的link層來連結cpu和外設. 無論哪個平臺何種外設驅動都是一樣的,不同的可能由於特別簡單的驅動,可能會將core之下的三層合二為一,或合三為一.

音效卡驅動到此為至,網上有個系列音效卡文章《Linux ALSA音效卡驅動》共八篇寫得很詳細,建議做音訊驅動的一定要看一下。網址:http://blog.csdn.NET/droidphone/article/details/6271122

綜上所述,所有做linux開發移植的,第一件事,就是要確定分層架構,規劃好每層的程式碼放在哪裡,已有的程式碼是哪些,針對自已的cpu和外設(以及特有的軟體功能core),需要新增的程式碼有哪些。