移植 Mplayer
1 移植 ALSA
ALSA 是Advanced Linux Sound Architecture ,高级Linux 声音架构的简称, 它在Linux 操作系统上提供了音频和MIDI (Musical Instrument Digital Interface ,音乐设备数字化接口)的支持。在2.6 系列内核中,ALSA 已经成为默认的声音子系统,用来替换2.4 系列内核中的OSS (Open Sound System ,开放声音系统)。
1.1 获取源码
从网站 http://www.alsa-project.org/main/index.php/Download 下载alsa-lib-1.0.23.tar.bz2 源码,拷贝到/opt/transplants 目录下 。
1.2 修改并配置源码
解压源码包
# cd /opt/transplants
# tar jxvf alsa-lib-1.0.23.tar.bz2
解压后生成目录alsa-lib-1.0.23 。
进入目录后进行配置
# ./configure --host=arm-none-linux-gnueabi --target=arm-linux --prefix=/alsa-lib --enable-shared --disable-python --with-configdir=/alsa --with-plugindir=/usr/lib/alsa-lib
--host 配置交叉编译工具链;--prefix 配置编译生成库的存放目录。--with-configdir 配置库在开发板文件系统中的存放目录
1.3 编译并安装源码
编译安装
#make
#make install
成功后在系统根目录下生成/alsa-lib 目录;在/usr/share/ 目录下生成alsa 目录。
将/alsa-lib 目录下所有文件拷贝到/opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr 目录下,为编译mplayer 做准备。
# cp /alsa-lib/** /opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr -raf
将/alsa-lib 目录下所有文件拷贝到开发板文件系统/usr 目录下
将/usr/share/alsa 目录拷贝到开发板文件系统/usr/share 目录下
在开发板文件系统/etc/profile 添加如下内容
mkdir /dev/snd
ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c
ln -s /dev/pcmC0D0p /dev/snd/pcmC0D0p
ln -s /dev/controlC0 /dev/snd/controlC0
ln -s /dev/pcmC1D0c /dev/snd/pcmC1D0c
ln -s /dev/pcmC1D0p /dev/snd/pcmC1D0p
ln -s /dev/controlC1 /dev/snd/controlC1
ln -s /dev/seq /dev/snd/seq
ln -s /dev/timer /dev/snd/timer
ALSA 库移植完毕。
NOTE : 开发板文件系统没有的目录请用户根据需要自行创建。
2 移植 LIBMAD 库
去网站 http://sourceforge.net/projects/mad/files/ 下载libmad-0.12.1b.tar.gz 源码,拷贝到/opt/transplants 目录下。
2.1 修改并配置源码
解压源码包
# cd /opt/transplants
# tar xzvf libmad-0.12.1b.tar.bz2
解压后生成目录libmad-0.12.1b 。
进入目录后进行配置
# ./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix =/opt/libmad CC="arm-linux-gcc"
--host 配置交叉编译工具链;--prefix 配置编译生成库的存放目录。 disable-shared这个选项就是说明要静态编译
CC=arm-linux-gcc(要保证 arm-linux-gcc的路径已经有 export过,否则给出完整路径。)
2.2 编译并安装源码
编译安装
#make
#make install
NOTE : 编译过程遇到与”-fforce-mem” 相关的错误,打开Makefile 找到CFLAGS 变量,将它的-fforce-mem 选项去掉即可。
成功后生成/opt/libmad 目录。
将/opt/libmad 目录下所有文件拷贝到/opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr 目录下,为编译mplayer 做准备。
# cp /opt/libmad/** /opt/Tools/arm-2009q1/arm-none-linux-gnueabi/libc/usr -raf
将/opt/libmad 目录下所有文件拷贝到开发板文件系统/usr 目录下。
NOTE : 开发板文件系统没有的目录请用户根据需要自行创建。
3 移植 Mplayer
首先到网上 http://www.mplayerhq.hu/design7/dload.html
下载 MPlayer-1.0rc1.tar.bz2,解压后生成 MPlayer-1.0rc1。 拷贝到/opt/transplants 目录下。
3.1 进入目录后进行配置
#./configure --host-cc=gcc --cc=arm-none-linux-gnueabi-gcc --target=arm-armv4-linux --prefix=/tmp/mplayer --disable-win32dll --disable-dvdread --enable-fbdev --disable-mencoder --enable-mad
在make 的时候会出现如下错误: storage size of sd isn't known
解决方法:在configure 参数选项加上--disable-ivtv
期间会提示以下错误:
ioctl.c:273:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:446:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:610:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:734:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:868:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1001:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1130:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1241:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1378:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1515:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1670:5: #error "DVD ioctls are unavailable on this system"
ioctl.c:1797:5: #error "DVD ioctls are unavailable on this system"
到 ioctl.c 中注释这些语句即可编译通过
3.2 编译并安装源码
编译安装
# make
成功后本目录下mplayer 可执行文件。
将mplayer 文件拷贝到开发板文件系统/opt 目录下。
NOTE : 开发板文件系统没有的目录请用户根据需要自行创建。
3.3 测试验证
上述操作结束,接下来就是测试了,我有两个开发板,一个是友善的tiny6410 和MagicARM2410 (学校的板子) ,我先测试tiny6410(内核是2.6的)拷贝几个avi格式的文件,放在开发板文件系统/opt目录下。
启动板卡进入系统。
Target# cd /opt
Target# ./mplayer tm.avi
有 画面而且有声音。
然后我在 MagicARM2410 上测试,结果打印出几行信息后就停止不动了,一开始我想是平台的原因无法播放,于是我参照另一篇 2410 的移植文档重新编译 mplayer : ( 编译用的 arm-linux-gcc 版本是 3.4.1)
1. 安 装 libmad 库,下载 libmad-0.15.1b.tar.bz2 ,解压,配置:
./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging –prefix=/usr/local/arm/3.4.1/lib CC=arm-linux-gcc
其中 --prefix=/usr/local/arm/3.4.1/lib 指明 libmad 库和头文件在哪个目录生成。
然后 make ,完成后 make install ,之后再 /usr/local/arm/3.3.2/lib 中就会出现 lib 和 include 两个文件夹 。
2. 接着开始安装 Mplayer-1.0rc2 ,下载 MPlayer-1.0rc2.tar.bz2 ,解压,配置:
./configure --cc=arm-linux-gcc --target=arm-linux --enable-static --prefix=/tmp/mplayer-rc2 --disable-win32dll --disable-dvdread --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib --enable-mad --enable-libavcodec_a --language=zh_CN --disable-armv5te --disable-armv6 --with-extraincdir=/usr/local/arm/3.4.1/lib/include --with-extralibdir=/usr/local/arm/3.4.1/lib/lib
参数解释:
--cc
交叉编译工具,如果没添加到环境变量,就要指定完整路径
--target
在 pre 版本中,对于 --target 和这个配置参数是这样描述的:
===============================================
--target=arm- armv4l-linux 这个参数要注意的是一个分三部分,第一部分的 arm 是指 arch ,这里设定为 arm ;第二部分的 armv4l 是指具体的版本,这 个要注意了,一定要跟 libavcodec 目录下的平台目录名一致,否则为这个平台的优化代码没办法编译进去 ( 据我观察是这样的 ) ;第三部分是系统平台。
===============================================
但是在 rc2 版本中,只需要 --target=arm-linux 这样指定就好了。
--enable-static
是设定静态连接,不需要一堆乱七八糟的动态库,尤其对我们这些新手来说省了很多的麻烦。如果设置了这个参数就不用设置 --prefix 了,另外也不用执行 make install 。
--prefix=/tmp/mplayer-rc2
make install 后,可执行程序就安装在 /tmp/mplayer-rc2 目录下。
--disable-win32dll
禁用 win32 动态链接库支持。在 pre 版本中该参数为
--disable-dvdread
禁用 libdvdread.
--enable-fbdev
支持 fbdev ,这个一定要选上。
--disable-mp3lib 和 --enable-mad
arm 系列的 cpu ,一般都没 浮点运算 单元,而 mplayer 的 mp3 解码默认使用 mp3lib ,这个是 浮点运算 库,在 arm 上肯定跑不了,使用 ffmp3 或者libmad( 需要外部库 libmad 支持 ) 应该就没问题了。所以这里需要禁止掉 mencoder 和使能 libmad 。
--disable-mencoder
禁止编码功能。项目上不需要此功能,禁掉以缩小尺寸。而且听说在这里编译 mencoder 会有问题,听说而已,没试过。
--disable-live
禁止 live 555 流媒体。(不知道干啥用)
--enable-libavcodec_a
启用静态的 libavcodec 解码。在 pre 版本中该参数为 --enable-libavcodec 。
--disable-armv5te --disable-armv6
禁用 armv5te 、 armv6 指令扩展。
--with-extraincdir 和 -with-extralibdir
指定 libmad 和 mad.h 的路径。 mad 的路径被添加到编译参数 -I 和 -L 后面,替换 libmad 后需要指定。
注:在 pre 版本中需要指定 --host-cc=gcc 配置参数。用来编译一些需要在 host 上执行的中间文件的,如 codec-cfg ,切记不能缺少。但在 rc2 版本中该参数可以省略掉。
./configure 之后就开始 make 了。
我们编译时遇到一个错误,是关于 codecs-cfg 和 builtin 什么的错误,解决方法是修改 Makefile ,将 $(HOST_CC) 改为 gcc 命令所在的绝对路径,比如在 fc8 里面就是 /usr/bin/gcc 。
编译好以后生成 mplayer 的可执行文件,拷到 U 盘里。在 2410 板子上运行时基本上什么格式的文件都不行正常播放,于是我试着把声音关掉,竟然可以播放了,但是很卡,所以应该是 音频的驱动的问题,参照网上的说法:
现在大部分的嵌入式板子都使用菲利普 uda1341 音频芯片,因而也都使用了相同一个音频驱动,即 MIZI 公司拥有版权的 linux uda1341 音频驱动,这个驱动基本上符合了 oss 的规范,但是当使用到多段 DMA 音频数据传输时,出现了一个问题,即 DMA 缓冲的建立发生在第一次调用 write ()函数将音频数据传送到设备描述符的时候,然而 oss 驱动的调用者通常要在打开音频设备描述时候,就期望获取 DMA 缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为 0 这个结果 。
要修改音频驱动源码的 smdk2410_audio_open ()函数。可是我的 linux 内核是 2.4 版本的,修改了这个函数依然没用,没办法只能移植内核 2.6 了。
接着下篇:我的 linux2.6 内核移植过程