基于ARM9的UDA1341驱动在Linux下移植方法
2011-03-26刘文王晓辉盛文婷李智
刘文,王晓辉,盛文婷,李智
(1.新疆机电职业技术学院电气工程系,新疆乌鲁木齐830000;2.新疆农业大学科学技术学院,新疆乌鲁木齐830091)
S3C2410处理器是Samsung公司生产的基于ARM920T核心、采用0.18 μm制造工艺的32位微控制器,带IIC-BUS和IIS-BUS接口。UDA1341芯片支持IIS总线数据格式,采用位元流转换技术进行信号处理,具有可编程增益放大器(PGA)和数字自动增益控制器(AGC)。在基于上述硬件平台的嵌入式Linux环境中移植UDA1341音频驱动程序,而通用的驱动程序不能在此硬件平台直接运行,需要做很多修改,所以对具体移植过程的总结、分析和具体的测试工作变得尤为重要。
1 硬件核心技术分析
1.1 S3C2410处理器特点
S3C2410处理器具有独立的16 kB指令Cache和16 kB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS接口,IISBUS接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高主频可达202 MHz[1]。
1.2 IIS(Inter-IC Sound)总线分析
IIS(Inter-IC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。它是一种面向多媒体的音频总线专用于音频设备之间的数据传输,为数字立体声提供序列的连接至标准编解码器[2]。IIS总线只处理声音数据,其他信号(如控制信号)必须单独传输。
1.3 UDA1341技术分析
UDA1341支持IIS总线数据格式,对外提供两组音频信号输入接口,每组包含左右2个声道。由于IIS总线只处理音频数据,因此UDA1341还内置用于传输控制信号的L3总线接口[1]。L3接口即混音器控制接口,可以控制输入/输出音频信号的低音及音量大小等。
2 修改通用驱动程序的关键思路和方法
2.1 IIS 总线的信号处理
CDCLK是由S3C2410内部的APH总线时钟首先经过一个IIS的模式选择(56 fs或384 fs),然后再经过一个IIS的预分频器分频后得到[3]。S3C2410主频202 MHz,它的APH总线频率是202/4=50 MHz,在选择IIS的主时钟模式为384 fs后,经过IIS的PSR得到的由IPSR_A分出的一个频率用于IIS时钟输出,另一个由IPSR_B分出的频率CDCLK则直接作为UDA1341编解码时钟。在分频前要进行IIS的主时钟频率选择(本文选择384 fs),将系数384乘以fs得到CDCLK时钟输出频率。
UDA1341芯片的初始化中也需要进行系统时钟的设置(512 fs,384 fs或256 fs),在进行音频的编解码时会根据SYSCLK输入的系统时钟除以相应的系数来得到采样频率fs。所以对于S3C2410芯片的IIS控制器和UDA1341芯片,两者相应的CDCLK和SYSCLK的时钟频率需要设置一致。在调试过程中,如果将两者设置不一致,声卡就不能正常工作。由于预分频值与384这个系数和采样频率fs有关,所以在计算预分频值的函数iispsr_value中,384这个系数也要和CDCLK和SYSCLK设置的系数一致。如果设置不一致,会导致声音播放速度太快或太慢。
2.2 DMA相关函数修改
S3C2410共有4通道的DMA,每通道9个寄存器,共36个。如果通道映射不正确的话,UDA1341就没有输出。在内核的arch/arm/plat-s3c24xx/dma.c的s3c2410_dma_map_channel函数中部分修改如下:
2.3 缓存区的管理
采用循环缓存区的方法设计驱动程序,循环缓存区的空间大小可以通过ioctl来设置。如只采用一个DMA缓存区,在进行写操作的时候,则必须等待该缓存区的数据都传输完毕,同时,读操作也会被阻塞,系统的性能会下降许多[4]。管理循环缓存区的两个结构:typedef struct{
audio_buf_t内包含了每个DMA缓存区的长度、虚拟地址、物理地址以及一个用来防止多个写操作对缓存区同时操作的信号量。
audio_stream_t内包含了循环缓存区开始的指针、正被使用的缓存区的指针、单个缓存区的大小、缓存区的个数以及使用的dma通道号[5]。
3 驱动程序移植方法
3.1 获取UDA1341通用驱动程序
在Samsung公司官方网站下载s3c2410-uda1341.c文件,并且放到Linux内核源代码目录linux2.6.14/sound/oss/下。
3.2 添加驱动程序至Linux内核
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)增加内存映射,修改虚拟地址可用,并且对应的物理地址是UDA1341相应引脚[6]。修改/arch/arm/mach-s3c2410/smdk-s3c2410文件如下:
static struct map_desc smdk2410_iodesc[]__initdata={
{0xf0d00000,0x55000000,SZ_1M,MT_DEVICE},//声卡内存映射
};
4)加入内核对UDA1341芯片的支持
<*>Sound card support
S3C2440 Sound devices-->
<*>S3C2440 UDA1341TS driver
声卡的IC是UDA1341TS,如果此时编译内核make uImage会返回如下错误信息:
sound/built-in.o:(.text+0xXXXX)In funcion'$a'
undefine reference'l3_write':
...
产生该错误的原因是内核不支持L3模块,这样make的时候就没有把L3的头文件包含进来,加入内核对L3模块的支持:
L3 Sopport
L3 support--->
<*>L3 serial bus support
[*]S3C2440 L3 adapter
重新配置内核再次make uImage即可实现内核对UDA1341芯片的支持。
3.3 交叉编译驱动程序至Linux内核映像文件
1)在Linux内核源代码目录执行命令make menuconfig,选择driver->sound->oss->uda1341模块。
2)编译make zImage如果编译成功,内核启动时可以看到mice:PS/2 mouse device common for all mice UDA1341 audio driver initialized NET:Registered protocol family 2 3)系统测试
①建立块专用或字符专用文件
mknod/dev/dsp c 14 3
mknod/dev/mixer c 14 0
/dev/dsp数字信号处理(DSP):DSP指音频设备中专门处理效果的芯片,称为效果器,对提高音频设备性能意义重大。
/dev/mixer混音器:混音器是控制音频信号的提升并将音频信号导向所指目的地的设备。
②烧写新内核文件至硬件Flash,启动后,在/dev/sound/下是有dsp以及mixer两个设备文件,说明音频驱动模块加载正确。
③执行命令:cat test.wav>/dev/sound/dsp命令将PCM数据放到dsp设备上,能听到声音,则说明声卡驱动移植成功。
4 结束语
从嵌入式系统硬件结构入手,分析了S3C2410处理器和UDA1341芯片的技术特点,总结了音频驱动程序主要模块的设计思路,并提出了部分函数和模块的修改方法,最后做了具体测试。嵌入式系统驱动程序开发这个研究方向内容丰富,牵涉的知识面比较广,有很多方面都值得研究,例如寄存器工作特点,不同DMA通道工作方式、编译过程中排错等。本文涉及的只是音频驱动程序开发的部分,希望能做抛砖之用。
[1]刘文,阎晓菲,王卫平,等.基于嵌入式μClinux路由器的防火墙设计[J].新疆农业大学学报,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处理器和嵌入式操作系统μClinux的WebServer实现[D].上海:上海交通大学,2006.
[3]房国志,马传龙.Linux中IIS总线声卡驱动的研究[J].科技创新导报,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]虞跃,姚国良.嵌入式Linux系统中音频驱动的设计与实现[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数据转发性能测试与研究[J].计算机工程与应用,2011(3):61.
LIU Wen.Test and research on performance of Netfilter data forwarding[J].Computer Engineering and Applications,2011(3):61.
[6]刘文,赵晓东,肖松海,等.基于ARM平台的引导程序分析与移植研究[J].软件导刊,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.