日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 充電吧
[導讀]Alsa驅(qū)動分析GuideRevisionHistoryDateIssueDescriptionAuthorFirst draftWylhistory????目錄1.??? Abstract.. 32

Alsa驅(qū)動分析

Guide


RevisionHistory

Date

Issue

Description

Author

First draft

Wylhistory

?

?

?

?

目錄

1.??? Abstract.. 3

2.??? Introduction.. 3

3.??? 音頻驅(qū)動框架介紹.... 3

3.1????? 音頻設備的注冊... 3

3.2???? 音頻驅(qū)動的注冊... 4

3.2.1?????? Probe函數(shù)的調(diào)用... 4

3.2.2?????? Soc_probe函數(shù)... 4

4.??? 通常的使用流程的分析.... 6

4.1.1?????? open過程介紹... 6

4.1.2?????? snd_pcm_hw_params流程分析... 8

4.1.3?????? prepare流程分析... 9

4.1.4?????? write的流程... 15

4.1.5?????? 使用流程的總結(jié)t18

5.??? Amixer調(diào)用的相關邏輯.... 18

5.1.1?????? Amixer調(diào)用的上層邏輯... 19

5.1.2?????? Amixer的內(nèi)核流程... 20

6.??? 總結(jié).... 21

7.??? 未討論.... 21

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

1.??????????????Abstract

主要是講2.6.21內(nèi)核里面的alsa驅(qū)動的架構(gòu),以及在我們的平臺上需要注意的東西。.

2.??????????????Introduction

分成幾個部分:

驅(qū)動整體框架,一個簡單的播放流程介紹,以及我們的平臺需要注意的地方;

3.??????????????音頻驅(qū)動框架介紹 3.1??????????????音頻設備的注冊

這就是設備的注冊了,設備本身非常簡單,復雜的是這個設備的drvdata,drvdata里面包含了三部分,關于machine的,關于platform的,關于codec的,從大體上說machine主要是關于cpu這邊的也可以說是關于ssp本身設置的,而platform是關于平臺級別的,就是說這個平臺本身實現(xiàn)相關的,而codec就是與我們所用的音頻codec相關的;基本上這里就可以看出整個音頻驅(qū)動的架構(gòu)特點,就是從alsa層進入——>內(nèi)核alsa層接口->core層,這里再調(diào)用上面說的三個方面的函數(shù)來處理,先是cpu級別的,再是platform的,再是codec級別的,這幾層做完了,工作也就做得差不多了,后面會詳細講講,當然這個執(zhí)行順序不是固定的(不知道是不是marvel寫代碼不專業(yè)導致的),但多半都包括了這三部分的工作;

3.2???????????音頻驅(qū)動的注冊 3.2.1?????????Probe函數(shù)的調(diào)用??????

???????? ????????

?????????????????? 前面講了設備的注冊,里面的設備的名字就是”soc-audio”,而這里的driver的注冊時名字也是” soc-audio”,對于platform的設備匹配的原則是根據(jù)名字的,所以將會匹配成功,成功后就會執(zhí)行audio驅(qū)動提供的probe函數(shù)soc_probe;

3.2.2?????????Soc_probe函數(shù)

這個函數(shù)本身架構(gòu)很簡單,和前面說的邏輯一樣,先調(diào)用了cpu級別的probe,再是codec級別的,最后是platform的(這里三個的順序就不一樣),但是因為cpu級別的和platform級別的都為空,最后都調(diào)用了codec級別的probe函數(shù),也就是micco_soc_probe,這個函數(shù)基本上就完成了所有應該完成的音頻驅(qū)動的初始化了;簡單的劃分,分成兩部分,對上和對下:對上主要是注冊設備節(jié)點,以及這些設備節(jié)點對應的流的創(chuàng)建;對下主要是讀寫函數(shù)的設置,codec本身的dai設置,初始化寄存器的設置,最重要的就是后面的control的創(chuàng)建和門的創(chuàng)建了,如下圖所示:

這里面的第一部分就是負責初始化的;

?

第二部分就是創(chuàng)建卡和流,對于alsa驅(qū)動來說,是先分成卡0,卡1…,然后對于每一個卡的每一個cpu支持的dai(digit audio interface)也就是pcm接口或者i2S接口等都要建立對應的流,一個dai有可能包含兩個流,一個是錄的一個是play的,但在我們的平臺上對于i2S的dai是沒有錄音功能的,所以我們的平臺只有一個卡,三個流,pcm的錄和play,i2S的play;流的創(chuàng)建還是更多的考慮為上層服務的,它所提供的接口都是soc層的,這里非常重要的地方在于驅(qū)動的一個典型做法那就是如何把關鍵的內(nèi)核數(shù)據(jù)結(jié)構(gòu)和export到外部的/dev下的設備節(jié)點實現(xiàn)關聯(lián),比如:

?

關鍵數(shù)據(jù)結(jié)構(gòu)structsnd_pcm,是根據(jù)cpu所固有的dai創(chuàng)建的,而對于每一個struct ?snd_pcm又可能用到兩個substream(它們實現(xiàn)具體的流的播放等),它們之間的鏈接是通過它的內(nèi)部數(shù)據(jù)成員struct snd_pcm_str streams[2];來連接的,而這個snd_pcm類型的指針是在函數(shù)snd_device_new里面通過device_data放到設備里面的,這個設備會在snd_device_register_all

的時候注冊到/dev下面,并且調(diào)用dev_set_drvdata(preg->dev, private_data);來把這個指針放到設備的私有數(shù)據(jù)里面;而在需要使用的時候通過snd_pcm_playback_open里面的snd_lookup_minor_data函數(shù)取得其私有數(shù)據(jù)并返回的,這樣就實現(xiàn)了設備節(jié)點和對應的驅(qū)動的數(shù)據(jù)結(jié)構(gòu)的關聯(lián),這是一種非常普遍的做法;有了這個數(shù)據(jù)結(jié)構(gòu)它就可以根據(jù)一定的原則取得對應于這個需求的substream,于是一切的操作都可以交給這個substream了;

?

第三部分就是control的創(chuàng)建,這個函數(shù)比較簡單,就是把表micco_snd_controls里面已經(jīng)定義好的controls模板創(chuàng)建controls,然后加入到card的controls列表中去;本身功能很清晰,但是對于我們平臺來說,需要非常小心,因為這里決定了各個controls的序號,而這個序號是audio_controller訪問硬件的索引,所以千萬要小心盡量要維持目前的controls的序號,如果要額外添加新的controls一定要記得要放在micco_add_widgets后面來做,這樣可以做到兼容,否則audio_controller的工作量就大了!

?

第四部分就是門的創(chuàng)建了,這個函數(shù)也是很清楚,就是把codec對應的門都加入到codec->dapm_widgets列表中去(這里的門的概念可以簡單的理解為水管與水管之間的連接的地方,聲音數(shù)據(jù)像水一樣從水管里面流出來,源頭可以是CPU了,也可以是modem,然后通過不同的門,流向不同的地方,比如speaker,比如藍牙耳機等等),然后根據(jù)micco_audio_map把所有可能連在一起的門連接起來,這個表micco_audio_map的意思是{目的名字,控制點名字,源頭名字},然后函數(shù)snd_soc_dapm_connect_input會根據(jù)這些名字去查表codec->dapm_widgets(先前已經(jīng)把所有的門都加入了)找到它們再根據(jù)不同的類型做不同的連接,比如是mux之間的連接,mux和pga之間的連接等等,注意這里的連接其實只不過是說找到連接的可能性,它對于不同的門,找到其可能的source和sink,加入到對應的列表中去,具體細節(jié)如下:

首先,掃描整個codec所擁有的所有的門,如果它的名字和傳入的sink的名字相同,則認為它就是這個路徑的sink,如果它的名字和傳入的source名字相同,則認為它是這個路徑的source,如果源頭或者sink沒有找到都返回錯誤;然后分配一個struct snd_soc_dapm_path,這個數(shù)據(jù)結(jié)構(gòu)的主要成分包括名字,source門,sink門,這條路徑的control,這個源頭和sink是否已經(jīng)連接,是否已經(jīng)走過(用在后面),這個數(shù)據(jù)結(jié)構(gòu)會被掛在三個鏈表里面,一個是source的就是這個門會在很多的路徑中,把它在這個路徑中做source的path都連在一起,一個是sink的就是把這個門在所有這些由它做sink的path都連接在一起,一個是把所有的路徑都需要連接在一起的這個是通過codec的dapm_paths來訪問的;

list_add(&path->list,&codec->dapm_paths);

list_add(&path->list_sink,&wsink->sources);

list_add(&path->list_source,&wsource->sinks);

需要注意的時候,這里把路徑的list_sink加入到了wsink門的sources列表里面,而把路徑的list_source加入到wsource的sinks列表里面,所以當訪問的時候從wsink門的sources出發(fā)就可以找到連接這個門作為sink的所有的路徑,而從wsource的sinks列表出發(fā)就可以找到所有以這個門作為source的路徑;

第三步就是為這個數(shù)據(jù)結(jié)構(gòu)賦值:source,sink,初始化三個鏈表;第四步:如果control為空則把這個路徑加入到相應的三個鏈表中去,并且路徑設為已經(jīng)連接,并返回;第五步:否則,根據(jù)sink的類型,如果是adc,dac,input,output,micbias,vmid,pre,post,則把路徑加入到三個鏈表,設置已經(jīng)連接的標志;如果是snd_soc_dapm_mux則調(diào)用dapm_connect_mux來處理;如果是mixer和switch則調(diào)用dapm_connect_mixer來處理,如果是hp,mic,line,spk,則把path加入到三個鏈表中去,但是設置成為連接的狀態(tài)。

大約就是這樣的了。

也許您要問,為什么要這么做呢?

這個,我也有想過,甚至我認為在門比較少的時候,確實沒什么必要,但是這么做的好處在于當要播放音樂的時候,它可以實現(xiàn)自動的尋找路徑并且自動poweron那些門,不需要上層做任何的控制,因為它真的到達目的地的所有的路徑,這樣它可以自己選擇走哪條路;如果不這么連接起來的話,就需要提供給上層連接的接口,完全由上層來決定該連接哪些門,也必須由上層來負責poweron和off這些門;

第五部分就是注冊了,這里就是向/dev注冊設備節(jié)點,因為這些設備節(jié)點會由alsa層來訪問的,這些設備節(jié)點和驅(qū)動的連接我前面已經(jīng)說了,主要是提供了對上的alsa接口,給alsa層調(diào)用。??

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在本節(jié)中,我們將探究集成模式的數(shù)組,每個模式都是為了提供無縫集成解決方案而定制的。這些模式作為結(jié)構(gòu)化的框架,促進了不同系統(tǒng)之間的聯(lián)系和數(shù)據(jù)交換。它們大致分為三類:

關鍵字: 數(shù)據(jù)整合 數(shù)據(jù)結(jié)構(gòu)

學習C語言是程序員的入門教育,但是在學習過程中,常常會遇到一些常見的誤區(qū)。這些誤區(qū)可能會讓學習者的學習經(jīng)驗不佳,影響到他們掌握該語言的能力。

關鍵字: C語言 數(shù)據(jù)結(jié)構(gòu)

常用的數(shù)據(jù)結(jié)構(gòu)可根據(jù)數(shù)據(jù)訪問的特點分為線性結(jié)構(gòu)和非線性結(jié)構(gòu)。線性結(jié)構(gòu)包括常見的鏈表、棧、隊列等,非線性結(jié)構(gòu)包括樹、圖等。

關鍵字: 數(shù)據(jù)結(jié)構(gòu) 非線性結(jié)構(gòu)

堆(heap)和棧(stack)是在計算機中常用的兩種數(shù)據(jù)結(jié)構(gòu)。它們具有不同的特點和用途,對于程序員來說,了解堆和棧的區(qū)別是非常重要的。

關鍵字: 內(nèi)存 數(shù)據(jù)結(jié)構(gòu)

南京2022年10月27日 /美通社/ -- 10月18日,由南瑞集團主導編制的IEC國際標準《電動汽車充電漫游服務信息交互 第2部分:用例》(IEC 63119-2:2022)正式發(fā)布。該標準的發(fā)布是南瑞集團在國際電動...

關鍵字: 電動汽車充電 充電站 數(shù)據(jù)結(jié)構(gòu) 電動汽車電池

大家都聽說過紅黑樹,也都知道紅黑樹很厲害,是計算機里面評價非常高的數(shù)據(jù)結(jié)構(gòu)。但是每當想學習紅黑樹的時候,卻總是找不到通俗易懂很好理解的學習資料。很多書上上來就是紅黑樹的定義,然后就是紅黑樹的實現(xiàn),直接就把人給整暈了。光看...

關鍵字: 計算機 數(shù)據(jù)結(jié)構(gòu) 紅黑樹

(全球TMT2022年7月11日訊)7月7日,由徑碩科技(JINGdigital)主辦、MEC睿達會承辦的“萬數(shù)有靈·2022中國數(shù)字營銷創(chuàng)新增長峰會”在深圳舉行。作為一家營銷科技公司,徑碩科技提供的是一流的營銷軟件產(chǎn)...

關鍵字: CE DIGITAL 數(shù)字化 數(shù)據(jù)結(jié)構(gòu)

Redis為什么那么快?除了它是內(nèi)存數(shù)據(jù)庫,使得所有的操作都在內(nèi)存上進行之外,還有一個重要因素,它實現(xiàn)的數(shù)據(jù)結(jié)構(gòu),使得我們對數(shù)據(jù)進行增刪查改操作時,Redis能高效的處理。因此,這次我們就來好好聊一下Redis數(shù)據(jù)結(jié)構(gòu),...

關鍵字: 數(shù)據(jù)結(jié)構(gòu) REDIS 字符串 節(jié)點

哈嘍,大家好,我是瓜哥,致力于分享互聯(lián)網(wǎng)各領域干貨。前幾天,有人問瓜哥,學習編程語言有什么好的建議沒?今天簡單和大家分享幾點學習編程的建議,希望可以幫助到大家。1.只要開始,就不要怕晚瓜哥經(jīng)常看到這些問題,大四學編程還來...

關鍵字: 編程 代碼 基礎知識 數(shù)據(jù)結(jié)構(gòu)

模塊化是指解決一個復雜問題時自頂向下逐層把系統(tǒng)劃分成若干模塊的過程,有多種屬性,分別反映其內(nèi)部特性。

關鍵字: 模塊化 軟件模塊 數(shù)據(jù)結(jié)構(gòu)
關閉