FS_S5PC100之madplay移植
FS_S5PC100平台
内核2.6.35
交叉编译器 arm-none-linux-gnueabi-gcc-4.5.1
一.驱动的添加
1.FS_S5PC100平台上WM9714 ALSA 移植:
这个驱动在内核中支持,我们只需要进行简单的配置就行了,配置如下:
修改 sound/soc/s3c24xx/Kconfig,使其支持FS_S5PC100平台
2.修改平台代码
(1)修改sound/soc/s3c24xx/s3c-ac97.c
添加如下内容:
static int s3c_ac97_hifi_prepare(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
printk("%s %s: %d\n",__FILE__, __func__, __LINE__);
s3c_ac97_write(0,0x26,0x0);
s3c_ac97_write(0, 0x0c, 0x0808);
s3c_ac97_write(0,0x3c, 0xf803);
s3c_ac97_write(0,0x3e,0xb990);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
s3c_ac97_write(0,0x02, 0x0404);
s3c_ac97_write(0, 0x04, 0x0606);
s3c_ac97_write(0,0x1c, 0x12aa);
}
else
{
s3c_ac97_write(0, 0x12, 0x0f0f);
#ifdef CONFIG_SOUND_WM9713_INPUT_STREAM_MIC
s3c_ac97_write(0,0x5c,0x2);
s3c_ac97_write(0,0x10,0x68);
s3c_ac97_write(0,0x14,0xfe00);
#else /* Input Stream is LINE-IN */
s3c_ac97_write(0, 0x14, 0xd612);
#endif
}
return 0;
}
(2)修改
static struct snd_soc_dai_ops s3c_ac97_dai_ops = {
.hw_params = s3c_ac97_hw_params,
.trigger = s3c_ac97_trigger,
};
为:
static struct snd_soc_dai_ops s3c_ac97_dai_ops = {
.hw_params = s3c_ac97_hw_params,
.trigger = s3c_ac97_trigger,
.prepare = s3c_ac97_hifi_prepare,
};
(3)修改arch/arm/plat-samsung/s3c-pl330.c
添加头文件
#include <linux/clk.h>
#include <linux/err.h>
(4)在1037行添加
struct clk *clk;
在1079行添加
clk = clk_get(&pdev->dev, "pdma");
if (IS_ERR(clk)) {
printk("cannot get adc clock source\n");
}
clk_enable(clk);
(5)修改arch/arm/mach-s5pc100/dma.c
修改 static struct platform_device s5pc100_device_pdma0中
.id = 1,
为:
.id = 0,
修改static struct platform_device s5pc100_device_pdma1中
.id = 2,
为
.id = 1,
(6)配置内核
$ make menuconfig
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> OSS Mixer API
<*> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
[*] Support old ALSA API
[*] Verbose procfs contents
[*] Verbose printk
<*> ALSA for SoC audio support --->
<*> SoC Audio for the Samsung S3CXXXX chips
<*> SoC AC97 Audio support for SMDK with WM9713
<*> Build all ASoC CODEC drivers
重新编译内核
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
测试
系统启动以后会在dev目录下产生dsp设备节点
文件系统没有支持udev或mdev的话就必须进行下面步骤
建立块专用或字符专用文件
mknod /dev/dsp c 14 3
mknod /dev/mixer c 14 0
注:
/dev/dsp数字信号处理(DSP):DSP是指声卡中专门处理效果的芯片,称为效果器,对提高声卡性能很有用
/dev/mixer混音器混音器是一台控制音频信号的提升,并将音频信号导向所指目的地的设备
cat test.wav>/dev/dsp 如果驱动移植成功,这时可以听到杂音
复制一个madplay音频播放程序,可以用来播放mp3
二.播放器的移植
1.移植madplay前的准备。
madplay的移植需要以下的几个包:madplay-0.15.2b.tar.gz,libmad-0.15.1b.tar.gz,
libid3tag-0.15.1b.tar.gz和 zlib-1.1.4.tar.gz。其中前面的三个包可以在http://sourceforge.net/project/showfiles.php?group_id=12349下载,后一个包可以在http://www.gzip.org/zlib/zlib-1.1.4.tar.gz中找到。
为了编译这个播放器,还需要一个交叉编译器,gcc version 4.3.2 (crosstool-NG-1.8.1-none)
2.开始编译
2.1. 用交叉编译工具编译zlib,并且把库生成到交叉编译环境的库目录下,我把它放到/home/toolchain/arm-none-linux-gnueabi目录下。--prefix=/home/toolchain/arm-none-linux-gnueabi。
再修改(不能跟上面的步骤调转)makefile文件:
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rcs
RANLIB=arm-none-linux-gnueabi-ranlib
make ,make install ,编译好之后就可以在上面prefix指定的目录下的lib目录下找到libz.a这个库。
2.2. 编译libid3tag
../configure CC=arm-none-linux-gnueabi-gcc --prefix=/home/toolchain/arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/home/toolchain/arm-none-linux-gnueabi/include LDFLAGS=-L/home/toolchain/arm-none-linux-gnueabi/lib
其中,--disable-shared --enable-static是指定为静态编译。不过我发现这样并不能够进行编译。至于如何进行表态编译,我将在下面中进行介绍。
make, make install
2.3.编译libmad
./configure CC=arm-none-linux-gnueabi-gcc --prefix=/home/toolchain/arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/home/toolchain/arm-none-linux-gnueabi/include LDFLAGS=-L/home/toolchain/arm-none-linux-gnueabi/lib
然后,make ,make install
报错:cc1: error: unrecognized command line option “-fforce-mem”
解决方式:找到libmad configure之后的Makefile,
vi Makefile
找到包含"-fforce-mem"字符串,将其删除,就ok了
2.4.编译madplay
./configure ./configure CC=arm-none-linux-gnueabi-gcc --prefix=/home/toolchain/arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/home/toolchain/arm-none-linux-gnueabi/include LDFLAGS=-L/home/toolchain/arm-none-linux-gnueabi/lib
然后,make
编译完成后,查看了一下madplay这个可执行文件就把它下载到板子中,敲入: $> ./madplay pig.mp3
Setsid madplay
补充:综合编程 , 其他综合 ,