Linux_ALSA聲卡驅動開發(fā)實踐_第1頁
Linux_ALSA聲卡驅動開發(fā)實踐_第2頁
Linux_ALSA聲卡驅動開發(fā)實踐_第3頁
Linux_ALSA聲卡驅動開發(fā)實踐_第4頁
Linux_ALSA聲卡驅動開發(fā)實踐_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Linux ALSA聲卡驅動開發(fā)最佳實踐木實踐是在Linux基礎培訓-驅動開發(fā)最佳實踐基礎上進行的一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結2020/6/32020/6/31.ALSA架構特點支持多種聲卡設備模塊化的內(nèi)核驅動程序支持SMP和多線程提供應用程序開發(fā)庫兼容OSS應用程序開發(fā)必架枸簡介AL5A AppALSA lib11111ALSAApp-API11111111Piugin(conve<$ionzrouting etc)111111111硬件訪問層1111. ALSA是Advan

2、ced Linux Sound Architecture- 島級Linux聲音架構的簡稱,它在Li n ux操作系 統(tǒng)上提供了音頻和MIDI (Musical Instrument Digital Interface-音樂設備數(shù)字化接口的 支持。它包含API庫和丄:具、內(nèi)核驅動集合. 對Linux聲音進行支持。ALSA包含一系列內(nèi) 核驅動對不同的聲卡進行支持.還提供了 libasound的API庫。用這些進行寫程序不需 婆打開設備等操作,所以編程人員在寫程序的時候不會被底層的東西困擾。lbw KernelPCM 檢口Midi 接口徑制接LIALSA Kernel Driver 走卡描述対菽 s

3、nd.cardALSA Kernel API$nd_cord.new(|音妬設備組杵尺snd.device snd device_new() Snd device opsPCM sndpcm snd-pcm.newAC97中間從 5nd_ac97_bus snd ac97 bus() snd_ac97_busopsMIDIsnd _rawmldl snd _rawmidLcp5控制器 snd_kc1IJocfl破件短劃層(EF137I)sndeqgq晉序話ensoniq2020/6/32. ALSA自帶的應用程序是alsa-utils E具包,包 括aplay、alsamixero aplay

4、用于在ASLA上播 放音頻。alsamixerHi于改變音頻信號的音雖。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. alsadriver是音頻設備的alsa內(nèi)核部分的驅動。 集成在內(nèi)核里面.大女是以模塊的方式存在。 可分為三層。(1) 最底層是硬

5、件操控層,負責實現(xiàn)碩件操縱 訪問的功能,這也是聲卡驅動程序中用戶需 實現(xiàn)的主要部分:(2) 中間層是ASLA驅動的核心部分.它由各種 功能的音頻設備組件構成.為用戶提供了一 些傾定義組件(如PCM、AC97.音序器和控 制器等),另外用戶也可以自行定義設備組 件:(3) 驅動的最上層是聲卡對象描述層,它是聲 卡喚件的抽空描述,內(nèi)核通過這些描述可以 得知該聲卡喚件的功能,設備組件和操作方 法等。這是另一個ASLA架構圖。與上一個圖大同小界。 從內(nèi)孩driver層、lib層到應用層勾畫出了彼 此之間的關系。圖中左下角OSS相關部分是為了兼容OSS驅動模 型而存在的。不是木實踐的相關部分。圖中右上角

6、OSS相關部分是為了兼容OSS驅動模 型而存在的。不是木實踐的相關部分。左圖是從代碼的角度體現(xiàn)J alsa-libfllalsa-driver 及hardware的交互關系c用戶層的alsa-lib通 過操作alsadriver創(chuàng)建的設備文件 /dev/snd/pcmCODOp等對內(nèi)核層進行訪問。 內(nèi)核層的alsa-drivier驅動再經(jīng)由sound core 對鎖件聲卡芯片進行訪問。從而實現(xiàn)了 app alsa-lib alsa-driver hardware 的操作。一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結2020/6/3Ml二、最他實醫(yī)的同標、一誦的、方倣在

7、alsa的整體架構中,alsadriver的鎖件操控層, 負責實現(xiàn)碩件操縱訪問.這也是聲卡驅動程 序中用戶需實現(xiàn)的主要部分。我們要實現(xiàn)的是針對特定聲卡芯片ensl371的控 制在這里把它叫做device-driver(設備驅動), alsa-driver 的其它部分叫做 alsa-driver(alsa% 動)。目標: H的.實現(xiàn)ensl371芯片的最小化驅動。包括insmod, remod,以及 playback和stop的過程缶 Qnsl3”可以正常加載、卸裁、 播放及停止。其他部分如錄音 (capture),不考慮。通過實現(xiàn)ensl371芯片的最小化 驅動代碼.理解ALSA架構的聲202

8、0/6/32020/6/3一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結準備工作o/使命alsa口帶的aplayl:具或其它應用程序播放音頻,測試開發(fā)環(huán)境是否能夠正常播放音頻。如果不能播放,話 以用alsamixer等工具査看音量是否被靜音了??傊?,如果正常環(huán)境如果都不能播放音頻,那我們后續(xù)的匸作也就不 J 能檢驗正確與否了。aplay工具shell中命令如下:# apt-get install alsa-utils 初次使用安裝alsa-utils工具,以后直接執(zhí)行下一步就可以了。# aplay /opt/testjiles/pcm.wav /aplay后而的文件路徑

9、根據(jù)口己的實際情況填寫。紅色文字表示shell中輸入的命令。alsamixer工具shell中命令如下:# apt-get install alsa-utils 初次使用安裝alsa-utils工具,以后直接執(zhí)行下一步就可以了。# alsamixer。alsamixe沖,、 方向鍵可以調(diào)整焦點,t . I方向鍵可以調(diào)整音量,esc鍵退出。也可以用數(shù)字或+、鍵調(diào)整音量。2020/6/3MrEnsoniq AudioPCICirrus Logic CS4297A rev 3 Playback Capture Al 1 PCM IdB gain=60 80. f>B8BJ1100:;10AO1

10、A0 100O10RIMas七ur < PCMIMMIfiOA MicIMMIBOBUidroIMMIMic BoosIMMIrf 0O00<>ALineCD(2) # Ispci |grep"13/r ENS1371聲卡會顯示類似如下字樣#02:02.0 Multimedia audio controller: Ensoniq ES1371 AudioPCI-97 (rev 02) 如果不是ENS1371,下文可作為參考根據(jù)口己的實際情況進行。:i會0<>0 Phone1 準備匸作。(2)新建匸作目錄如alsa-ensl371-dev-driver,在

11、匸作目錄中新建文件ensl371-playback.Co(3)制作makefile。新建文件Makefile。參照Linux基礎培訓驅動開發(fā)最佳實艇:l.pptx第5頁編寫Makefile。 Makefile內(nèi)容如下:ifneq ($(KERNELRELEASE)Jobj-m := ensl371 -playback.。elseKBUILD := /lib/modules/'uname -r'/buildmodules:make -C $(KBUILD) M=$(shell pwd) modulesclean:rm f *.ocore depend *.cmd *.ko *.m

12、od.c *.order *.symversrm -rf .tmp_versionsendif2.查看內(nèi)核linux-source-2.6.26/sound/pci/ensl371.c的代碼,內(nèi)容如下:/define CHIP1371 /include ,ensl370.c/3.抽取ensl370.c (位 J* linux-source-2.6.26/sound/pci)中Linux通用驅動程序核心,添加到ensl371-playback.c中并make, 測試??梢韵忍砑涌蚣埽傧蚩蚣苤兄鸩教砑雍瘮?shù)??梢源蛴∵m當?shù)膌og信息,不會影響ensl371的流程。Linux通用驅動 程序代碼如下:

13、#define CHIP1371#in elude <linux/moduleparam.h>static int _init alsa_card_e nsl37x_init(void) _ _ static void _exit alsa_card_ensl37x_exit(void) _ _ "modulej nit(alsa_card_en sl37xjnit)module_exit(alsa_card_e nsl37x_exit)4根據(jù)ensl370.c的代碼,向init和exit中添加實現(xiàn)函數(shù)。根據(jù)調(diào)用關系實現(xiàn)一個被調(diào)用函數(shù)的最小化定義(如下頁圖中的 snd_a

14、udiopci_probe(snd_audiopci_remove(),以填充調(diào)用函數(shù),并將無關部分注釋掉,減輕代碼量。注意注釋無關 部呑時需耍壓意,有些不能確定有獨有用,可以先留著,另外,除了函數(shù)外,其他部分的最好用注釋,不耍直接刪除, 以便在后面檢查是否刪除了有用的部分。定義最小化的函數(shù)后,代碼是可以編譯,并可以加載到內(nèi)核的,再逐步添寫被調(diào)用函數(shù),以此類推,直到所有的調(diào) 用關系全部被添加進代碼。如向init和exit中添加實現(xiàn)函數(shù):define CHIP1371秤 in elude <linux/moduleparam.h>徉 in elude <linux/pci.h&

15、gt;襯define ENS1371_DEBUGffifdef ENS1371_DEBUGdefine FUNC_LOG() printk(KERN_ERR ”FUNC_LOG: (%d:(%s()n"z _LINE_, _FUNCTION_) Wencfif»dene DRIVERNAME "ENS137r=/ ES1370 / ES1371 / ES1373 CT588O / Ectiva EV1938 4/fflfdef CHIP1370 0X1274, 0X5000, PCI.ANYJD, PCI.ANYJD, 0r 0, 0 J/ffendrf#ifde

16、f CHIP1371 0X1274, 0X1371, PCI_ANYD, PCI_ANYJDr 0r 0z 0, r 0X1274, 0X5880, PCI.ANYJD, PCI.ANYJD, 0, 0, 0, , 0X1102, 0X8938, PCI-ANYD, PCLANYJD, 0r 0, 0,r ffendif0J;(struct pcidev *pciz const struct pci_deyiced *pcijd)FUNC_LOG(hreturn 0;(struct pcidev 4 pci) FUNC_LOG();.name = DRIVER_NAME,.datable =

17、snd_audiopcids,.probe = snd_audiopci_prober.remove = _devexitptsndaudiopciremove), #ifdef CONFIG_PM/.suspend = snd ensoniqsuspend,/.resume = sndensoniqresume,#endif;FUNC_LOG();static int _init alsa_card_ensl37xjnitvo»d)static void _exrt alsa card ensl37x exitvoid> FUNC.LOGO; po_unreg»st

18、er_dnver &d”vetj;r modulQ_init(aka_cad_Gns237)c_init)modulQ_exit(a1sa-Card-Qns237X-Gxit)5.make、insmod、rmmod 驅動模塊示例:lb55:/mnt/share/alsa-ensl3?l-dev-dr iuertt makenake: Warn ing: File 'Makef ile" has modif ication time 1,3e+04 s in th巳 future nake -C /Iib/modules/ uname -r'/buiId M=/

19、mnt/share/alsa-ensl371-dev-driuer modu1 ms naked: Ent ering d irectory '/usr/src/1 inux-source-2 6 26J nakeLZJ: Warning: File '/mnt/share/alsa-ensl371-dev-dr iuer/Hakef ile* has modific it ion time 1.3e+W4 s in the futureCC MJ /mnt/share/alsa-ensl371-dev-driver/ens1371-playback o nakeLZJ: wa

20、rning: Clock skew detected Your build may be incompleteBuilding modules, stage Z nakeLZ: Warning: File '/mnt/share/alsa-ensl371-dev-dr iuer/Makef i1巳'has modific it ion time 1.3e+84 s in the futureMODFOST 1 roudulesCC/nnitz/shcuD/dlsd-DiisJL3?:l-dDV-dFiuDr/tni$1.371.-pldubcii:k mud . uLD MJ

21、zmnt/sharc/a lsa-ensl371-dev-di%i verzcnsl371-p layback kunakc Z :warn ing: Cluckdetected. Yuux- build mayEcinuump 1 u t u nakc Lil: Leaving directory 1 Zusr/src/ 1 inux-suurcc-Z Ci 26J nakc: warn ing: lb55:/mntzsharczaIsalb55:/mntzsharczaIsa lb55:/mntzsharczaIsaC lock skew detcctcd ?our build may b

22、e incomplete dev dr iverttdev-dr iver#cnsl3?lensl371dev "ivertt lsmod ! grep °cnsl371u192360snd_ensl371snd_ensl371/snd_seq_mid isnd_ensl371snd_ensl371 ,snd_ac97_codec snd_ens?l371i » snd_ac97_codec ,snd_pcm, s grep21440nsl371._plaijbackb55:/mnt/share/alsa-ensl3?l-dev-driuer# rmmod ens

23、l371-playback 3848.189611 FUNC.LOG : 59 : alsa_card 藥 sl37xxit () 3848.189839 FUNCLOG: 36:Jsnd.audiopci.remoue()b55:/mnt/share/alsa-ensl37L-deu-dr iver#注意insmod ensl371-playback.ko前,耍先卸載系統(tǒng)中原有的ensl371模塊snd_ensl371o否則,在定義了DRIVER_NAME后,insmod時就會出錯。2020/OT中,五色是shell中輸入的命令,黃色是系統(tǒng)打印的信息,而綠色是我們的模塊打印的log。 5&q

24、uot; 另外,驅動模塊的單步調(diào)試川以參照紅kn祕蠟訕2)驅動開發(fā)最佳實踐lpptx。6.仿照snd_audiopci_probe()和 snd_audiopci_remove()的填充與alsa_card_ensl37xjnit()和alsa_card_ensl37x_exit()類似, 如此一級乜的填竟下去,直至模玫可以播政出聲音。對TsnddiocLprobe(j這樣比較套雜石函數(shù),窶一行一行的 添加,邊添加邊調(diào)試。如遇到變量等應該在前面函數(shù)中賦值而還後有實現(xiàn)了勺部分,可以先用if宏等方法暫時注釋掉,如 下頁代碼中的紅色部分。添加的代碼如下:define CHIP1371 include

25、 <linux/pci.h>include <linux/moduleparam.h>禪define ENS1371.DEBUG#ifdef ENS1371_DEBUGffdefme FUNC_LOG() printkjKERNERR ”FUNC_LO<3: (%d:(%s()n"z _UNE_, _FUNCTION_) ffendif襯define DRIVER_NAME *ENS1371*static struct pci_dQvice_id sndaudiopcijdsf = ;MODULE_DEVICE-TABLE(pci, snd_audiop

26、cijds);J(struct ensoniq *ensoniqf int has_spdifr int hasjine)IFUNC-LOG();return(O|;J(struct ensoniq ensoniq, int device, struct snd_pcm rpcm)FUNC.LOGU;return 0;(struct snd_card *cardr struct pci_dev 4pci, struct ensoniq rensoniq)FUNC_LOG(|; return 0;6仝碼續(xù):static int _devinit snd_audiopci_probe(struct

27、 pci_dev pci, const struct pci_devicejdstruct sndcard 4cardr struct ensoniq *ensoniq; int err, pcm_devs(2;FUNC_LOGU;return -ENOENT;/#endrf/#ifdef CHIP1371v). line>odev»<0Hif | (err = sndensoniqUTlmixerlensoniq snd_card_free(card) return err;return err;/ if (err = sndensomqpcmatensonlq, X,

28、 NULL) <0) sndcardfreelcard);return err;if |(err = 5nd.en$omq_midl(en$oniq, 0. NULL) < 0)( snd_card_free(card); return err;ffifdef ENS1371_RESERVEDffendif static void _devexit snd_audiopci_remove(struct pci_dev *pci) FUNC_LOG();static struct pa_driver driver = .name = DRIVER-NAM® ,id_table = snd_audiopci_idsz .probe = snd_audiopci _prober .remove = _devexitptsndaudiopcLremove), ffifdef CONFIG.PM/.suspend = snd _ensoniq_suspe nd,/.resume = snd_ensoniq_resumez ffendif static mt _init alsa card_ensl37x init(void) FUNC_LOG();retu m pci_register_driver(&d rive r); static vo

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論