陳 熹,程 鵬,梁作坤,吳 斌
(1.中國科學(xué)院微電子研究所 北京 100029;2.銳凌微南京電子科技有限公司 江蘇 南京 210042)
面向Wi-Fi音頻應(yīng)用的嵌入式Linux音頻驅(qū)動設(shè)計
陳 熹1,程 鵬1,梁作坤2,吳 斌1
(1.中國科學(xué)院微電子研究所 北京 100029;2.銳凌微南京電子科技有限公司 江蘇 南京 210042)
搭載Wi-Fi的音頻設(shè)備是物聯(lián)網(wǎng)和智能家庭應(yīng)用中的一大熱點,音頻驅(qū)動則是該系統(tǒng)的一個設(shè)計難點。本文針對Wi-Fi片上系統(tǒng)(SoC)AR9331和音頻芯片WM8904組成的硬件平臺,設(shè)計了基于ALSA架構(gòu)的嵌入式Linux音頻驅(qū)動程序,采用模塊化的程序架構(gòu)提高了驅(qū)動的可移植性,通過適配PCM接口減少了驅(qū)動代碼量,設(shè)計環(huán)形DMA緩沖區(qū)提高了系統(tǒng)的實時性能。實際應(yīng)用表明,該音頻系統(tǒng)性能穩(wěn)定,最高支持"96 kHz/24-bit/雙聲道"音頻播放,具有良好的實時性。
嵌入式Linux;音頻驅(qū)動;ALSA;DMA
隨著電子技術(shù)和通信技術(shù)的發(fā)展,無線設(shè)備正在融入人們的生活,智能手機、平板電腦、車載導(dǎo)航、智能家居等產(chǎn)品大大改變了人們的生活方式[1],而Wi-Fi以其帶寬大、距離遠(yuǎn)、成本低等特點成為了智能設(shè)備的標(biāo)配[2]。音頻系統(tǒng)豐富了人們與智能設(shè)備的交互,還能提供娛樂功能,搭載Wi-Fi的音頻設(shè)備拋棄了數(shù)據(jù)線,具有很大的應(yīng)用前景。音頻系統(tǒng)的一大特征是實時性,而影響實時性的技術(shù)難點是音頻驅(qū)動[3],因此設(shè)計良好的音頻驅(qū)動具有重大意義。
國內(nèi)對嵌入式系統(tǒng)的音頻驅(qū)動已有部分研究,文獻(xiàn)[4-7]研究了Linux系統(tǒng)下基于IIS控制器的音頻驅(qū)動,但缺乏良好的可移植性,文獻(xiàn)[8-10]研究了ARM平臺下基于高級Linux聲音架構(gòu)(Advanced Linux Sound Architecture,ALSA)的音頻驅(qū)動設(shè)計,然而目前針對內(nèi)置Wi-Fi片上系統(tǒng) (System on a Chip,SoC)的音頻驅(qū)動研究還很少。
文中面向Wi-Fi音頻應(yīng)用,選用Qualcomm公司的無線SoC AR9331和Cirrus Logic公司的音頻芯片WM8904組成硬件平臺,設(shè)計并實現(xiàn)了基于ALSA架構(gòu)的嵌入式Linux音頻驅(qū)動程序,實驗證明,該方案具有很大的應(yīng)用價值。
AR9331通過IIS總線與WM8904進(jìn)行音頻數(shù)據(jù)交互,IIS有3個主要信號[5]:
1)位時鐘(BCLK)。對應(yīng)數(shù)字音頻信號每一位數(shù)據(jù)的時鐘,頻率=聲道數(shù)×采樣頻率×位寬。
2)聲道選擇時鐘(LRCLK)。用于切換左右聲道的時鐘,其頻率等于音頻采樣率。
3)串行數(shù)據(jù)(SD)。用二進(jìn)制補碼表示的音頻數(shù)據(jù),提供分時復(fù)用功能。本文用于IIS數(shù)據(jù)輸出。
此外,還使用了用于時鐘同步的主時鐘(MCLK),以及用于IIS數(shù)據(jù)輸入的串行輸入(SDI)。IIS總線只能處理音頻數(shù)據(jù),因此還需要IIC總線傳輸控制信號[6],配置WM8904的寄存器,實現(xiàn)音量調(diào)節(jié)、音頻格式設(shè)置等功能。WM8904提供標(biāo)準(zhǔn)的兩線控制接口,AR9331則使用GPIO模擬IIC總線。圖1是AR9331與WM8904的引腳具體連接方式,除了IIS和IIC總線的連接,WM8904還外接麥克風(fēng)插孔、耳機插孔和音箱插孔,用于音頻的輸入和輸出。
圖1 引腳連接框圖
Linux 2.6內(nèi)核開始,ALSA成為了默認(rèn)的音頻驅(qū)動架構(gòu),針對原有的開放聲音系統(tǒng)(Open Sound System,OSS)架構(gòu)[7]做出不少改進(jìn),圖2是ALSA音頻系統(tǒng)的架構(gòu)[9],分為兩層:用戶空間中的應(yīng)用軟件以及內(nèi)核空間中的驅(qū)動軟件。ALSA最大的優(yōu)勢是提供了硬件無關(guān)的程序庫,應(yīng)用軟件直接調(diào)用程序庫API,無需像OSS應(yīng)用那樣訪問硬件相關(guān)的接口[5],因此具有良好的可移植性。內(nèi)核空間又包含ALSA內(nèi)核API與ALSA內(nèi)核驅(qū)動,內(nèi)核API負(fù)責(zé)連接應(yīng)用庫與內(nèi)核驅(qū)動,包含PCM以及控制設(shè)備等重要接口,內(nèi)核驅(qū)動則負(fù)責(zé)與硬件設(shè)備進(jìn)行交互,并實現(xiàn)最大程度的硬件功能抽象。ALSA對OSS應(yīng)用提供了內(nèi)核態(tài)模擬和用戶態(tài)模擬兩種方式,具備良好的兼容性。
圖2 ALSA音頻系統(tǒng)架構(gòu)
ALSA驅(qū)動的主要功能是在CPU和音頻芯片之間傳輸PCM音頻數(shù)據(jù)。為了縮短驅(qū)動開發(fā)周期,ALSA內(nèi)核API抽象出了功能強大的PCM中間層[9],驅(qū)動只需完成與DMA傳輸相關(guān)的底層接口函數(shù),即可實現(xiàn)PCM層對硬件的訪問。在進(jìn)行音頻播放和錄制的過程中,驅(qū)動會開辟一個或多個PCM音頻流,音頻數(shù)據(jù)就通過PCM流進(jìn)行傳輸。
3.1ALSA驅(qū)動模塊probe()基本流程
文中將ALSA驅(qū)動整體上導(dǎo)出為一個內(nèi)核驅(qū)動模塊ar9331_wm8904_alsa.ko,裝載該模塊時,系統(tǒng)會自動進(jìn)入探針函數(shù)probe(),執(zhí)行ALSA驅(qū)動的初始化[11]。圖3給是probe()函數(shù)的基本流程,最關(guān)鍵的步驟是創(chuàng)建和注冊聲卡對象,作為整個音頻系統(tǒng)資源的封裝。
圖3 probe()函數(shù)基本流程
3.2PCM接口設(shè)計
PCM中間層是ALSA內(nèi)核API中的一個模塊,用于完成音頻數(shù)據(jù)流的傳輸,使用PCM接口可以有效減少驅(qū)動代碼量。驅(qū)動通過創(chuàng)建PCM設(shè)備實現(xiàn)與內(nèi)核API的交互,用戶進(jìn)程請求對PCM設(shè)備文件進(jìn)行操作時,ALSA系統(tǒng)開辟PCM數(shù)據(jù)流,隨后調(diào)用驅(qū)動注冊的PCM操作函數(shù)完成相關(guān)操作[8]。
3.2.1PCM操作函數(shù)
PCM接口中最重要的結(jié)構(gòu)是PCM操作函數(shù)集snd_pcm _ops,其包含了AR9331的IIS接口設(shè)置、AR9331的DMA內(nèi)存配置和WM8904的IIS接口設(shè)置等操作。為了提高驅(qū)動的可移植性,文中采用了模塊化設(shè)計,圖4是PCM接口設(shè)計的示意圖,抽象出了與AR9331、WM8904相關(guān)的3個模塊,移植驅(qū)動時只需更新相應(yīng)模塊中的函數(shù),提高了驅(qū)動的可移植性。
圖4 PCM接口模塊化設(shè)計
PCM操作函數(shù)集是通過snd_pcm_set_ops()與PCM流進(jìn)行綁定的,表1是函數(shù)集中各函數(shù)的功能[10]。
3.2.2PCM運行狀態(tài)
圖5給出了PCM流運行時,發(fā)生狀態(tài)轉(zhuǎn)移過程中各函數(shù)的調(diào)用關(guān)系。一個典型的PCM狀態(tài)轉(zhuǎn)移流程描述如下:從CLOSED狀態(tài)開始,首先調(diào)用open()打開PCM流,進(jìn)入OPEN狀態(tài);然后通過hw_params()設(shè)置IIS及DMA參數(shù),進(jìn)入SETUP狀態(tài);接著調(diào)用prepare()重置 IIS和DMA,進(jìn)入PREPARED狀態(tài);隨后接收到應(yīng)用程序的start指令,進(jìn)入RUNNING狀態(tài),執(zhí)行PCM數(shù)據(jù)的傳輸;傳輸完畢后,收到stop指令返回SETUP狀態(tài);最后調(diào)用hw_free()和close()完成資源釋放,重回CLOSED狀態(tài)。
表1 PCM操作函數(shù)功能
圖5 PCM狀態(tài)轉(zhuǎn)移圖
在RUNNING狀態(tài)下有可能因為CPU負(fù)載過大等原因進(jìn)入XRUN狀態(tài)。例如使用“48 kHz/16-bit/雙聲道”的采樣方式錄音,音頻芯片產(chǎn)生1 536 kbps的數(shù)據(jù)流,如果使用16 kB的緩沖區(qū),那么應(yīng)用程序有0.01 s處理緩沖區(qū)中的數(shù)據(jù),如果不能及時處理完,緩沖區(qū)就會溢出而進(jìn)入OVERRUN狀態(tài);播放時,也可能因為應(yīng)用程序不能及時寫入數(shù)據(jù),導(dǎo)致緩沖區(qū)空了而進(jìn)入UNDERRUN狀態(tài)。減少進(jìn)入XRUN狀態(tài)的方法就是有效的利用內(nèi)存,設(shè)計合理的DMA緩沖區(qū),從而提高系統(tǒng)實時性[6]。
3.3環(huán)形DMA緩沖區(qū)
音頻系統(tǒng)對實時性要求較高,在DMA傳輸模式下,CPU可以在DMA控制器占據(jù)總線使用權(quán)時執(zhí)行其他任務(wù),因而能有效提高系統(tǒng)的工作效率[4]。對于單緩沖區(qū),數(shù)據(jù)讀完后,需要寫入新的數(shù)據(jù),而在寫緩沖區(qū)時,必須停止播放或錄制(否則產(chǎn)生同時讀寫的錯誤),因此單緩沖區(qū)不能滿足實時性[3]。為此,文中使用了一種環(huán)形DMA緩沖區(qū)的內(nèi)存管理策略[12],將一段連續(xù)的DMA內(nèi)存劃分為若干個等長buffer,每個buffer通過描述符進(jìn)行訪問,描述符包含buffer物理地址、大小、控制位以及下一個描述符的指針等信息,通過將描述符連接成環(huán)形鏈表實現(xiàn)了環(huán)形DMA緩沖區(qū)。圖6是播放音頻時DMA內(nèi)存的讀寫過程,白色buffer表示可寫,灰色buffer表示可讀,當(dāng)對buffer 2進(jìn)行播放時,CPU往buffer 1中填寫數(shù)據(jù),當(dāng)buffer 2播放完畢之后,DMA控制器產(chǎn)生一個傳輸完中斷,將buffer 2置為可寫,CPU隨后就會往buffer 2中填寫數(shù)據(jù),系統(tǒng)則繼續(xù)對buffer 3進(jìn)行播放,遇到緩沖區(qū)末尾則返回buffer 0,依次類推,直到所有音頻播放完畢。
圖6 播放時DMA內(nèi)存讀寫過程
針對圖1中的硬件平臺,本文搭建了圖7所示的應(yīng)用系統(tǒng),核心板型號為TinyPlay1100,為了減少面積底板只使用線路輸出外接音箱,平臺搭載 OpenWrt系統(tǒng)[13],采用 Linux 3.10.49內(nèi)核,并移植了ALSA音頻驅(qū)動。經(jīng)過測試,系統(tǒng)最高支持“96 kHz/24-bit/雙聲道”高保真音頻的播放,驅(qū)動運行穩(wěn)定,音質(zhì)良好,達(dá)到了實時性要求。
圖7 實際應(yīng)用系統(tǒng)
文中還在此系統(tǒng)上開發(fā)了支持DLNA[14]以及AirPlay[15]協(xié)議的無線音頻推送服務(wù)端程序,Android和iOS設(shè)備可以在同一局域網(wǎng)內(nèi)通過Wi-Fi向該系統(tǒng)推送音樂進(jìn)行播放,圖8是使用手機推送歌曲的效果圖,方框標(biāo)識了服務(wù)端設(shè)備名稱。該系統(tǒng)具有良好的兼容性和可靠性,已在國產(chǎn)某Wi-Fi智能音箱解決方案中得到應(yīng)用。
圖8 iOS(左)及Android(右)音樂推送
搭載Wi-Fi的音頻設(shè)備是物聯(lián)網(wǎng)和智能化時代的應(yīng)用熱點,高集成度的Wi-Fi SoC將得到廣泛使用,作為該系統(tǒng)的一個關(guān)鍵技術(shù)點,音頻驅(qū)動需要良好的設(shè)計。文中針對Wi-Fi SoC AR9331和低功耗音頻芯片WM8904組成的硬件系統(tǒng),設(shè)計并實現(xiàn)了基于ALSA架構(gòu)的嵌入式Linux音頻驅(qū)動,與文獻(xiàn)[8-10]中基于ARM平臺的系統(tǒng)相比,具有高集成度、低成本、低功耗的優(yōu)勢。測試證明,該驅(qū)動具有良好的實時性和穩(wěn)定性,對于其他Wi-Fi SoC平臺也具有較好的可移植性和參考價值,可以應(yīng)用于Wi-Fi高保真音箱、智能家居等領(lǐng)域。
[1]嚴(yán)萍,張興敢,柏業(yè)超,等.基于物聯(lián)網(wǎng)技術(shù)的智能家居系統(tǒng)[J].南京大學(xué)學(xué)報:自然科學(xué)版,2012,48(1):26-32.
[2]盛仲飆.WIFI無線網(wǎng)絡(luò)技術(shù)及安全性研究[J].電子設(shè)計工程,2012,20(16):1-3.
[3]孟祥岳,孔令通,張文明,等.嵌入式Linux系統(tǒng)下音頻驅(qū)動程序的設(shè)計[J].電視技術(shù),2013,37(S2):480-481.
[4]徐睿,李斐,王申康.基于IIS總線的嵌入式音頻系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2004,30(4):7-9.
[5]霍燃,高麗萍,陳慶奎.嵌入式Linux系統(tǒng)下基于UDA1341芯片的音頻驅(qū)動程序設(shè)計[J].計算機應(yīng)用與軟件,2012,29(4):16-19.
[6]秦貴和,徐云鵬,洪宇,等.基于ARMLinux的嵌入式音頻系統(tǒng)設(shè)計[J].計算機工程與設(shè)計,2007,28(11):2611-2613.
[7]程杰,凌明.基于SEP4020的嵌入式Linux音頻驅(qū)動程序設(shè)計[J].微型機與應(yīng)用,2009,28(20):5-8.
[8]周鵬,王承,湯銀煥,等.基于ALSA的WM8976音頻驅(qū)動的設(shè)計[J].武漢理工大學(xué)學(xué)報:信息與管理工程版,2011,33(4):517-520.
[9]劉哲峰.嵌入式Linux音頻設(shè)備的驅(qū)動設(shè)計與研究[D].太原:太原理工大學(xué),2010.
[10]孟浩,孟利民.基于ARM9和WM8731的音頻編解碼系統(tǒng)的設(shè)計與實現(xiàn)[C].第二屆亞太地區(qū)信息論學(xué)術(shù)會議論文集. 2011.
[11][美]科波特(Corbet,J.).Linux設(shè)備驅(qū)動程序[M].北京:中國電力出版社,2012.
[12]陳學(xué)松.深入Linux設(shè)備驅(qū)動程序內(nèi)核機制[M].北京:電子工業(yè)出版社,2012.
[13]許倩.基于OpenWrt系統(tǒng)路由器的功能模塊的開發(fā)[D].北京:中國石油大學(xué)(華東),2013.
[14]李欣,李軼婷.基于DLNA數(shù)字媒體適配器的設(shè)計[J].電子設(shè)計工程,2012,20(20):179-181.
[15]邱晨.基于Android的Airplay Server端應(yīng)用設(shè)計與實現(xiàn)[D].廈門:廈門大學(xué),2014.
Design of embedded Linux audio driver aimed at Wi-Fi audio application
CHEN Xi1,CHENG Peng1,LIANG Zuo-kun2,WU Bin1
(1.Institute of Microelectronics of Chinese Academy of Science,Beijing 100029,China;2.Ralinwi Nanjing Electronic Technology Co.Ltd,Nanjing 210042,China)
Audio devices integrated with Wi-Fi module is a hot spot in the field of Internet of Things and smart home,while audio driver is a difficulty.This hardware system is composed of Wi-Fi System on Chip(SoC)AR9331 and audio chip WM8904.An embedded Linux audio driver based on Advanced Linux Sound Architecture(ALSA)was designed.A modular programming architecture was adopted to enhance the portability of the driver.The amount of code was reduced via accessing Pulse-code modulation(PCM)interface.A DMA ring buffer technology was designed to improve the real time processing of this system.Practical application showed that the audio driver ran stably on the platform and supported up to"96KHz/24-bit/ Stereo"audio playback with good performance of real time.
embedded linux;audio driver;ALSA;DMA
TN875
A
1674-6236(2016)21-0095-03
2016-03-17稿件編號:201603219
國家發(fā)改委2013年移動互聯(lián)網(wǎng)及第四代移動通信(TD-LTE)產(chǎn)業(yè)化專項
陳 熹(1990—),男,江蘇南通人,碩士研究生。研究方向:嵌入式系統(tǒng)設(shè)計、Linux驅(qū)動開發(fā)。