二.移植嵌入式播放器 madplay
madplay 播放器程序主要依赖于如下库:
zlib zlib-1.1.4.tar.gz 提供数据压缩用的函式库
libid3tag libid3tag-0.15.1b.tar.gz mp3 文件 id3 标签分析库
libmad libmad-0.15.1b.tar.gz 高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3)
将 sdk 里面 resource 目录的以下内容复制到 Linux 系统中。假设我们复制到/home/Project/Motion/OK6410/Resource 并进入这个目录。
下面就将这些库依次安装到根文件系统中:
1. 文件准备:
将提供的 madplay 目录中的 4 个源码包进行解压,使用命令:
tar -xzf libid3tag-0.15.1b.tar.gz
tar -xzf libmad-0.15.1b.tar.gz
tar -xzf zlib-1.1.4.tar.gz
tar -xzf madplay-0.15.2b.tar.gz
2. 编译、安装 zlib:
a. 进入 zlib 源码目录。使用命令:./configure --shared --prefix=_install,生成Makefile。其中—shared 指明可生成动态库, --prefix=_install 指明后面执行make install 后库和头文件的安装路径,这里指定的_install 由于并不存在,因此需要在 zlib 顶层目录创建,使用命令:mkdir _install,创建该目录。
b. 修改 Makefile,需修改如下内容:
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1
CPP=arm-linux-gcc -E
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
c. 使用命令:make,编译源码
使用命令:make install,将生成库和头文件安装到指定的目录下,当然这里指的是我们之前创建的_install 这个目录。
d. 将生成的动态库拷贝到根文件系统/nfs/rootfs 下的 lib 目录中
使用命令: cp _install/lib/*.so* /nfs/rootfs/lib,当然如果原本就有这些库则不需要拷贝。
e. 将生成的动态库和头文件拷贝到交叉编译工具安装目录下的库和头文件目录中。当然如果原本就有这些库和头文件则不需要拷贝。
例如, 交叉编译工具安装在/opt/EmbedSky/4.3.3 下, 则可使用如下命令进行拷贝:
cp _install/include/*.h /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/include/ -rf
cp _install/lib/* /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/lib/ -rf
3. 编译、安装 libid3tag:
a. 进入 libid3tag 源码目录。使用命令:
./configure --host=arm-linux --prefix=${PWD}/_install,生成 Makefile。其中
--host 指明交叉编译工具前缀,
--prefix=${PWD}/_install指明后面执行 make install 后库和头文件的安装路径,这里指定的_install 虽然并不存在,但在执行 make install 后会自动创建。
b. 使用命令:make,编译源码,使用命令:make install,将生成库和头文件安装到指定的目录下,也就是我们之前创建的_install 这个目录。
c. 将生成的动态库拷贝到根文件系统/nfs/rootfs 下的 lib 目录中,使用命令: cp _install/lib/*.so* /nfs/rootfs/lib,如果原本就有这些库则不需要拷贝。
d. 将生成的动态库和头文件拷贝到交叉编译工具安装目录下的库和头文件目录中。
如果原本就有这些库和头文件则不需要拷贝。
cp _install/include/*.h /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/include/ -rf
cp _install/lib/* /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/lib/ -rf
4. 编译、安装 libmad:
方法参考上一步。 要注意的是在由执行./configure 生成的 Makefile 中需要去掉一个目前的编译器不再支持的编译选项,在 Makefile 的 129 行,去掉-fforce-mem 这个选项。
./configure --host=arm-linux --prefix=${PWD}/_install
Vim Makefile
Make
make install
cp _install/lib/*.so* /nfs/rootfs/lib
cp _install/include/*.h /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/include/ -rf
cp _install/lib/* /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/lib/ -rf
5. 移植 madplay 应用程序:
进入 madplay 源码目录。由于我们前面已经将 madplay 所依赖的动态库拷贝到了根文件系统的/lib 目录下,这里我们只需要编译动态连接的 madplay 程序即可,这样的编译安装将十分简单。
a. 使用命令:./configure --host=arm-linux,生成 Makefile 文件。
b. 使用命令:make,编译 madplay,即可在 madplay 源码目录顶层找到生成的播放器主程序 madplay。
c. 使用命令:cp madplay /nfs/rootfs/sbin,将 madplay 拷贝到开发板根文件系统目录下。
d. 复制 arm-linux-gcc 交叉编译器的 glibc 库文件到开发板的文件系统,交叉编译的 c 库文件在 /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib 目录,进入该目
录之后输入 cp ./* /nfs/rootfs/lib/ -rf 即可
在 PC 的 Linux 中查看 madplay 需要什么动态库
arm-linux-readelf -d madplay
出现如下内容
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libmad.so.0]
0x00000001 (NEEDED) Shared library: [libid3tag.so.0]
0x00000001 (NEEDED) Shared library: [libz.so.1]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
后面内容先不管,可以看到需要 6 个动态库,然后现在去我们的 nfs 文件系统的 lib 目录下检查是不是存在这些动态库。 如果你确实按照步骤一步步做的, 那么是可以发现所有的库一应俱全的。
6.移植 alsa 的接口库和工具包
由于 OK6410 的 Linux 内核虽然有了声卡的驱动, 但是并没有 ALSA 架构需要的应用程序接口库。在用户空间访问声卡的时候需要先经过 ALSA 库才到内核访问驱动程序,所以我们需要移植 ALSA 库。 而且由于 6410 使用的是 wm9713 或者 wm9714 的声卡, 该声卡需要经过特殊的配置才可以使用,否则不能播放声音,这个配置工具需要 alsa-utils 工具集提供。
(1)移植 alsa-lib
a.可以到 http://www.alsa-project.org/main/index.php/Download 下载最新版本的 alsa库(alsa-lib-1.0.29.tar.bz2)和工具包(alsa-utils-1.0.29.tar.bz2) 。
b.解压 alsa-lib-1.0.29.tar.bz2
c.配置 alsa-lib
./configure
--host=arm-linux
--prefix=/usr/local/share/arm-alsa
--enable-shared
--disable-python --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib
CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld
--host :为使用的交叉编译工具名,直接使用 arm-linux 也可以,根据 PC 上安装的交叉编译工具来决定;
--prefix:即 make install 时程序安装的目录,可以根据自己的情况进行修改,不用拘泥
--enable:开启功能 --disable :关闭功能,使用动态库不需要 Python。
--with-configdir: alsa 配置文件所在目录,本目录要定好位置,交叉编译过后,移植到板子上时要和 PC 上路径一致。也即是说如果配置的时候指定的是/usr/local/share/alsa目录, 那么你的配置文件在开发板上的绝对路径也要是/usr/local/share/alsa。 默认 alsa 配置文件会在安装目录里。这个很重要,不能PC和开发板两边不匹配。
--with-plugindir: alsa_lib 所在目录, 目前意义不明, 可以自由定位, 也可以默认安装,先不用管。但是这里指定的目录会产生必要的库文件,放到开发板的时候也要路径和 PC 一样。
d.编译安装
make
make install
(2)移植 alsa-utils
a.解压以后进入解压得到的目录
b.配置
./configure --host=arm-linux --prefix=/usr/local/share/arm-alsa
CFLAGS='-I/usr/local/share/arm-alsa/include' LDFLAGS='-L/usr/local/share/arm-alsa/lib
-lasound' --disable-alsamixer --disable-xmlto
--with-alsa-inc-prefix=/usr/local/share/arm-alsa/include
--with-alsa-prefix=/usr/local/share/arm-alsa/lib CC=arm-linux-gcc CXX=arm-linux-g++
LD=arm-linux-ld
CFLAGS:编译工具需要要的头文件目录,也就是前面编译库文件得到的头文件
LDFLAGS:编译工具需要要的库文件目录,也就是前面编译库文件得到的库文件
--with-alsa-inc-prefix:和 CFLAGS 一样--with-alsa-prefix:和 LDFLAGS 一样。
c.编译和配置
make
make install
(3)部署文件到开发板
进入到PC的/usr/local/share 目录(之前配置时候指定的,根据你的配置选项决定) ,因为我们所有的安装目录都在这个目录下。
a.将/usr/local/share 目录下的 alsa,arm-alsa 拷贝到开发板的/usr/local/share 目录下
cp ./alsa /home/OK6410/rootfs/usr/local/share -rfa
cp ./arm-alsa /home/OK6410/rootfs/usr/local/share -rfa
b.将/usr/local/lib 目录下的 alsa_lib 拷贝到开发板上/usr/local/lib(自己先创建)目录下
cp ./alsa_lib /home/OK6410/rootfs/usr/local/lib/ -rfa
c.将 arm-alsa/lib 目录下的文件拷贝到开发板根文件系统的/lib 目录下
cp ./arm-alsa/lib/* /home/OK6410/rootfs/lib –rfa
d.将 arm-alsa/bin 目录下的文件拷贝到/sbin 目录下
cp ./arm-alsa/bin/* /home/OK6410/rootfs/bin -rfa
e.将 arm-alsa/sbin 目录下的文件拷贝到/sbin 目录下
cp ./arm-alsa/sbin/* /home/OK6410/rootfs/bin -rfa
f.添加环境变量,编辑开发板的文件系统里的/etc/profile,切记是开发板的文件系统不是PC 的文件系统啊! ! !在结尾添加
exportALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf
g.复制声卡需要的配置文件
由于 wm9713/9714 需要特殊配置,所以我们在移植了 alsa-util 以后便可以利用这个工具集中的alsactl对wm9714/9713进行配置, 配置所需要的配置文件在SDK的wm9713目录下。将他复制到开发板的/etc 目录即可。
h. 修改系统初始化脚本
由于 alsa 架构的库和程序要去访问/dev/snd 目录下的这些文件
controlC0 pcmC0D0c pcmC0D0p seq timer
但是实际上我们使用的内核和文件系统并没有/dev/snd 这个目录, 而是直接把这些设备结点创建在/dev 目录,所以需要我们手动创建,并将设备结点进行硬链接。因此我们在初始化脚本里面完成这个任务,在开发板文件系统里的/etc/init.d/rcS 加上如下内容。
mkdir /dev/snd
ln /dev/controlC0 /dev/snd/controlC0
ln /dev/pcmC0D0c /dev/snd/pcmC0D0c
ln /dev/pcmC0D0p /dev/snd/pcmC0D0p
ln /dev/timer /dev/snd/timer
ln /dev/seq /dev/snd/seq
amixer cset numid=86 2
amixer cset numid=87 2
alsactl restore -f /etc/wm9714.conf
最后一步对声卡进行配置,这是关键的关键,没有成功执行这一步,虽然你的播放工具在播放音乐但是不会有声音! ! ! ! !
通过 samba 从 windows 复制一首 MP3 后缀的歌曲到 PC 的 Linux 中 nfs 文件系统根目录,重命名为 1.MP3, (因为中文在开发板不好操作。 )在开发板的文件系统里进行测试madplay。在串口里面输入madplay 1.mp3 就可以听到悦耳的歌曲了, (请插上耳机。 )虽然有可能会输出乱码但是哦我们现在不关心,那是输出歌曲的信息,如果有中文的话由于开发板对中文的支持我们没有完善所以会乱码,你要是嫌麻烦,可以这样做。
madplay 1.mp3>> mp3_log.txt 2>&1 或者 madplay –Q 1.MP3
然后就不会出现那些烦心的乱码信息了。如果没有播放成功,提示找不到 madplay,表示移植有问题,请思考是不是把所有的动态库都复制完全了!