【转载】声卡驱动的移植

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 测试一下音质

posted @ 2011-01-09 14:23  羽落无声  阅读(1359)  评论(0编辑  收藏  举报