高速公路 机电工作:linux-2.6.14下madplay在S3C2410上移植的全过程详解

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 04:24:29
 (2009-11-05 10:52) 分类: 嵌入式Linux

linux-2.6.14下madplay在S3C2410上移植的全过程详解

一. 声卡(uda1341 philis) 驱动的移植:

 在移植之前,自己看了不了这方面的文章,但是觉得大同小异,有一些大侠还用了一些我看不懂的文件(.ko,我似乎没有见过这样的文件,知道的请相告一声^_^),后来就开始动手移植了。

 1. 首先自己在网上下了一个uda1341的驱动文件s3c2410-uda1341.c(好像是从csdn中下的),稍作了修改(下面会提到怎么修改)后,把它放到linux2.6.14/sound/oss/目录下。

 2. 修改oss目录下的kconfig文件,以便在我们下面配置内核的时候可以选中它,主要是在前面添加下面的几行:

 config S3C2410_SND_UDA1341

       tristate "S3C2410 UDA1341 driver (S3C2410)"

       depends on SOUND_PRIME!=n &&  SOUND && ARM && ARCH_SMDK2410

   修改Makefile文件,在它的适当位置添加下面的一行,这样配置后,如果我们选中了它编译的时候我们就可以在该目录下生成一 个   s3c2410-uda1341.o文件。

 Obj-$(CONFIG_S3C2410_SND_UDA1341) += s3c2410-uda1341.o

 3. 修改增加内存映射,以使内核知道该虚拟地址可用,而且对应的物理地址是我们的声卡。修改/arch/arm/mach-s3c2410/smdk-s3c2410.如下:

 static struct map_desc smdk2410_iodesc[] __initdata = ...{

  /**//* nothing here yet */

 ...{0xe0000000, 0x19000000, SZ_1M, MT_DEVICE}, //  网卡内存映射

 ...{0xf0d00000, 0x55000000, SZ_1M, MT_DEVICE},  // 声卡内存映射

 };

 上面一行是 我的网卡的地址映射,后面一行是声卡的地址映射。s3c2410 的 虚拟地址 0xf0d00000,物理地址  0x55000000(这个可以在asm/arch/map.h文件中找到)。

 4, 配置完毕后,在make menuconfig后,选择driver->sound->oss->uda1341 ,选择对声卡的支持。编译内核,把内核Image下载到板子上,为了测试我们是否已经是成功地移植了声卡,可以进行如下的测试:

 A. 查看在/dev/sound/下是否有dsp以及mixer两个设备;

 B. 如果有,再执行如下的命令:cat 1.wav >/dev/sound/dsp;就是将PCM数据放到dsp上,如果成功地进行了移植,那么耳机就会听到一些声音,当然还不是音乐。这里只能是用.wav文件来测试,因为它是PCM编码的,不能用mp3文件,否则会听不到发声。以下是内核在启动时在终端打印出来的消息:

 s3c2410iis_probe...

success to get memory region resouce

success to ioremap() region

iis_clock = clk_get(dev, "iis"); done

success to find clock source

local_irq_save

local_irq_restore

 init_s3c2410_iis_bus...

 __raw_writel(0, iis_base + S3C2410_IISPSR);...

done

__raw_writel(0, iis_base + S3C2410_IISCON);...

done

__raw_writel(0, iis_base + S3C2410_IISMOD);...

done

__raw_writel(0, iis_base + S3C2410_IISFCON);...

done

clk_disable(iis_clock) done

init_s3c2410_iis_bus done

 init_uda1341...

 init_uda1341 done

 success to get DMA channels 1

 success to get DMA channels 2

 UDA1341 audio driver initialized

 

 5. 在编译的时候,发现我下的文件中有一个错误,发生在init_s3c2410_iis_bus_tx()中,说什么 S3C2410_IISMOD_MASTER,自己看了一下asm/arch/reg-iis.h中将无有关主模式的定义,只有从模式的定义,我想既然函数中已经是先将iismod初始化为0,就已经是主模式了,干脆将它注释掉了。

 声卡驱动已经基本完成。接下来就是将madplay播放器移到ARM上。

二. 播放器的移植

 现在有很多的播放器可以移植到arm9上,你mplayer,madplay等。但发现移植mplayer时遇到了一个很致命的文件错误,怎么也解决不了,<<mplayer在2410上的移植.pdf>>中也没有相关的方法,我只好暂时耽下,换了另外一个播放器madplay.

 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中找到。

  为了编译这个播放器,还需要一个交叉编译器,我用的是arm-linux-gcc 3.4.1版本,网上很多文章都说用arm-linux-gcc 2.95.3这个交叉编译器,但是我在用它配置(./configure)libid3tag的时候,它最后老是说configure文件的某一行有错, check "config.log" for detail。没办法,只好用3.4.1版本的编译器。

 2. 开始编译

    2.1. 用交叉编译工具编译zlib,并且把库生成到交叉编译环境的库目录下,我把它放到了/usr/local9/arm/3.4.1/arm-linux目录下。./configure --prefix=/usr/local9/arm/3.4.1/arm-linux。

   再修改(不能跟上面的步骤调转)makefile文件:

   CC=/usr/local9/arm/3.4.1/bin/arm-linux-gcc

   AR=/usr/local9/arm/3.4.1/bin/arm-linux-ar rcs

   RANLIB=/usr/local9/arm/3.4.1/bin/arm-linux-ranlib

 make ,make install ,编译好之后就可以在上面prefix指定的目录下的lib目录下找到libz.a这个库。

   2.2. 编译libid3tag

  ./configure CC=/usr/local9/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local9/arm/3.4.1/arm-linux  --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local9/arm/3.4.1/arm-linux/include LDFLAGS=-L/usr/local9/arm/3.4.1/arm-linux/lib

  其中,--disable-shared --enable-static是指定为静态编译。不过我发现这样并不能够进行编译。至于如何进行表态编译,我将在下面中进行介绍。

  make, make install

 2.3. 编译libmad

  ./configure CC=/usr/local9/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local9/arm/3.4.1/arm-linux  --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local9/arm/3.4.1/arm-linux/include LDFLAGS=-L/usr/local9/arm/3.4.1/arm-linux/lib

  然后,make ,make install 2.4. 编译madplay

  ./configure CC=/usr/local9/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local9/arm/3.4.1/arm-linux  --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local9/arm/3.4.1/arm-linux/include LDFLAGS=-L/usr/local9/arm/3.4.1/arm-linux/lib

  然后,make ,make install

 

 编译完成后,查看了一下madplay这个可执行文件的大小,大概237K左右,我猜想应该是用了动态编译的原因,于是把它下载到板子上试了一下,输入

 $> ./madplay

 ./madplay: /lib/libc.so.6: version `GLIBC_2.3' not found (required by ./madplay)

 我就更加确定上面的--disable-shared --enable-static 参数并没有让它进行静态的编译,后来又用 file madplay试了一下,输出:

 madplay: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped

  果然是动态编译的,那么应该如何进行表静态的编译呢?我在网上找呀,都没有说具体的解决方案,只是说在make之后输出的最后的编译命令后加上- static,开始不太明白,还是以为只是加上--enable-static命令,我又仔细地体会了这句话的意思,后来就按自己的想法试了一下,如下:

 /usr/local9/arm/3.4.1/bin/arm-linux-gcc -Wall -O2 -fomit-frame-pointer -o madplay madplay.o getopt.o getopt1.o version.o resample.o filter.o tag.o crc.o rgain.o player.o audio.o audio_aiff.o audio_cdda.o audio_hex.o audio_null.o audio_raw.o audio_snd.o audio_wave.o audio_oss.o  -L/usr/local9/arm/3.4.1/arm-linux/lib /usr/local9/arm/3.4.1/arm-linux/lib/libmad.a /usr/local9/arm/3.4.1/arm-linux/lib/libid3tag.a -lz -lm -static

 上面这一个命令arm-linux-gcc 的最后一个参数static是我自己加上去的。在终端找上以上命令后,很快就编译完毕了,我又到madplay目录下看一下madplay文件的大小, 820多K!!!,太好了,我知道可能是成功了,就把它下载到板子中,敲入:

 $> ./madplay pig.mp3

 美妙的歌曲荡漾在我的耳边,真是高兴呀!!cheer!

ZZ:http://blog.chinaunix.net/link.php?url=http://drink.me.blog.163.com%2Fblog%2Fstatic%2F2809739320091229532294%2F