ok6410的madplay配置
二.移植嵌入式播放器 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,表示移植有问题,请思考是不是把所有的动态库都复制完全了!
ok6410的madplay配置的更多相关文章
- OK6410移植madplay播放器,王明学learn
对于ok6410的madplay移植主要包括三部分.声卡驱动移植,播放器的移植,以及alsa库的移植. 一.首先移植声卡驱动以及播放器 ok6410采用WM97系列的声卡芯片,要使得内核支持该驱动,首 ...
- linux 内核移植
1. 下载内核源码linux-2.6.34,解压到工作目录下. 2. 首先在内核中增加一个 SOC ,到 /arch/arm/mach-s3c64xx 下将mach-smdk6410.c 复制成 ma ...
- 1-1. OSS/ALSA 声卡的驱动与配置和 Madplay 嵌入式播放器的移植
报警子系统 一. OSS/ALSA 声卡的驱动与配置 声卡驱动中传统的OSS构架在02年被收购后即不开源,并且OSS的混音效果不好->因此ALSA构架孕育而生. ALSA(高级音频构架,目前应用 ...
- 基于tiny6410的madplay播放器的移植
在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf zlib-1.1.4.tar ...
- 【整理】--【GPIO】OK6410
S3C6410的GPIO引脚相对来说比较多,而且大部分引脚都具有多重复用功能,如何在linux上用最简单的方式来控制GPIO这需要我们好好研究一下底层的代码了,其实方法有很多种,鉴于在操作系统端控制G ...
- 1.ok6410移植bootloader,移植u-boot,学习u-boot命令
ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的. 一.配置编译u-boot A. 解压 u-boot 压缩文件 B. 进入解压生 ...
- 【原创】-- nfs安装配置及使用,挂载根文件系统
环境:ubuntu14.04(非虚拟机),OK6410 环境搭建: (1) #sudo apt-get install nfs-kernel-server 如果已经是最新版本了,无需安装 (2) 建立 ...
- ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
继ok6410 u-boot-2012.04.01移植四.五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的n ...
- 开源mp3播放器--madplay 编译和移植 简记
madplay是一款开源的mp3播放器. http://madplay.sourcearchive.com/ 下面简单记录一下madplay的编译与移植到ARM开发板上的过程 一.编译x86版本的ma ...
随机推荐
- The Ninth Hunan Collegiate Programming Contest (2013) Problem H
Problem H High bridge, low bridge Q: There are one high bridge and one low bridge across the river. ...
- java.io.Serializable浅析
转自:http://www.cnblogs.com/gw811/archive/2012/10/10/2718331.html Java API中java.io.Serializable接口源码: p ...
- C#数字图像处理算法学习笔记(三)--图像几何变换
C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:
- memcached学习(5). memcached的应用和兼容程序
mixi在提供服务的初期阶段就使用了memcached. 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached. 此外,我们也从增加可扩展性的方面进行了验证 ...
- Google Protocol Buffer 协议
1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...
- PAT1025. PAT Ranking
/因为这道题之前做过一次,看了别人的算法思想用local跟galobal排序并插入,所以一写就是照着这个思想来的,记得第一次做的时候用sort分段排序,麻烦要记录起始位置,好像最后还没A,这次用别人的 ...
- Oracle笔记 十三、PL/SQL面向对象之package
--将方法和过程用包定义 create or replace package pkg_emp as --输入员工编号查询出员工信息 procedure pro_findInfo( in_empno e ...
- JMeter笔记3:聚合报告之90%Line参数说明
看看JMeter 官网是怎么说的? 90% Line - 90% of the samples took no more than this time. The remaining samples a ...
- EnCase v7 could not recognize Chinese character folder names / file names on Linux Platform
Last week my friend brought me an evidence file duplicated from a Linux server, which distribution i ...
- poj3122 pie
方法:二分. 题目意思:要过生日了,我请大家吃pie,然后人数一共是f+1(我自己).每个人的pie不能是拼接的,而且每个人的面积是一样的,这样就用二分枚举. 范围是0-最大的那块pie. 然后用每一 ...