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