Linux-2.6.32.2内核在mini2440上的移植(十三)---移植UDA1341音频驱动

 

移植环境(红色粗字体字修改后内容,蓝色粗体字为特别注意内容)

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 文件就可以看到

Linux-2.6.32.2内核在mini2440上的移植(十三)---移植UDA1341音频驱动_第1张图片

 我们的开发板使用的是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 /]#
可以听到刚刚录下的带有嘈杂声的声音。

接下来,将移植看门狗驱动。

你可能感兴趣的:(c,linux,struct,api,audio,Numbers)