(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 inte***ces
)和配置
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
音效卡驅動之
*>
共八篇寫得很詳細,建議做音訊驅動的一定要看一下。**:
綜上所述,所有做
linux
開發移植的,第一件事,就是要確定分層架構,規劃好每層的**放在**,已有的**是哪些,針對自已的
cpu和外設
(以及特有的軟體功能
core)
,需要新增的**有哪些。
linux裝置驅動歸納總結
diytvgy的日誌 前言 我的總結是根據學習時的筆記 李楊老師授課 linux核心設計與實現 第三版 linux裝置驅動程式 第三版和 linux裝置驅動開發詳解 第一版來歸納的。1.1 linux裝置驅動的作用 1.2 核心 樹介紹 1.3 核心補丁 1.4 核心中的makefile 1.5 子...
Select歸納總結
include include int select int maxfdpl,fd set readset,fd set write,fd set exceptset,const struct timeval timeout 返回值 該函式的返回值表示跨所有描述符集的已就緒的總位數。如果在任何描述符...
Poll歸納總結
include int poll struct pollfd fd,nfds t nfds,int timeout 返回 若有就緒操作符則為其數目。若超時則為0。若 出錯則為 1。第乙個引數是指向乙個結構陣列第乙個陣列元素的指標,每個陣列元素都是乙個pollfd結構,用於指定測試某個給定描述符發的的...