OK6410移植madplay播放器,王明学learn
对于ok6410的madplay移植主要包括三部分。声卡驱动移植,播放器的移植,以及alsa库的移植。
一、首先移植声卡驱动以及播放器
ok6410采用WM97系列的声卡芯片,要使得内核支持该驱动,首先需要配置内核:
1.使用飞凌针对ok6410开发板提供的内核,进入内核顶层目录执行命令:
make menuconfig ARCH=arm
进入内核配置菜单,在【Device drivers】->【Sound card support】->【Advance linux sound Architecture】->【ALSA for SOC audio support】目录下面:
选中这两个选项,并保存退出使用命令make uImage,编译内核。完成之后将生成的uImage文件拷贝到要下载内核的目录下
如:cp arch/arm/boot/uImage */tftp
二、madplay播放器的移植
madplay播放器程序主要依赖于如下库:
下面就将这些库安装到根文件系统中:
2.1首先解压这几个库
tar xvzf libid3tag-0.15.1b.tar.gz
tar xvzf libmad-0.15.1b.tar.gz
tar xvzf zlib-1.1.4.tar.gz
2.2紧接着将madplay压缩包解压
tar xvzf madplay-0.15.2b.tar.gz
2.2.1接下来编译、安装zlib
a、进入解压好的zlib源码目录,使用./configure --shared --prefix=*/install 配置文件生成Makefile
--shared表示动态库
--prefix=*/install指明后面执行make install后库和头文件的安装路径,这个路径是自己定义的方便我们提取生的库和文件,这里的install路径是自己创建的文件夹(一般在当前解压好的目录内新建一个文件夹目录)
b、修改生成的Makefile
将Makefile中出现的如下变量修改为:
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc
CPP=arm-linux-gcc -E
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
修改如下:
c、使用命令make编译源码,使用make install 将生成的库和头文件安装到指定的目录下面,这里是之前创建的install这个目录
e、将生成的动态库复制到根文件系统的rootfs/lib目录下面:cp */install/lib/* */rootfs/lib
2.2.2编译,安装libid3tag
a、进入解压好的libid3tag源目录下,使用目录:./configure --host=arm-linux --prefix=${PWD}/install,生成Makefile
其中:--host指明交叉编译工具前缀
--prefix=${PWD}/install指明后面执行make install后库和头文件的安装路径,这里的install虽然不存在但是执行make install后会自动创建
b、使用命令:make编译源码,使用命令:make instal,将生成的库和头文件安装到指定的目录下
c、将生成的动态库复制到根文件系统*/rootfs/lib目录下,使用命令:cp */install/lib/* */rootfs/lib
2.2.3编译、安装libmad
这个编译安装完全可以参考前面的方法,只不过在生成的Makefile中需要把一个目前不在支持的编译选项去掉。在Makefile的129行去掉-fforce-mem这个选项
2.2.4移植madplay播放器
a、进入madplay解压好的源码文件中
b、使用命令: ./configure --host=arm-linux,生成Makefile
c、使用命令;make,编译madplay,即可在madplay源码目录顶层找到生成的播放器主程序madplay
d、使用命令:cp */madplay */rootfs/sbin,将madplay拷贝到开发板的根文件系统目录下
到目前为止我们的播放器程序以及开发板的声卡驱动程序都已经移植好了,当我们为根文件系统放一首以数字或者字母命名的音乐时如:madplay 1.MP3时尽然出现了文件找不到通过分析原来并不是文件找不到而是文件运行所需要的动态库找不到通过查看madplay文件需要的动态库有如下:
其中蓝颜色的是标准的数学库可以在我们PC机的arm-linux-gcc目录下获得,上面两个就是我们在前面移植的那两个库,获取标准数学库的方法(为了避免以后需要时候在复制我们将全部的库都拷贝到我们的开发板目录下):
在使用madplay 1.MP3命令时很多人以为此时我们的音乐播放器已经开始工作了。但是愿望总是美好的,不论是耳机还是喇叭都没有声音出现,那是因为我们还差一项工作需要做,那就是ALSA库和工具移植。
三、ALSA库和工具的移植
由于OK6410的Linux内核虽然有了声卡的驱动,但是并没有ALSA架构需要的应用程序接口库。在用户空间访问声卡的时候需要先经过ALSA库才到内核访问驱动程序,所以我们需要移植ALSA库。而且由于6410使用的是wm9713或者wm9715的声卡,该声卡需要经过特殊的配置才可以使用,否则不能播放声音。
3.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
使用命令:tar jxvf 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
3.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.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.将/usr/local/share/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的文件系统啊!!!在结尾添加
export ALSA_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
i、最后将wm9714.conf这个文件复制到开发板的/etc/目录下面
最后重新启动开发板将我们根文件系统挂在到上去执行:madplay 2.MP3就可以听到歌声了
OK6410移植madplay播放器,王明学learn的更多相关文章
- 基于tiny6410的madplay播放器的移植
在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf zlib-1.1.4.tar ...
- [Linux][Madplay播放器移植mini2440(ARM9)]
Madplay移植到mini2440全过程详解 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1PC环境:RedHat-6 注意:最好在root权限下执行以下移植,否则在ma ...
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
- 信号量进程同步,王明学learn
信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ...
- 静态/动态函数库设计,王明学learn
静态/动态函数库设计 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别: 一.函数库分类 函数库按照链接方式可分为: 1.静态链接库 对函数库的链接是放在编译时期(com ...
- ARM伪指令,王明学learn
ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...
- 消息队列通信,王明学learn
消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...
- 共享内存同行,王明学learn
共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...
- 信号量互斥,王明学learn
信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...
随机推荐
- 【K8s】Kubernetes 最近正在看的资料
中国移动Kubernetes多集群统一管理实践: http://www.tuicool.com/articles/FrqQrqI#c-22517 一种新的进入容器的方式: WebSocket + D ...
- Longest Increasing Path in a Matrix
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- MyBatis <if>标签的一些问题
1.常见错误: There is no getter for property named 'parentId' in 'class java.lang.Long'(或者String) org.myb ...
- linux /usr/bin/ld cannot find 解决
问题: 在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source ...
- zpf 路由功能
2015-4-11 20:51:06 又搞了一天, 解决了一堆bug, 重新规划了类文件夹, 改善自动加载功能 最新的特性就是支持子域名路由了 因为整个框架还在完善当中, 而且里边有好多接口有我自己申 ...
- ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)
两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...
- Java数组的复制Arrays.copyOf()、System.arraycopy()、nums.clone()
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); a ...
- yii php 图片上传与生成缩略图
今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图 ($pic_action_url = $this->createAbsoluteUrl('h ...
- 一个简单的代码计算行数demo编写
最近手头的项目基本上已经完结,历经了5个月的开发和迭代,各种的需求调整,想对自己的代码量进行一个客观的计算,于是抽了点时间写下了这个小demo,朋友们有需要的可以看看,很简单. 基本的思想就是:根目录 ...
- HTML标记语法之图片Img元素
语法:<img src=”xxx.jpg”alt=”xxx”title=”xxx”> 属性可取值如下: 属性名称 属性值 说明 src URL 图片路径 alt 文本 图片无法显示时的文本 ...