Linux ASoC驅動歸納總結

2021-06-22 19:45:20 字數 4560 閱讀 2012

(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結構,用於指定測試某個給定描述符發的的...