【转载】声卡驱动的移植
http://blog168.chinaunix.net/space.php?uid=24219701&do=blog&cuid=2439407
硬件接法:L3MODE -> GPB2 L3DATA->GPB3 L3CLOCK->GPB4
内核自带的声卡驱动,可以正常编译,也会打印出正确的配置信息,但是播放时没有声音,也不能进行录音。要替换掉内核自带的驱动(注意先备份[sound/soc/s3c24xx/s3c24xx-pcm.c]),用2.6.29.4内核中的声卡驱动
将2.6.29.4 内核源码目录下的:
sound 文件夹,
include/sound 文件夹,
include/asm-arm/plat-s3c24xx 文件夹,
arch/arm/mach-s3c2410/include/mach/audio.h 文件
复制到2.6.31 内核源码的相应目录下,
修改arch/arm/mach-s3c2440/mach-smdk2440.c 161 行Platform_device 结构体中,加入:
&s3c24xx_uda134x,
修改arch/arm/plat-s3c24xx/devs.c,在DM9000 那段代码下面加入:
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,
};
extern struct platform_device s3c24xx_uda134x = {
.name = "s3c24xx_uda134x",
.dev = {
.platform_data = &s3c24xx_uda134x_data,
}
};
EXPORT_SYMBOL(s3c24xx_uda134x);
在arch/arm/plat-s3c/include/plat/devs.h 中加入一行:
extern struct platform_device s3c24xx_uda134x;
注意:编译时会出错,提示S3C2410_GPBX,UDA134X_UDA1341,l3_mode 等没有定义,
这里需要在devs.c 中包含两个头文件
#include <mach/regs-gpio.h> //这个是S3C2410 的GPIO 定义
#include <sound/s3c24xx_uda134x.h>
配置内核,支持声卡:
Device Drivers:
* Sound card support
* Advanced Linux Sound Architecture
* CCS Mixer API
* CSS PCM(digital audio) API
* Verbose procfs contents
* ALSA for SoC audio support
* SoC audio for the Samsung S3C24XX chips
* SoC I2S Audio support for UDA134X wired to a S3C24XX
编译内核,会报错:
Sound/core/info.c:159:error:’struct proc_dir_entry’has no member named‘owner’
Sound/core/info.c:982:error:’struct proc_dir_entry’has no member named‘owner’
在include/linux/proc_fs.h 文件中定义这个结构体成员,在第70 行加入:struct module *owner;
继续编译,又会出现一个错误:
Sound/soc/s3c24xx/s3c24xx-i2s.c:407:error:implicit declaration of function‘s3c2410_gpio_cfgpin’
在2.6.31 内核中,s3c2410_gpio_cfgpin 是在include/linux/gpio.h 中定义的,要添加这个文件
在sound/soc/s3c24xx/s3c24xx-i2s.c 中,第24 行添加:
#include <linux/gpio.h>
继续编译,又会出现很多错误:
sound/soc/s3c24xx/s3c24xx-pcm.c 中的S3C2410_DISRCC_INC 等常量没有定义,s3c2410_dam_config 函数的参数个数不对
原因是2.6.31 内核中dma 相关的文件改变了,以前的跟dma 有关的代码就不能使用了,我们只需把原来代码中的sound/soc/s3c24xx/s3c24xx-pcm.c 这个文件替换回来就可以了。
编译时同样会出现和DM9000 一样的错误,解决方法也是把
static struct platform_device s3c24xx_uda134x = {
(static 改成extern)
如果没有问题了,启动时会打印出以下信息:
Advanced Linux Sound Architecture Driver Version 1.0.18a.
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)
前面两句不用管,只要后面的信息都打出来就OK 了,可以在源码下把这两条警告给屏蔽掉
下面测试一下声卡,设备名称为:/dev/dsp
用命令: #cat /dev/dsp > /tmp/1.wav 进行录音,录完后Ctrl+C
用命令:#cat /tmp/1.wav > /dev/dsp 进行放音,如果听到刚才的录音,就说明声卡没问题了,再用madplay 测试一下音质