




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Linux ALSA聲卡驅(qū)動開發(fā)最佳實踐本實踐是在Linux基礎培訓-驅(qū)動開發(fā)最佳實踐基礎上進彳亍的2013-7-19一、ALSA架構簡介二、最佳實踐的目標、冃的、方法三、具體步驟四、總結一、ALSA架構簡介二、最佳實踐的目標、冃的、方法三、具體步驟四、總結1.ALSA架構特點支持多種聲卡設備模塊化的內(nèi)核驅(qū)動程序支持SMP和多線程 提供應用程序開發(fā)庫兼容OSS應用程序開發(fā)一、必曲架構簡介/US濮枸簡介2013-7-19/US濮枸簡介ALSA AppALSAlibALSA App-APIPlugin (conversio n/rouiing etc)硬件訪問層I Linux KernelPCM
2、接口Midi 接口控制接口snd.seq 接 UALSA Kernel APIALSA Kernel Driver 聲卡描述對彖 $nd_cordsnd_cord.new()音頻設備組件展snd.devicesnddevice _n ew()Snd_.de vice_opsPCM snd_pcm sn d.pcmnewAC97中間從 snd_ac97_bus snd_ac97_bus() snd_ac9 7_b usopsMIDI sndjcwmidi sndowmidi_op5控制器snd kctl iocil音序器變件控制層(Ensl371)ensoniq1. ALSA是Advanced
3、Linux Sound Architecture,高 級Linux產(chǎn)音架構的簡稱,它在Linux操作系統(tǒng)上 提供 了音頻和MIDI ( Musical Instrument Digital Interface,音怎設備數(shù)字化接口)的支持。它 包含API庫和丄具、內(nèi)核驅(qū)動集合,對Linux 聲音進行支持。ALSA包含一系列內(nèi)核驅(qū)動對 不同的聲卡進行支持,還提供了 libasound的 API庫。用這些進行寫程序不需要打開設備等 操作,所以編程人員在寫程序的時候不會被底 層的東西困擾。2. ALSA自帶的應用程序是alsa-utilsL具包,包括 aplay、alsamixer等° ap
4、lay用于在ASLA上播放音 嘯。alsamixerJTl于改愛音頻信號的音量。3. alsa-lib是用戶空間的函數(shù)庫,提供了 libasound.so給應用程序使用,應用程序應包含 頭文件asoundlib.ho這個庫通過提供封裝函數(shù) (ALSA-API),使ALSA應用程序編寫起來更容易。 alsa-lib中有control, timer, dmix, pcm等,都 是以插件(plugin)的形式存在的。alsa-lib通過硬 件訪問層的系統(tǒng)調(diào)用與內(nèi)核層進行交互。4. alsa-driver是音頻設備的alsa內(nèi)核部分的驅(qū)動。 集成在內(nèi)核里而,大多是以模塊的方式存在。 可分為三層。(2)
5、最底層是硬件操控層,負責實現(xiàn)硬件操縱訪 問的功能,這也是聲卡驅(qū)動程序中用戶需實現(xiàn) 的主要部分;(2) 中間層是ASLA驅(qū)動的核心部分,它由各種功 能的音頻設備組件構成,為用戶提供了一些預 定義組件(如PCM、AC97、音序器和控制器 等),另外用戶也可以自行定義設備組件;(3) 驅(qū)動的最上層是聲卡對象描述層,它是聲卡 硬件的抽彖描述,內(nèi)核通過這些描述可以得知 該聲卡硬件的功能、設備組件和操作方法等。2013-7-19/US濮枸簡介這是另一個ASLA架構圖。與上一個圖大同小異。 從內(nèi)核driver層.lib層到應用層勾畫出了彼此 之間的關系。圖中左下角OSS相關部分是為了兼容OSS驅(qū)動模型 而存
6、在的。不是本實踐的相關部分。2013-7-19/US濮枸簡介/US濮枸簡介Application conforming to the ALSAAPI (aptay. arecord. mpbygj/sysass/sound/"Applicati ons conforming to 1he OSS API (rawplay, rawrec.i.X./(fev/sfid/dev/snd/LUser SpaceKernel Space2C/c/ev/snd/controtCO /(fev/snd/fHner/cf&v/dsp/cfev/adsp/dev/mixer/(fev/aud
7、toOSS Emulation Layer(snd pan oss.snd mixer ass)Kernel Space HardwareAudioAudioControllerCODEC左圖是從代碼的角度體現(xiàn) alsa-libfilalsa-driver/i hardware的交互關系。用戶層的alsa-lib通過操 作alsa-driver創(chuàng)建的設備文件/dev/snd/pcmC0D0p等對內(nèi)核層進行訪問°內(nèi) 核層的alsa-drivier驅(qū)動再經(jīng)ill sound core對硬 件聲卡芯片進行訪問。從而實現(xiàn)了 applB alsa-libm alsa-driverQ hardw
8、are的操作。圖中右上角OSS相關部分是為了兼容OSS驅(qū)動模型 而存在的。不是本實踐的相關部分。一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結2013-7-19二、鍛仕實疾的hardwareensl371同標、同的、方該在alsa的整體架構中,alsa-driverl%硬件操控層, 負責實現(xiàn)硬件操縱訪問,這也是聲卡驅(qū)動程序 中用戶需實現(xiàn)的主要部分。我們要實現(xiàn)的是針對特定聲卡芯片ensl371的控制 在這里把它叫做device-driverf設備驅(qū)動),alsa- driver的其它部分叫做alsa-driver(alsa驅(qū)動)。目標:S的.實現(xiàn)ensl371芯片的最小化
9、驅(qū)動。包括 insmod, re mod,以及 playback和stop的過程。亦 “S1371可以正常加載.卸載.播 放及停止。其他部分如錄音 (capture)等,不渚慮。L 口 J 方洱通過實現(xiàn)ensl371芯片的最小化驅(qū) 動代碼,理解ALSA架構的聲卡驅(qū) 爼軸iiiii站給 竹k心世爐拷啊理一、ALSA架構簡介二、最佳實踐的目標、冃的、方法具體步驟四、總結三、具俸步驟準備作。-使Balsa自帶的aplay工具或其它應用程序播放音頻,測試開發(fā)環(huán)境是否能夠正常播放音頻。如果不能播放,可以用alsamixer等工具查看音量是否被靜音了。總Z,如果正常環(huán)境如果都不能播放音頻,那我們后續(xù)的工作
10、也 就不能檢驗正確與否了。aplay工具shell中命令如F:# apt-get install alsa-utils 初次使用安裝alsa-utils I 具,以后直接執(zhí)彳亍下一步就可以了。# aplay /opt/test_fiIes/pcm.wav /aplay后面的文件路徑根據(jù)自己的實際情況填寫。 紅色文字表示shell中輸入的命令。alsamixer L具shell中命令如卜:# apt-get install alsa-utils 初次使用安裝alsa-utils I具,以后直接執(zhí)彳亍下一步就可以了。# alsamixeroalsamixer中,0、0方向鍵可以調(diào)整焦點,t、丨方向
11、鍵可以調(diào)整音量,esc鍵退岀。也可以用數(shù)字或+、鍵調(diào)整 音量。1! AlsaMixer ul.0.16 (Press Escape to qu it)Card: Ensoniq AudioFCIChip: Cirrus Logic CS4Z37A rev 3dB gain=60.00, E000Uieu: Flayback Capture Al 1 Item: PCMi+十_ _十+b十+ - - +!| l O jDJ;00:mmIMMISMMIsnriiIMM!IHM!I ”一=£=ii十三+十十+;100O10010BO1000<>00<>0bob0O0
12、0O0iMaster<PC44->LineCDMicMic BoosUideoPhone(2)檢查使用的PC的聲卡是否是ENS1371, shell中命令如下:# Ispci | grep "1371" ENS1371聲卡會顯示類似如下字樣2013-7-19 #02:02.0 Multimedia audio controller: Ensoniq ES1371 AudioPCI-97 (rev 02) 如果不是ENS1371,下文可作為參考根據(jù)自己的實際情況進行。1. 準備工作。(2)新建工作目錄如alsa-ensl371-dev-driver,在工作目錄中新
13、建文件ensl371-playback.Co制作makefile。新建文件Makefile。參照Linux基礎培訓驅(qū)動開發(fā)最佳實跳l.pptx第5頁編寫Makefile。 Makefile內(nèi)容如卜:ifneq ($(KERNELRELEASE),)obj-m := enS1371 -playback.。elseKBUILD := /lib/modules/'uname -r'/buildmodules:make -C $(KBUILD) M=$(shell pwd) modulesclean:rm -f *.o core depend .*.cmd *.ko *.mod.c *
14、.order *.symversrm -rf .tmp_versionsendif2. 查看內(nèi)核linux-source-2.6.26/sound/pci/ensl371.c的代碼,內(nèi)容如卜:#defineCHIP1371#include "ensl370.cz/即在定義宏CHIP1371的基礎上,使用ensl370.Co2013-7-193. 抽取ensl370.c (位 J linux-source-2.6.26/sound/pci)中Linux通用驅(qū)動程序核心,添加到ensl371-playback.c并 make,測試??梢韵忍砑涌蚣埽傧蚩蚣苤兄鸩教砑雍瘮?shù)??梢源蛴∵m當?shù)膌
15、og信息,不會影響ensl371的流程。 Linux通用驅(qū)動程序代碼如下:#define CHIP1371#in elude vlinu x/moduleparam.h> static int _init alsa_card_ens!37x_init(void)static void _exit alsa_card_ensl37x_exit(void) ""modulen it(alsa_card_ en sl37x_init) module_exit(alsa_card_e nsl37x_exit)4根據(jù)ensl370.c的代碼,向init和exit屮添加實現(xiàn)函數(shù)。
16、根據(jù)調(diào)用關系實現(xiàn)一個被調(diào)用函數(shù)的最小化定義(如下頁圖 屮的snd_audiopci_probe()lsnd_audiopci_remove(),以填充調(diào)用函數(shù),并將無關部分注釋掉,減輕代碼量。注意 注釋無吳部分時需要注意,有些不能確定有沒有用,可以先留著,另外,除了函數(shù)外,其他部分的最好用注釋,不 要直接刪除,以便在后而檢查是否刪除了有用的部分。定義最小化的函數(shù)后,代碼是可以編譯,并可以加載到內(nèi)核的,再逐步添寫被調(diào)用函數(shù),以此類推,直到所有 的調(diào)用關系全部被添加進代碼。如向init和exit屮添加實現(xiàn)函數(shù):2013-7-19#define CHIP1371# include <linux
17、/moduleparam.h>#in elude <linux/pci.h>#define ENS1371_DEBUGffifdef ENS1371_DEBUG#define FUNC_LOG() printk(KERN_ERR HFUNC_LOG: %d:%s()rV: _LINE_, _FUNCTION_) #endif=/* ES1370 */* ES1371 */* ES1373 -CT5880 */* Ectiva EV1938 #/#ifdef CHIP1370 0x1274, 0x5000, PCI_ANY_ID, PQ_ANY_ID, 0, 0, 0z , /
18、, ffendifffifdef CHIP1371 0x1274, 0x1371, PCI_ANY_ID, PQ_ANY_ID, 0, 0, 0f , 0x1274, 0x5880, PC1_ANY_ID, PQ_ANY_ID, 0, 0, 0, , 0x1102, 0x8938, PC1_ANY_ID, PQ_ANY_ID, 0, 0, 0 J ffendif(struct pci_dev 拿pci, const struct pci_devicejd *pcijd)FUNC_LOG(); return 0;(struct pci_dev *pci)FUNC_LOG(); name = DR
19、IVER-NAME/ .idjable = sndaudiopcijds, probe = snd_audiopci_probez remove = _devexit_p(s nd_audiopci_remove),# ifdef CONFIG_PM/.suspend = snd_e nsoniq suspend, .resume = sndensoniqresume, #endif static int _init alsa_card_ensl37x_init(void) FUNC_LOG();static void _exit alsa_card_ensl37x_exit(void) FU
20、NC_LOG();modulejnit(alsa_card_ensl37xnit) module_exit(alsa_card_ensl37x_exit)5. make insmod、rmmod 驅(qū)動模塊示例:(db55:/mnt/share/alsa-ensl371-dev-dr iuer# make |:Warning: File "Makef ile' has mod if icat ion time 1.3e+04 s in the f uture -C/1ibzmodules/'uname -r'zbuiId M=/mnt/share/alsa-en
21、sl371-dev-driver modu1make11: Enter ing directory 'zusr/src/1inux-saurce-Z.6.26*make21: Warning: File '/Mnt/xhare/alsa-ensl3?l-deu-dr iuer/Makef i Ye9 has mod if ic at ion time 1.3e+04 s in the futureCC MJ zmnt/share/alxa-ensl3?l-dev-driver/ens1371-playback mal<e2 : warning : Clock skew d
22、etected . Your build may be incomplete.Building modules, stage Z.makeCZl: Warning: File </rmit/share/alsa-ensl3?l-deu-dr iver/Makef ilef has modif ic at ion time 1.3e + 01 s in the f utureMODPOST 1 modulesCCi vet/巳 nsl3?l-p ley back mod, oLD Ml Zmnt/share/aIsa-ens1371-dev-driverZens1371-playbackk
23、oYour build may beincomplete.ClocksKeu detected/Lisr/src/ 1 inux-soLirce-Z .6 .Z6Clock skew detected-makeLZT: warning:maketl: Leaving directorymake: warning: Clock skew detected. Your build may be incomplete. db55:/mnt/share/alsa-ensl371-dev-dp iver#db55:zmnt/share/alsa-ensl371-dev-dr iver#db55 : /n
24、vnt/shQrE/alsa-EnslS'Zl.-dEv-dBivErtt lsmod ! grep uensl371,1snd ensl371cfameport snd_rawmid i snd_ac37_codec snd_pcmSlid& 0108Z8 18944 31396 64068 46648snd_ensl371snd_ensl371,snd_seq_mid isnd_ensl371snd_ensl371丿 snd_ac97_codecsnd_ensl371, snd_raLjmid i,snd_ac97_codecf snd_pcmj s三、具俸步驟Igrep
25、nensl371,13819.8935311 rUMC_LOG: 53:alsa_card_ensl37x_init()1 FUNC LOG: 30:snd au減iopci pfob匕()nd_seqf snd_t irniersnd_seq_deuice db55:zmnt/share/alxa-enx1371-deu-dr ivertt rrnmod snd_ensl371 clb55 : zmnt/share/alxa-enxl3?l-deudri ver It lsmod db55:zmnt/share/alsa-ensl3?ldeu"driverttl db55:zmnt
26、/share/alxa-enxl3?l-dev-driverft insmod ensl3?l-playback .kob55 :lsmod grep Heiisl371HTislS?!.卩 leubdck21440 b55 : /rrrnt/sha.rE/nl:SQ-Ensl3?l-dEv-di?ivEfit rmmcjd ens 1371-p layback3848.189611 FUNC_LOG: 59:alsa_card_ensl37x_exit()348.1337 FUNCLOG: 3b : snd etudiopc() db55:Zmnt/share/alsa-ensl371-de
27、v-dr iver#注意insmod ensl371-playback.ko前,要先卸載系統(tǒng)屮原有的ensl371模塊snd_ensl371o否則,在定義了DRIVER_NAME后,insmod時就會出錯。2013W 紅色是shell中輸入的命令,黃色是系統(tǒng)打印的信息,而綠色是我們的模塊打印的log。另外,驅(qū)動模塊的單步調(diào)試可以參照Linux基礎培訓驅(qū)動開發(fā)最佳實B-l.pptx。6. 仿照snd_audiopci_probe()H snd_audiopci_remove()的填充與alsa_card_ensl37x_init()和alsa_card_ensl37x_exit()類 似,如此一
28、級一級的填充下去,直室模塊可以播放出聲音。對于snd_audiopci_probe()這樣氏較氮朵的函藪,應一 行一行的添加,邊添加邊調(diào)試。如遇到變量等應該在前而函數(shù)中賦值帚述沒有實現(xiàn)的部分,可以先用if宏等方法暫 時注釋掉,如下頁代碼屮的紅色部分。添加的代碼如下:#define CHIP1371# include vlinu x/pci.h>#in elude vlinu x/moduleparam.h>#define ENS1371_DEBUG#ifdef ENS1371_DEBUGffdefine FUNC_LOG() printk(KERN_ERR HFUNC_LOG: %
29、d:%s()rV: _UNE_ _FUNCTION_) ffendif#define DRIVER_NAME "ENS1371"static struct pci_deviced snd audiopcids = X M0DULE_DEVICETABLE(pciz sndaudiopcijds);(struct ensoniq #ensoniq, int hasspdif, int hasjine)FUNC_LOG(); return(O);(struct ensoniq * ensoniq, int device, struct snd_pcm rpcm) FUNC_LO
30、G();return 0;(struct snd_card *card, struct pci_dev #pci, struct ensoniq * rensoniq)FUNC_LOG();return 0;三、具俸步驟三、具俸步驟6.代碼續(xù):static int _devinit snd_audiopci_probe(struct pci_dev *pci# const struct pci_devicejd *pcijd)FUNC_LOG();#ifdef ENS1371_RESERVEDstatic void _devexit snd_audiopci_remove(struct pci
31、_dev *pci) FUNC_LOG();static struct pci_driver driver = .name = DRIVER_NAME/ .idtable = sndaudiopcijds, .probe = snd_audiopci_prob© .remove = _devexit_p(snd_audiopci_remove)z #ifdef CONFIG_PM/.suspend = sn d_ensoniq_suspe nd,/.resume = snden son iq_resumez ffendifstatic int _init alsa_card_ensl37xjnit(void) FUNC_LOG();return
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 牛津譯林版七年級英語上冊教學計劃(含進度表)
- 2025年黨章黨史國史國情知識競賽題庫及答案(共220題)
- 新型家庭醫(yī)生簽約服務對促進轄區(qū)孕產(chǎn)婦管理的效果分析
- 《單片機技術應用》 課件
- 節(jié)能環(huán)保居間服務合同范例
- 道路交通規(guī)劃方案介紹
- 低空經(jīng)濟行業(yè)報告
- 醫(yī)院裝修大包合同參考范本
- 投資可行性分析報告包括哪些內(nèi)容
- 低空經(jīng)濟涉及的行業(yè)
- XX藥業(yè)公司受試者日記卡
- 多組學數(shù)據(jù)的整合與分析
- 小學安全教育《平安校園 拒絕欺凌》劉偉【省級】優(yōu)質(zhì)課
- 靜脈輸液的不良反應及處理原則考核試題及答案
- 水利設施維護投標方案(技術標)
- 《建筑概論》期末考試試卷附答案
- 大數(shù)據(jù)導論(通識課版)-第3章-大數(shù)據(jù)技術(2020年春季學期)
- 中國銀行供應鏈融資
- 淺談幾何畫板在一次函數(shù)教學中的應用 論文
- 舊設備安全拆除施工方案范本
- 居住區(qū)規(guī)劃設計案例分析1535793655
評論
0/150
提交評論