




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
.,1,LinuxALSA聲卡驅動開發(fā)最佳實踐,本實踐是在Linux基礎培訓(2)-驅動開發(fā)最佳實踐基礎上進行的,.,2,目錄,一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結,.,3,目錄,一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結,.,4,一、ALSA架構簡介,ALSA架構特點,支持多種聲卡設備模塊化的內(nèi)核驅動程序支持SMP和多線程提供應用程序開發(fā)庫兼容OSS應用程序開發(fā),.,5,一、ALSA架構簡介,ALSA是AdvancedLinuxSoundArchitecture,高級Linux聲音架構的簡稱,它在Linux操作系統(tǒng)上提供了音頻和MIDI(MusicalInstrumentDigitalInterface,音樂設備數(shù)字化接口)的支持。它包含API庫和工具、內(nèi)核驅動集合,對Linux聲音進行支持。ALSA包含一系列內(nèi)核驅動對不同的聲卡進行支持,還提供了libasound的API庫。用這些進行寫程序不需要打開設備等操作,所以編程人員在寫程序的時候不會被底層的東西困擾。ALSA自帶的應用程序是alsa-utils工具包,包括aplay、alsamixer等。aplay用于在ASLA上播放音頻。alsamixer用于改變音頻信號的音量。alsa-lib是用戶空間的函數(shù)庫,提供了libasound.so給應用程序使用,應用程序應包含頭文件asoundlib.h。這個庫通過提供封裝函數(shù)(ALSA-API),使ALSA應用程序編寫起來更容易。alsa-lib中有control,timer,dmix,pcm等,都是以插件(plugin)的形式存在的。alsa-lib通過硬件訪問層的系統(tǒng)調用與內(nèi)核層進行交互。alsa-driver是音頻設備的alsa內(nèi)核部分的驅動。集成在內(nèi)核里面,大多是以模塊的方式存在??煞譃槿龑印?1)最底層是硬件操控層,負責實現(xiàn)硬件操縱訪問的功能,這也是聲卡驅動程序中用戶需實現(xiàn)的主要部分;(2)中間層是ASLA驅動的核心部分,它由各種功能的音頻設備組件構成,為用戶提供了一些預定義組件(如PCM、AC97、音序器和控制器等),另外用戶也可以自行定義設備組件;(3)驅動的最上層是聲卡對象描述層,它是聲卡硬件的抽象描述,內(nèi)核通過這些描述可以得知該聲卡硬件的功能、設備組件和操作方法等。,.,6,一、ALSA架構簡介,這是另一個ASLA架構圖。與上一個圖大同小異。從內(nèi)核driver層、lib層到應用層勾畫出了彼此之間的關系。圖中左下角OSS相關部分是為了兼容OSS驅動模型而存在的。不是本實踐的相關部分。,.,7,一、ALSA架構簡介,左圖是從代碼的角度體現(xiàn)了alsa-lib和alsa-driver及hardware的交互關系。用戶層的alsa-lib通過操作alsa-driver創(chuàng)建的設備文件/dev/snd/pcmC0D0p等對內(nèi)核層進行訪問。內(nèi)核層的alsa-drivier驅動再經(jīng)由soundcore對硬件聲卡芯片進行訪問。從而實現(xiàn)了appalsa-libalsa-driverhardware的操作。圖中右上角OSS相關部分是為了兼容OSS驅動模型而存在的。不是本實踐的相關部分。,.,8,目錄,一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結,.,9,二、最佳實踐的目標、目的、方法,在alsa的整體架構中,alsa-driver的硬件操控層,負責實現(xiàn)硬件操縱訪問,這也是聲卡驅動程序中用戶需實現(xiàn)的主要部分。我們要實現(xiàn)的是針對特定聲卡芯片ens1371的控制在這里把它叫做device-driver(設備驅動),alsa-driver的其它部分叫做alsa-driver(alsa驅動)。,.,10,目錄,一、ALSA架構簡介二、最佳實踐的目標、目的、方法三、具體步驟四、總結,.,11,三、具體步驟,1.準備工作。(1)使用alsa自帶的aplay工具或其它應用程序播放音頻,測試開發(fā)環(huán)境是否能夠正常播放音頻。如果不能播放,可以用alsamixer等工具查看音量是否被靜音了??傊绻-h(huán)境如果都不能播放音頻,那我們后續(xù)的工作也就不能檢驗正確與否了。aplay工具shell中命令如下:#apt-getinstallalsa-utils/初次使用安裝alsa-utils工具,以后直接執(zhí)行下一步就可以了。#aplay/opt/test_files/pcm.wav/aplay后面的文件路徑根據(jù)自己的實際情況填寫。紅色文字表示shell中輸入的命令。alsamixer工具shell中命令如下:#apt-getinstallalsa-utils/初次使用安裝alsa-utils工具,以后直接執(zhí)行下一步就可以了。#alsamixer。alsamixer中,、方向鍵可以調整焦點,、方向鍵可以調整音量,esc鍵退出。也可以用數(shù)字或+、-鍵調整音量。(2)檢查使用的PC的聲卡是否是ENS1371,shell中命令如下:#lspci|grep“1371”ENS1371聲卡會顯示類似如下字樣#02:02.0Multimediaaudiocontroller:EnsoniqES1371AudioPCI-97(rev02)如果不是ENS1371,下文可作為參考根據(jù)自己的實際情況進行。,.,12,三、具體步驟,1.準備工作。(2)新建工作目錄如alsa-ens1371-dev-driver,在工作目錄中新建文件ens1371-playback.c。(3)制作makefile。新建文件Makefile。參照Linux基礎培訓(2)-驅動開發(fā)最佳實踐-1.pptx第5頁編寫Makefile。Makefile內(nèi)容如下:2.查看內(nèi)核linux-source-2.6.26/sound/pci/ens1371.c的代碼,內(nèi)容如下:即在定義宏CHIP1371的基礎上,使用ens1370.c。,ifneq($(KERNELRELEASE),)obj-m:=ens1371-playback.oelseKBUILD:=/lib/modules/uname-r/buildmodules:make-C$(KBUILD)M=$(shellpwd)modulesclean:rm-f*.o*core.depend.*.cmd*.ko*.mod.c*.order*.symversrm-rf.tmp_versionsendif,#defineCHIP1371#includeens1370.c“,.,13,三、具體步驟,3.抽取ens1370.c(位于linux-source-2.6.26/sound/pci)中Linux通用驅動程序核心,添加到ens1371-playback.c中并make,測試。可以先添加框架,再向框架中逐步添加函數(shù)??梢源蛴∵m當?shù)膌og信息,不會影響ens1371的流程。Linux通用驅動程序代碼如下:4.根據(jù)ens1370.c的代碼,向init和exit中添加實現(xiàn)函數(shù)。根據(jù)調用關系實現(xiàn)一個被調用函數(shù)的最小化定義(如下頁圖中的snd_audiopci_probe()和snd_audiopci_remove()),以填充調用函數(shù),并將無關部分注釋掉,減輕代碼量。注意注釋無關部分時需要注意,有些不能確定有沒有用,可以先留著,另外,除了函數(shù)外,其他部分的最好用注釋,不要直接刪除,以便在后面檢查是否刪除了有用的部分。定義最小化的函數(shù)后,代碼是可以編譯,并可以加載到內(nèi)核的,再逐步添寫被調用函數(shù),以此類推,直到所有的調用關系全部被添加進代碼。如向init和exit中添加實現(xiàn)函數(shù):,#defineCHIP1371#include#defineENS1371_DEBUG#ifdefENS1371_DEBUG#defineFUNC_LOG()printk(KERN_ERR“FUNC_LOG:%d%s()n,_LINE_,_FUNCTION_)#endifstaticint_initalsa_card_ens137x_init(void)FUNC_LOG();staticvoid_exitalsa_card_ens137x_exit(void)FUNC_LOG();module_init(alsa_card_ens137x_init)module_exit(alsa_card_ens137x_exit),.,14,#defineCHIP1371#include#include#defineENS1371_DEBUG#ifdefENS1371_DEBUG#defineFUNC_LOG()printk(KERN_ERRFUNC_LOG:%d:%s()n,_LINE_,_FUNCTION_)#endif#defineDRIVER_NAMEENS1371“staticstructpci_device_idsnd_audiopci_ids=/#ifdefCHIP1370/0 x1274,0 x5000,PCI_ANY_ID,PCI_ANY_ID,0,0,0,/*ES1370*/#endif#ifdefCHIP13710 x1274,0 x1371,PCI_ANY_ID,PCI_ANY_ID,0,0,0,/*ES1371*/0 x1274,0 x5880,PCI_ANY_ID,PCI_ANY_ID,0,0,0,/*ES1373-CT5880*/0 x1102,0 x8938,PCI_ANY_ID,PCI_ANY_ID,0,0,0,/*EctivaEV1938*/#endif0,;staticint_devinitsnd_audiopci_probe(structpci_dev*pci,conststructpci_device_id*pci_id)FUNC_LOG();return0;staticvoid_devexitsnd_audiopci_remove(structpci_dev*pci)FUNC_LOG();staticstructpci_driverdriver=.name=DRIVER_NAME,.id_table=snd_audiopci_ids,.probe=snd_audiopci_probe,.remove=_devexit_p(snd_audiopci_remove),#ifdefCONFIG_PM/.suspend=snd_ensoniq_suspend,/.resume=snd_ensoniq_resume,#endif;staticint_initalsa_card_ens137x_init(void)FUNC_LOG();returnpci_register_driver(module_init(alsa_card_ens137x_init)module_exit(alsa_card_ens137x_exit),三、具體步驟,.,15,三、具體步驟,5.make、insmod、rmmod驅動模塊示例:,注意insmodens1371-playback.ko前,要先卸載系統(tǒng)中原有的ens1371模塊snd_ens1371。否則,在定義了DRIVER_NAME后,insmod時就會出錯。圖中,紅色是shell中輸入的命令,黃色是系統(tǒng)打印的信息,而綠色是我們的模塊打印的log。另外,驅動模塊的單步調試可以參照Linux基礎培訓(2)-驅動開發(fā)最佳實踐-1.pptx。,.,16,三、具體步驟,6.仿照snd_audiopci_probe()和snd_audiopci_remove()的填充與alsa_card_ens137x_init()和alsa_card_ens137x_exit()類似,如此一級一級的填充下去,直至模塊可以播放出聲音。對于snd_audiopci_probe()這樣比較復雜的函數(shù),要一行一行的添加,邊添加邊調試。如遇到變量等應該在前面函數(shù)中賦值而還沒有實現(xiàn)的部分,可以先用if宏等方法暫時注釋掉,如下頁代碼中的紅色部分。添加的代碼如下:,#defineCHIP1371#include#include#include#include#defineENS1371_DEBUG#ifdefENS1371_DEBUG#defineFUNC_LOG()printk(KERN_ERRFUNC_LOG:%d:%s()n,_LINE_,_FUNCTION_)#endif#defineDRIVER_NAMEENS1371“staticstructpci_device_idsnd_audiopci_ids=;staticintindexSNDRV_CARDS=SNDRV_DEFAULT_IDX;/*Index0-MAX*/staticchar*idSNDRV_CARDS=SNDRV_DEFAULT_STR;/*IDforthiscard*/staticintenableSNDRV_CARDS=SNDRV_DEFAULT_ENABLE_PNP;/*Enableswitches*/staticintspdifSNDRV_CARDS;staticintlineioSNDRV_CARDS;structensoniq;MODULE_DEVICE_TABLE(pci,snd_audiopci_ids);staticint_devinitsnd_ensoniq_1371_mixer(structensoniq*ensoniq,inthas_spdif,inthas_line)FUNC_LOG();return(0);staticint_devinitsnd_ensoniq_pcm(structensoniq*ensoniq,intdevice,structsnd_pcm*rpcm)FUNC_LOG();return0;staticint_devinitsnd_ensoniq_create(structsnd_card*card,structpci_dev*pci,structensoniq*rensoniq)FUNC_LOG();return0;,.,17,三、具體步驟,6.代碼續(xù):,staticint_devinitsnd_audiopci_probe(structpci_dev*pci,conststructpci_device_id*pci_id)staticintdev;structsnd_card*card;structensoniq*ensoniq;interr,pcm_devs2;FUNC_LOG();if(dev=SNDRV_CARDS)return-ENODEV;if(!enabledev)dev+;return-ENOENT;card=snd_card_new(indexdev,iddev,THIS_MODULE,0);if(card=NULL)return-ENOMEM;if(err=snd_ensoniq_create(card,pci,strcpy(card-driver,DRIVER_NAME);strcpy(card-shortname,EnsoniqAudioPCI);#ifdefENS1371_RESERVEDsprintf(card-longname,%s%sat0 x%lx,irq%i,card-shortname,card-driver,ensoniq-port,ensoniq-irq);#endifif(err=snd_card_register(card)0)snd_card_free(card);returnerr;pci_set_drvdata(pci,card);dev+;return0;staticvoid_devexitsnd_audiopci_remove(structpci_dev*pci)FUNC_LOG();snd_card_free(pci_get_drvdata(pci);pci_set_drvdata(pci,NULL);staticstructpci_driverdriver=.name=DRIVER_NAME,.id_table=snd_audiopci_ids,.probe=snd_audiopci_probe,.remove=_devexit_p(snd_audiopci_remove),#ifdefCONFIG_PM/.suspend=snd_ensoniq_suspend,/.resume=snd_ensoniq_resume,#endif;staticint_initalsa_card_ens137x_init(void)FUNC_LOG();returnpci_register_driver(module_init(alsa_card_ens137x_init)module_exit(alsa_card_ens137x_exit),.
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年煙臺市萊州市教育和體育系統(tǒng)招聘真題
- 風險管理框架應用試題及答案
- 幼兒情感教育活動計劃
- 法學概論學習方法的多樣性與靈活性試題及答案
- 網(wǎng)絡管理員考試背景知識分析試題及答案
- 手術室安全管理與風險控制計劃
- 2024年上海奉賢區(qū)社區(qū)工作者招聘筆試真題
- 軟考2025網(wǎng)絡管理員全重要試題及答案
- 2024年昆明冶金高等專科學校招聘筆試真題
- 軟件設計師考試多樣化策略試題及答案解析
- 內(nèi)控合規(guī)風險管理手冊
- 傳奇輔助腳本
- 宗教場所消防安全培訓課件
- 2024年廣東湛江交通投資集團招聘筆試參考題庫含答案解析
- 中華人民共和國人民武裝警察法釋義
- 華為經(jīng)營管理-華為供應鏈管理(6版)
- 14S501-2 雙層井蓋圖集
- 2021年成人高等教育學士學位英語水平考試真題及答案
- Windows 7安全配置基線檢查指導文件
- 磺化油(DAH)工藝設計書
- (完整版)三菱變頻器E740參數(shù)設置
評論
0/150
提交評論