国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ALSA的WM 8976音頻驅(qū)動的設(shè)計

2011-07-24 03:20:36湯銀煥黃秋元吳麗娜
關(guān)鍵詞:音頻系統(tǒng)聲卡驅(qū)動程序

周 鵬,王 承,湯銀煥,黃秋元,吳麗娜

(1.武漢理工大學(xué)信息工程學(xué)院,湖北武漢430070;2.上海明波通信技術(shù)有限公司,上海201203)

嵌入式系統(tǒng)的設(shè)計已經(jīng)成為現(xiàn)代電子設(shè)計的一大領(lǐng)域和方向,其中,嵌入式音頻系統(tǒng)已廣泛應(yīng)用于視頻監(jiān)控、便攜設(shè)備和消費類電子產(chǎn)品等領(lǐng)域。隨著人們對嵌入式音頻的質(zhì)量要求越來越高,國內(nèi)外對其研究也越來越多,并日趨成熟。筆者研制的嵌入式音頻系統(tǒng)采用i.MX27多媒體處理器與音頻芯片WM8976相結(jié)合的方案,操作系統(tǒng)選用Linux(2.6.19.2)。筆者研究了該系統(tǒng)的硬件結(jié)構(gòu)和軟件實現(xiàn),并著重研究了音頻驅(qū)動程序的設(shè)計。

1 硬件概述

在該系統(tǒng)中,采用基于i.MX27處理器和音頻芯片WM8976的I2S音頻系統(tǒng)體系結(jié)構(gòu),音頻系統(tǒng)體系結(jié)構(gòu)如圖1所示。錄音基本原理是:模擬信號從麥克風(fēng)或TVIN進(jìn)入,通過ADC轉(zhuǎn)換成PCM信號,由 i.MX27的 AUDMUX使內(nèi)外部的SSI1相連接[1],將 PCM 信號發(fā)送到 CPU的 SSI里的FIFO,累積一定數(shù)量之后經(jīng)DMA通道發(fā)送到內(nèi)存。播放同理,它是錄制的逆過程。

圖1 音頻系統(tǒng)體系結(jié)構(gòu)

WM8976使用 I2S 總線傳輸數(shù)據(jù)[2],并非AC97,因此處理器需要通過I2C總線對WM8976進(jìn)行控制。主從模式的選擇、PLL電路的使用、采樣率的設(shè)置等都需要通過I2C總線來配置。音頻芯片WM8976提供了4路輸出通道,其中通道1用來接耳機;通道2用來連接系統(tǒng)外接揚聲器;通道3和通道4在設(shè)計中沒有用到。此外,WM8976的LIP與LIN引腳連接外部話筒,用來給系統(tǒng)提供音頻輸入信號,實現(xiàn)錄音功能;AUXL和AULR接AV線(紅、黃),從電視機輸入聲音。

i.MX27處理器集成了 I2S控制器接口SSI[3],通過 I2S總線傳輸音頻數(shù)據(jù)。I2S總線是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn)[4-5]。i.MX27 提供 4 路SSI接口,筆者選用接口2,即SSI1。I2S接口所必需的信號線有左右聲道控制信號線SSI_FS、串行位時鐘信號線SSI_CLK,以及分別用于輸入輸出的兩條串行音頻引腳線SSI_RXDAT/SSI_TXDAT。WM8976的時鐘信號線LRC、BCLK分別連接到 i.MX27 的 SSI_FS、SSI_CLK 引腳,i.MX27的SSI_RXDAT對應(yīng)WM8976的數(shù)據(jù)輸入ADCDAT,SSI_TXDAT對應(yīng) WM8976的數(shù)據(jù)輸出DACDAT。

2 WM 8976音頻驅(qū)動軟件實現(xiàn)

2.1 ALSA音頻處理庫

在設(shè)計中,使用Linux操作系統(tǒng),WM8976音頻驅(qū)動采用ALSA架構(gòu),側(cè)重點在ALSA音頻庫和音頻驅(qū)動的實現(xiàn)。ALSA是Linux中出現(xiàn)較晚的音頻處理庫,主要針對原有的OSS的庫進(jìn)行改進(jìn)[6],其性能更好,支持多個播放源。面對眾多的音頻設(shè)備,ALSA為Linux音頻開發(fā)人員提供了一套標(biāo)準(zhǔn)的訪問機制,使得音頻開發(fā)變得十分容易。

ALSA一般已集成到Linux內(nèi)核中,kernel版本與ALSA的版本必須匹配,否則就需要移植ALSA。移植ALSA要下載其軟件包,包括alsalib、alsa-driver、alsa-utils和 alsa-oss。移植時,主要是對alsa-lib和alsa-utils做工作。alsalib是alsa庫,在安裝alsa-driver或alsa其他包時,必須先安裝這個包;alsa-utilss是alsa的一個工具包,包含聲卡測試和音頻編輯的工具。

2.2 音頻驅(qū)動軟件設(shè)計

音頻設(shè)備驅(qū)動程序的主要任務(wù)是控制音頻數(shù)據(jù)在硬件中流動,并為音頻應(yīng)用提供標(biāo)準(zhǔn)接口。設(shè)備驅(qū)動程序中需要完成的任務(wù)包括:對設(shè)備及對應(yīng)資源初始化和釋放;讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)并回送應(yīng)用程序請求的數(shù)據(jù)。這需要在用戶空間、內(nèi)核空間、總線及外設(shè)之間傳輸數(shù)據(jù)。音頻驅(qū)動放在內(nèi)核目錄樹/kernel/sound/arm中,包括兩部分:codec的配置和音頻數(shù)據(jù)的處理。其中codec的配置通過I2C實現(xiàn),由WM8976完成;音頻數(shù)據(jù)處理用ALSA音頻驅(qū)動接口,由i.MX27來實現(xiàn)。Linux設(shè)備驅(qū)動程序?qū)⒃O(shè)備看成文件[7],在驅(qū)動程序中將結(jié)構(gòu)file operations中的各個函數(shù)指針與驅(qū)動程序?qū)?yīng)函數(shù)綁定,以實現(xiàn)虛擬文件系統(tǒng)VFS對邏輯文件的操作。WM8976對應(yīng)的設(shè)備文件是/dev/dsp,錄放音應(yīng)用程序的操作是對/dev/dsp的操作。錄音時,從驅(qū)動層取得音頻數(shù)據(jù)后,由上層應(yīng)用寫入wav頭存儲成wav文件,也可通過有線或無線wifi發(fā)送到網(wǎng)絡(luò)上,還可直接送到codec進(jìn)行播放。

2.3 I2C驅(qū)動設(shè)計

在音頻驅(qū)動的初始化過程中,對音頻芯片WM8976的操作要全部通過向其內(nèi)部寄存器寫控制字完成,因此能否通過I2C接口正確初始化音頻芯片顯得尤為重要[8]。

Linux定義了系統(tǒng)的I2C驅(qū)動體系結(jié)構(gòu),在Linux系統(tǒng)中,I2C驅(qū)動由3部分組成,即I2C核心、I2C總線驅(qū)動和I2C設(shè)備驅(qū)動。這3部分相互協(xié)作,形成了非常通用、可適應(yīng)性很強的I2C框架,使用該框架在系統(tǒng)初始化時將WM8976掛載到I2C上。

在設(shè)計中,I2C采用兩線模式。WM8976的I2C地址是0x1A,它的內(nèi)部寄存器在兩線模式只能寫入不能讀取,因此只有寫寄存器函數(shù),通過該函數(shù)對WM8976進(jìn)行配置。codec選用master模式;PLL產(chǎn)生的時鐘比較精確,錄放音效果較好,故時鐘由內(nèi)部的PLL電路產(chǎn)生,外部晶振11.289 6 MHz時鐘可以輸入PLL產(chǎn)生需要的SYSCLK時鐘,由SYSCLK=256×samplerate,可得 SYSCLK可取11.289 6 MHz(對于采樣率為 11.025 kHz、22.050 kHz、44.100 kHz)和 12.288 MHz(8 kHz、12 kHz、16 kHz、24 kHz、32 kHz、48 kHz)。

2.4 ALSA音頻驅(qū)動的實現(xiàn)

ALSA音頻驅(qū)動主要完成對音頻數(shù)據(jù)的處理,包括聲卡的注冊釋放和PCM接口函數(shù)等。對于音頻驅(qū)動,一個“卡”的記錄必須分配??ǖ挠涗浭锹暱ǖ目偛?,包括有ID和名字,由snd_card_new創(chuàng)建。它管理著驅(qū)動上所有設(shè)備(或者組件)的列表,例如PCM、Mixer。新建一個聲卡實體后,將PCM組件放在聲卡實體里,用snd_device_new創(chuàng)建。snd_card_register注冊聲卡后,音頻設(shè)備文件/dev/dsp可以被外界訪問,注冊之前不能被外界安全訪問。

ALSA PCM中間層非常強大,驅(qū)動只需要實現(xiàn)底層的函數(shù)即可訪問硬件。該系統(tǒng)中,ALSA提供給錄音的PCM接口函數(shù)體如下,通過snd_pcm_set_ops函數(shù)給聲卡實體。該結(jié)構(gòu)包含了驅(qū)動程序提供給應(yīng)用程序訪問硬件設(shè)備的系統(tǒng)調(diào)用,在用戶進(jìn)程利用系統(tǒng)調(diào)用對設(shè)備文件進(jìn)行操作時,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號找到相應(yīng)的設(shè)備驅(qū)動程序,然后讀取這個數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù),如:

利用GPS定位技術(shù),以1∶5 000地形圖和土壤圖為工作底圖,在作物收獲后采用網(wǎng)格法進(jìn)行樣品的采集,采樣路線按“S”形,采樣深度20厘米。將5點采集的土樣混合,采用四分法取樣品1公斤。樣品待自然風(fēng)干后去除石塊及植物根系,粉碎、過20目篩。過篩后分取50~100克樣品繼續(xù)研磨并過100目篩,裝入瓶中儲藏待用。

該結(jié)構(gòu)各部分的功能如下:

(1)open是ALSA庫提供的打開設(shè)備調(diào)用函數(shù),打開PCM流時調(diào)用該函數(shù),主要是獲得流信息,初始化runtime->hw,配置DMA控制塊等。

(2)close用于關(guān)閉打開的音頻設(shè)備,關(guān)閉WM8976、SSI和DMA等模塊。

(3)ioctl完成PCM控制的一些功能,一般會用函數(shù)snd_pcm_lib_ioctl。

(4)hw_params函數(shù)在硬件初始化時被調(diào)用,主要用來根據(jù)內(nèi)存分配配置音頻的硬件。

(5)hw_free函數(shù)用來釋放由hw_params分配的內(nèi)存。

(7)trigger函數(shù)在PCM開始、停止和暫停時會被調(diào)用,用來調(diào)度錄音驅(qū)動將要執(zhí)行的命令。

(8)pointer用于獲得當(dāng)前硬件在緩存中的位置,PCM層以該更新位置計算可用空間,并喚醒睡眠線程。

音頻驅(qū)動中中斷處理函數(shù)主要用來更新buffer的位置并在buffer位置越過以前設(shè)置的周期時,通過調(diào)用snd_pcm_period_elapsed函數(shù)通知PCM中間層。

2.5 DMA緩沖區(qū)的設(shè)計

由于音頻設(shè)備對數(shù)據(jù)處理的實時性要求較高,DMA緩沖區(qū)設(shè)計和內(nèi)存管理成為音頻驅(qū)動中的重點,只有正確利用內(nèi)存才能高效率地處理音頻數(shù)據(jù),減小音頻系統(tǒng)中的延時[9-10]。i.MX27設(shè)備提供了16個DMA通道,支持線性內(nèi)存、2D內(nèi)存和FIFO傳輸來實現(xiàn)各種各樣的DMA操作。該系統(tǒng)中,采用DMA雙緩沖機制來解決音頻系統(tǒng)的實時性問題,將聲音數(shù)據(jù)放在i.MX27上的RAM中,應(yīng)用程序使用read或write系統(tǒng)調(diào)用在內(nèi)核緩存和應(yīng)用程序緩存中交換數(shù)據(jù)。該機制的原理如圖2所示。

錄音時,音頻系統(tǒng)使用buffer1存放WM8976量化好的音頻數(shù)據(jù),CPU則處理buffer2中的音頻數(shù)據(jù);當(dāng)音頻設(shè)備填充完buffer1,系統(tǒng)會產(chǎn)生一個DMA中斷,該中斷通知CPU開始從buffer1里讀取新的音頻數(shù)據(jù),與此同時,DMA繼續(xù)處理buffer2的數(shù)據(jù)。這樣就減少了資源訪問的沖突,應(yīng)用程序可以在音頻工作的同時處理傳輸進(jìn)來的音頻數(shù)據(jù),提高了系統(tǒng)的并行能力。

圖2 DMA雙緩沖機制

3 結(jié)論

筆者研究了Linux操作系統(tǒng)下,基于ALSA架構(gòu)的音頻芯片WM8976的驅(qū)動設(shè)計,該驅(qū)動可以實現(xiàn)麥克風(fēng)的錄音,TVIN錄音和通過耳機、喇叭播放聲音,單雙聲道的錄放音,在采樣率8 kHz、11.025 kHz、12 kHz、16 kHz、22.025 kHz、24 kHz、32 kHz、48 kHz下均做過測試,在緩沖區(qū)buffer為8 k字節(jié)的情況下,錄音和播放流暢。該系統(tǒng)如果能夠?qū)σ纛l數(shù)據(jù)采用實時高效率的壓縮技術(shù)(如實時MP3編碼技術(shù)),存儲及傳輸效率就可以大大提高,這有待于今后進(jìn)一步的研究。

[1]Freescale.MCIMX27 multimedia applications processor reference manual,rev0.3[DB/OL].[2011 - 01 -30].http://www.freescale.com.

[2]Wolfson.WM8976 stereo CODEC with speaker driver[DB/OL].[2011 -01 -30].http://www.wolfsonmicro.com.

[3]李遵義,林水生,李廣軍.SSI接口技術(shù)及其在音頻處理中的應(yīng)用[J].單片機與嵌入式系統(tǒng)應(yīng)用,2008(7):9-11.

[4]徐睿,李斐,王申康.基于IIS總線的嵌入式音頻系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2004(4):7-9.

[5]李龍雨,馮志華.音頻總線I2S技術(shù)[J].信息技術(shù),2004,28(11):32 -52.

[6]TakashiIwai.Writing an ALSA driver[DB/OL].[2011-01 -30].http://www.kernel.org.

[7]CORBET J.Alessandro rubini linux device drivers[M].Sebastpol:OReilly & Associates,2005:137 -142.

[8]張仲達(dá),方正.WinCE6.0下 WM8976的音頻驅(qū)動[J].武漢理工大學(xué)學(xué)報:信息與管理工程版,2009,31(3):365-368.

[9]何泉,賀玉梅.基于AT91R M9200的嵌入式音頻系統(tǒng)設(shè)計[J].微計算機信息,2007,23(6):12 -14.

[10]秦貴和,徐云鵬,洪宇,等.基于ARMLinu的嵌入式音頻系統(tǒng)設(shè)計[J].計算機工程與設(shè)計,2007,28(11):2611-2613.

猜你喜歡
音頻系統(tǒng)聲卡驅(qū)動程序
淺談號角與帶式揚聲器 在家用或?qū)I(yè)音頻系統(tǒng)中的應(yīng)用
打造最具性價比的7.4.1沉浸式音頻系統(tǒng) 昆明藝術(shù)家園
Elektrobit提供的EB GUIDE工具鏈加速Pioneer最新顯示音頻系統(tǒng)的開發(fā)
汽車零部件(2020年9期)2020-09-28 05:45:20
從房間與音頻系統(tǒng)再談定制安裝的核心要素 暢談家庭影院系統(tǒng)中的隱藏設(shè)計
麻雀成鳳凰 本本聲卡變X—Fi
用心聆聽,“高清”聲卡進(jìn)階技
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
聽老鳥講那集成的故事三回合玩轉(zhuǎn)板載聲卡
北安市| 原平市| 重庆市| 朝阳县| 永靖县| 木里| 治县。| 札达县| 靖宇县| 泸定县| 沙雅县| 南阳市| 崇信县| 新郑市| 江川县| 凤城市| 辉南县| 丰县| 阜城县| 呼和浩特市| 资兴市| 辉县市| 柳河县| 中西区| 澄城县| 兴国县| 绩溪县| 冀州市| 泸州市| 准格尔旗| 芷江| 临湘市| 大化| 周宁县| 浦县| 曲麻莱县| 南安市| 宾川县| 札达县| 马山县| 松滋市|