移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容)
1,主机环境:VMare下CentOS 5.5 ,1G内存。
2,集成开发环境:Elipse IDE
3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。
4,开发板:mini2440,2M nor flash,128M nand flash。
5,u-boot版本:u-boot-2009.08
6,linux 版本:linux-2.6.32.2
7,参考文章:
嵌入式linux应用开发完全手册,韦东山,编著。
Mini2440 之Linux 移植开发实战指南
【1】在初始化文件中加入UDA1341 设备结构
Linux-2.6.32.2 已经完美的支持UDA1341 音频芯片的驱动, 我们只要在arch/arm/mach-s3c2440/mach-mini2440.c 文件中注册UDA1341 平台设备的控制端口就可以了,打开mach-mini2440.c,定位到59行附近,添加如下内容:
#include <linux/dm9000.h>
//添加SD 卡设备结构所需的头文件
#include <linux/mmc/host.h>
#include <plat/mci.h>
//添加声卡头文件
#include <sound/s3c24xx_uda134x.h>
static struct map_desc mini2440_iodesc[] __initdata = {
/* ISA IO Space map (memory space selected by A24) */
定位到313行附近,在SD卡设备结构后面,加入下面代码:
/* MMC/SD */
static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
.gpio_detect = S3C2410_GPG(8),
.gpio_wprotect = S3C2410_GPH(8),
.set_power = NULL,
.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
};
/*Sound card*/
static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
.l3_clk = S3C2410_GPB(4),
.l3_data = S3C2410_GPB(3),
.l3_mode = S3C2410_GPB(2),
.model = UDA134X_UDA1341,
};
static struct platform_device s3c24xx_uda134x = {
.name = "s3c24xx_uda134x",
.dev = {
.platform_data = &s3c24xx_uda134x_data,
}
};
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_sdi, //把SD卡结构设备添加到目标平台设备集中
&s3c_device_rtc,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_nand, //;把nand flash 设备添加到开发板的设备列表结构
&mini2440_device_eth,//;把网卡平台设备添加到开发板的设备列表结构
&s3c24xx_uda134x, //;注册UDA1341 设备平台到内核中
};
这样,我们基本就添加好了 UDA1341 音频设备的驱动。
【2】在内核中配置UDA1341 设备驱动
在终端中进入到内核源码根目录下执行make menuconfig
Device Drivers --->
<*> Sound card support --->
[*] Preclaim OSS device numbers
<*> Advanced Linux Sound Architecture ---> // 出现音频驱动体系结构的子菜单,在这里,我们选择OSS 接口相关的配置选项,需要注意的是,这里的OSS 接口其实是基于ALSA 接口创建的,因为新的内核中现在都已经改用ALSA 设计,这里是为了和以前的软件兼容才这样做的。
< > Sequencer support
<*> OSS Mixer API
<*> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
[*] Dynamic device file minor numbers
[ ] Support old ALSA API
[*] Verbose procfs contents
<*> ALSA for SoC audio support --->
-*- SoC I2S Audio support UDA134X wired to a S3C24XX
在这里,我们可以看到专门为 S3C24xx 系列芯片(包括S3C2410/2440/2443 等)而做的配置选项,打开linux-2.6.32.2/sound/soc/s3c24xx/Makefile 文件就可以看到
我们的开发板使用的是UDA1341 音频芯片,在这里当然要选择“-*- SoC I2S Audio support UDA134X wired to a S3C24XX”了。
退出保存以上各项配置。
【3】重新编译并测试
重新编译后生成uImage,然后复制到nfsboot/kernel目录下,启动开发板,出现如下启动信息:
... ...
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.21.
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
S3C24XX_UDA134X SoC Audio driver
UDA134X SoC Audio Codec
asoc: UDA134X <-> s3c24xx-i2s mapping ok
ALSA device list:
#0: S3C24XX_UDA134X (UDA134X)
s3c-sdi s3c2440-sdi: running at 398kHz (requested: 400kHz).
... ...
测试声卡设备。先再用cat /mnt/test.wav > /dev/dsp播放录音,操作如下:
[root@mini2440 /]#cat /proc/devices
Character devices:
... ...
10 misc
13 input
14 sound
29 fb
[root@mini2440 /]#ls -l /dev/dsp
crw-rw---- 1 root root 14, 3 Jan 1 00:00 /dev/dsp
在主机共享的nfsboot/nfs目录下放入一个音频文件test.wav,然后再开发板串口终端执行
[root@mini2440 /]#cat /mnt/nfs/test.wav >/dev/dsp
[root@mini2440 /]#
可以听到带有很大嘈杂声的歌曲的声音。
【3】修正驱动中的录音代码
当使用系统自带的录音程序进行录音时,我们发现无法听到任何结果,这是因为开发板的录音电路和SMDK2440 目标板的电路是有所区别的。Mini2440 开发板的录音电路如下图所示:
可见,mini2440 开发板使用的录音通道为VIN2,而SMDK2440 使用的则是VIN1,打开linux-2.6.32.2/sound/soc/codecs/ uda134x.c,在大概201 行添加如下红色代码:
uda134x->slave_substream = substream;
} else
uda134x->master_substream = substream;
uda134x_write(codec, 2, 2|(5U<<2)); //把录音通道改为VIN2
return 0;
}
这样,我们就完成了录音驱动的修正
【4】重新编译测试
在内核源代码目录下执行:make uImage,把生成的uImge复制到/nfsboot/kernel目录下,然后重启开发板,在命令终端执行cat /dev/dsp > /mnt/nfs/test1.wav 进行录音测试,再执行cat /mnt/nfs/test1.wav >/dev/dsp 把刚才录得声音播放出来。
[root@mini2440 /]#cat /dev/dsp > /mnt/nfs/test1.wav
^C
[root@mini2440 /]#ls -l /mnt/nfs/test1.wav
-rw-r--r-- 1 root root 45056 Jun 28 2011 /mnt/nfs/test1.wav
[root@mini2440 /]#cat /mnt/nfs/test1.wav > /dev/dsp
[root@mini2440 /]#
可以听到刚刚录下的带有嘈杂声的声音。
接下来,将移植看门狗驱动。