FS_S5PC100平臺
內(nèi)核2.6.35
交叉編譯器 arm-none-linux-gnueabi-gcc-4.5.1
一.驅(qū)動的添加
1.FS_S5PC100平臺上WM9714 ALSA 移植:
這個驅(qū)動在內(nèi)核中支持,我們只需要進(jìn)行簡單的配置就行了,配置如下:
修改 sound/soc/s3c24xx/Kconfig,使其支持FS_S5PC100平臺


2.修改平臺代碼
(1)修改sound/soc/s3c24xx/s3c-ac97.c
添加如下內(nèi)容:
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)配置內(nèi)核
$ 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
重新編譯內(nèi)核
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
測試
系統(tǒng)啟動以后會在dev目錄下產(chǎn)生dsp設(shè)備節(jié)點
文件系統(tǒng)沒有支持udev或mdev的話就必須進(jìn)行下面步驟
建立塊專用或字符專用文件
mknod /dev/dsp c 14 3
mknod /dev/mixer c 14 0
注:
/dev/dsp 數(shù)字信號處理(DSP):DSP是指聲卡中專門處理效果的芯片,稱為效果器,對提高聲卡性能很有用
/dev/mixer 混音器混音器是一臺控制音頻信號的提升,并將音頻信號導(dǎo)向所指目的地的設(shè)備
cat test.wav>/dev/dsp 如果驅(qū)動移植成功,這時可以聽到雜音
復(fù)制一個madplay音頻播放程序,可以用來播放mp3
二.播放器的移植
1. 移植madplay前的準(zhǔn)備。
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。其中前面的三個包可以在//sourceforge.net/project/showfiles.php?group_id=12349下載,后一個包可以在//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,并且把庫生成到交叉編譯環(huán)境的庫目錄下,我把它放到/home/toolchain/arm-none-linux-gnueabi目錄 下。
--prefix=/home/toolchain/arm-none-linux-gnueabi。
再修改(不能跟上面的步驟調(diào)轉(zhuǎn))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是指定為靜態(tài)編譯。不過我發(fā)現(xiàn)這樣并不能夠進(jìn)行編譯。至于如何進(jìn)行表態(tài)編譯,我將在下面中進(jìn)行介紹。
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這個可執(zhí)行文件就把它下載到板子中,敲入: $> ./madplay pig.mp3
Setsid madplay sun.mp3 后臺執(zhí)行