劉文,王曉輝,盛文婷,李智
(1.新疆機(jī)電職業(yè)技術(shù)學(xué)院電氣工程系,新疆烏魯木齊830000;2.新疆農(nóng)業(yè)大學(xué)科學(xué)技術(shù)學(xué)院,新疆烏魯木齊830091)
S3C2410處理器是Samsung公司生產(chǎn)的基于ARM920T核心、采用0.18 μm制造工藝的32位微控制器,帶IIC-BUS和IIS-BUS接口。UDA1341芯片支持IIS總線數(shù)據(jù)格式,采用位元流轉(zhuǎn)換技術(shù)進(jìn)行信號(hào)處理,具有可編程增益放大器(PGA)和數(shù)字自動(dòng)增益控制器(AGC)。在基于上述硬件平臺(tái)的嵌入式Linux環(huán)境中移植UDA1341音頻驅(qū)動(dòng)程序,而通用的驅(qū)動(dòng)程序不能在此硬件平臺(tái)直接運(yùn)行,需要做很多修改,所以對(duì)具體移植過(guò)程的總結(jié)、分析和具體的測(cè)試工作變得尤為重要。
S3C2410處理器具有獨(dú)立的16 kB指令Cache和16 kB數(shù)據(jù)Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS接口,IISBUS接口,2個(gè)USB主機(jī),1個(gè)USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410處理器最高主頻可達(dá)202 MHz[1]。
IIS(Inter-IC Sound)總線是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn)。它是一種面向多媒體的音頻總線專(zhuān)用于音頻設(shè)備之間的數(shù)據(jù)傳輸,為數(shù)字立體聲提供序列的連接至標(biāo)準(zhǔn)編解碼器[2]。IIS總線只處理聲音數(shù)據(jù),其他信號(hào)(如控制信號(hào))必須單獨(dú)傳輸。
UDA1341支持IIS總線數(shù)據(jù)格式,對(duì)外提供兩組音頻信號(hào)輸入接口,每組包含左右2個(gè)聲道。由于IIS總線只處理音頻數(shù)據(jù),因此UDA1341還內(nèi)置用于傳輸控制信號(hào)的L3總線接口[1]。L3接口即混音器控制接口,可以控制輸入/輸出音頻信號(hào)的低音及音量大小等。
CDCLK是由S3C2410內(nèi)部的APH總線時(shí)鐘首先經(jīng)過(guò)一個(gè)IIS的模式選擇(56 fs或384 fs),然后再經(jīng)過(guò)一個(gè)IIS的預(yù)分頻器分頻后得到[3]。S3C2410主頻202 MHz,它的APH總線頻率是202/4=50 MHz,在選擇IIS的主時(shí)鐘模式為384 fs后,經(jīng)過(guò)IIS的PSR得到的由IPSR_A分出的一個(gè)頻率用于IIS時(shí)鐘輸出,另一個(gè)由IPSR_B分出的頻率CDCLK則直接作為UDA1341編解碼時(shí)鐘。在分頻前要進(jìn)行IIS的主時(shí)鐘頻率選擇(本文選擇384 fs),將系數(shù)384乘以fs得到CDCLK時(shí)鐘輸出頻率。
UDA1341芯片的初始化中也需要進(jìn)行系統(tǒng)時(shí)鐘的設(shè)置(512 fs,384 fs或256 fs),在進(jìn)行音頻的編解碼時(shí)會(huì)根據(jù)SYSCLK輸入的系統(tǒng)時(shí)鐘除以相應(yīng)的系數(shù)來(lái)得到采樣頻率fs。所以對(duì)于S3C2410芯片的IIS控制器和UDA1341芯片,兩者相應(yīng)的CDCLK和SYSCLK的時(shí)鐘頻率需要設(shè)置一致。在調(diào)試過(guò)程中,如果將兩者設(shè)置不一致,聲卡就不能正常工作。由于預(yù)分頻值與384這個(gè)系數(shù)和采樣頻率fs有關(guān),所以在計(jì)算預(yù)分頻值的函數(shù)iispsr_value中,384這個(gè)系數(shù)也要和CDCLK和SYSCLK設(shè)置的系數(shù)一致。如果設(shè)置不一致,會(huì)導(dǎo)致聲音播放速度太快或太慢。
S3C2410共有4通道的DMA,每通道9個(gè)寄存器,共36個(gè)。如果通道映射不正確的話,UDA1341就沒(méi)有輸出。在內(nèi)核的arch/arm/plat-s3c24xx/dma.c的s3c2410_dma_map_channel函數(shù)中部分修改如下:
采用循環(huán)緩存區(qū)的方法設(shè)計(jì)驅(qū)動(dòng)程序,循環(huán)緩存區(qū)的空間大小可以通過(guò)ioctl來(lái)設(shè)置。如只采用一個(gè)DMA緩存區(qū),在進(jìn)行寫(xiě)操作的時(shí)候,則必須等待該緩存區(qū)的數(shù)據(jù)都傳輸完畢,同時(shí),讀操作也會(huì)被阻塞,系統(tǒng)的性能會(huì)下降許多[4]。管理循環(huán)緩存區(qū)的兩個(gè)結(jié)構(gòu):typedef struct{
audio_buf_t內(nèi)包含了每個(gè)DMA緩存區(qū)的長(zhǎng)度、虛擬地址、物理地址以及一個(gè)用來(lái)防止多個(gè)寫(xiě)操作對(duì)緩存區(qū)同時(shí)操作的信號(hào)量。
audio_stream_t內(nèi)包含了循環(huán)緩存區(qū)開(kāi)始的指針、正被使用的緩存區(qū)的指針、單個(gè)緩存區(qū)的大小、緩存區(qū)的個(gè)數(shù)以及使用的dma通道號(hào)[5]。
在Samsung公司官方網(wǎng)站下載s3c2410-uda1341.c文件,并且放到Linux內(nèi)核源代碼目錄linux2.6.14/sound/oss/下。
1)修改oss目錄下的kconfig文件,添加如下代碼:
config S3C2410_SND_UDA1341
tristate"S3C2410 UDA1341 driver(S3C2410)"
depends on SOUND_PRIME!=n&&SOUND&&ARM&&ARCH_SMDK2410
2)修改oss目錄下的makefile文件,添加如下代碼:
obj-$(CONFIG_S3C2410_SND_UDA1341)+=s3c2410-uda1341.o
3)增加內(nèi)存映射,修改虛擬地址可用,并且對(duì)應(yīng)的物理地址是UDA1341相應(yīng)引腳[6]。修改/arch/arm/mach-s3c2410/smdk-s3c2410文件如下:
static struct map_desc smdk2410_iodesc[]__initdata={
{0xf0d00000,0x55000000,SZ_1M,MT_DEVICE},//聲卡內(nèi)存映射
};
4)加入內(nèi)核對(duì)UDA1341芯片的支持
<*>Sound card support
S3C2440 Sound devices-->
<*>S3C2440 UDA1341TS driver
聲卡的IC是UDA1341TS,如果此時(shí)編譯內(nèi)核make uImage會(huì)返回如下錯(cuò)誤信息:
sound/built-in.o:(.text+0xXXXX)In funcion'$a'
undefine reference'l3_write':
...
產(chǎn)生該錯(cuò)誤的原因是內(nèi)核不支持L3模塊,這樣make的時(shí)候就沒(méi)有把L3的頭文件包含進(jìn)來(lái),加入內(nèi)核對(duì)L3模塊的支持:
L3 Sopport
L3 support--->
<*>L3 serial bus support
[*]S3C2440 L3 adapter
重新配置內(nèi)核再次make uImage即可實(shí)現(xiàn)內(nèi)核對(duì)UDA1341芯片的支持。
1)在Linux內(nèi)核源代碼目錄執(zhí)行命令make menuconfig,選擇driver->sound->oss->uda1341模塊。
2)編譯make zImage如果編譯成功,內(nèi)核啟動(dòng)時(shí)可以看到mice:PS/2 mouse device common for all mice UDA1341 audio driver initialized NET:Registered protocol family 2 3)系統(tǒng)測(cè)試
①建立塊專(zhuān)用或字符專(zhuān)用文件
mknod/dev/dsp c 14 3
mknod/dev/mixer c 14 0
/dev/dsp數(shù)字信號(hào)處理(DSP):DSP指音頻設(shè)備中專(zhuān)門(mén)處理效果的芯片,稱(chēng)為效果器,對(duì)提高音頻設(shè)備性能意義重大。
/dev/mixer混音器:混音器是控制音頻信號(hào)的提升并將音頻信號(hào)導(dǎo)向所指目的地的設(shè)備。
②燒寫(xiě)新內(nèi)核文件至硬件Flash,啟動(dòng)后,在/dev/sound/下是有dsp以及mixer兩個(gè)設(shè)備文件,說(shuō)明音頻驅(qū)動(dòng)模塊加載正確。
③執(zhí)行命令:cat test.wav>/dev/sound/dsp命令將PCM數(shù)據(jù)放到dsp設(shè)備上,能聽(tīng)到聲音,則說(shuō)明聲卡驅(qū)動(dòng)移植成功。
從嵌入式系統(tǒng)硬件結(jié)構(gòu)入手,分析了S3C2410處理器和UDA1341芯片的技術(shù)特點(diǎn),總結(jié)了音頻驅(qū)動(dòng)程序主要模塊的設(shè)計(jì)思路,并提出了部分函數(shù)和模塊的修改方法,最后做了具體測(cè)試。嵌入式系統(tǒng)驅(qū)動(dòng)程序開(kāi)發(fā)這個(gè)研究方向內(nèi)容豐富,牽涉的知識(shí)面比較廣,有很多方面都值得研究,例如寄存器工作特點(diǎn),不同DMA通道工作方式、編譯過(guò)程中排錯(cuò)等。本文涉及的只是音頻驅(qū)動(dòng)程序開(kāi)發(fā)的部分,希望能做拋磚之用。
[1]劉文,閻曉菲,王衛(wèi)平,等.基于嵌入式μClinux路由器的防火墻設(shè)計(jì)[J].新疆農(nóng)業(yè)大學(xué)學(xué)報(bào),2009(5):84-87.
LIU Wen,YAN Xiao-fei,WANG Wei-ping,et al.Design of firewall based on the μCLinux router[J].Journal of Xinjiang Agricultural University,2009(5):84-87.
[2]杜展.基于ARM處理器和嵌入式操作系統(tǒng)μClinux的WebServer實(shí)現(xiàn)[D].上海:上海交通大學(xué),2006.
[3]房國(guó)志,馬傳龍.Linux中IIS總線聲卡驅(qū)動(dòng)的研究[J].科技創(chuàng)新導(dǎo)報(bào),2009(2):45-17.
FANG Zhi-guo,MA Chuan-long.Research of IIS bus sound card driver in linux[J].Science and Technology Innovation Herald,2009(2):45-17.
[4]虞躍,姚國(guó)良.嵌入式Linux系統(tǒng)中音頻驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子器件,2008(02):23-24.
YU Yue,YAO Guo-liang.Design and implementation of audio driver based on embeded linux[J].Electronic Device,2008(2):23-24.
[5]劉文.Netfilter數(shù)據(jù)轉(zhuǎn)發(fā)性能測(cè)試與研究[J].計(jì)算機(jī)工程與應(yīng)用,2011(3):61.
LIU Wen.Test and research on performance of Netfilter data forwarding[J].Computer Engineering and Applications,2011(3):61.
[6]劉文,趙曉東,肖松海,等.基于ARM平臺(tái)的引導(dǎo)程序分析與移植研究[J].軟件導(dǎo)刊,2011(2):26-28.
LIU Wen,ZHAO Xiao-dong,XIAO Song-hai,et al.Analysis and transplantation research on bootloader based on arm platform[J].Software Guide,2011(2):26-28.