———————————————————————————————————————
主机操作系统:Centos 6.7
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: linux-3.0
开发模块: s3c2440 uda1341声卡驱动与madplay播放器移植
邮箱:leiyuxing205@gmail.com
———————————————————————————————————————
一、在初始化文件中加入UDA1341 设备结构
下图为FL2440开发板原理图uda1341ts部分,确认管脚。
Linux-3.0 已经完美的支持UDA1341 音频芯片的驱动。 UDA1341音频芯片,走的标准的IIS总线,Linux中对IIS及UDA1341的支持已经非常完善了,我们只需要将相应的IIS管脚设置为我们开发板的原理图设计的管脚就可以了。我们只要在/arch/arm/mach-s3c2440/mach-smdk2440.c文件中注册UDA1341 平台设备的控制端口就可以了,端口如上图所示,打开mach-smdk2440.c,添加如下内容:
[leiyuxing@centos6 linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
--- mach-smdk2440_o.c 2016-08-12 17:39:20.492017397 +0800
+++ mach-smdk2440.c 2016-08-12 18:26:01.457015793 +0800
@@ -60,6 +60,7 @@58 #include <linux/delay.h>5960+ #include <sound/s3c24xx_uda134x.h>61 //#include <mach/gpio-nrs.h>62 #include <plat/common-smdk.h>6364 #include <linux/dm9000.h>6566 /* add DM9000 ethernet drivers ,whitch is bodify by liuchengdeng */
@@ -206,8 +206,32 @@
206
207+ static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
208 +.l3_clk = S3C2410_GPB(4),
209 +.l3_data = S3C2410_GPB(3),
210 +.l3_mode = S3C2410_GPB(2),
211 +.model = UDA134X_UDA1341,
212 +};
213
214 +static struct platform_device s3c24xx_uda134x = {
215 +.name = "s3c24xx_uda134x",
216 +.dev = {
217 +.platform_data = &s3c24xx_uda134x_data,
218 +}
219 +};
220
221 +static struct platform_device uda1340_codec = {
222 +.name = "uda134x-codec",
223 +.id = -1,
224 +};
225
226 static struct platform_device *smdk2440_devices[] __initdata = {
227 &s3c_device_ohci,
228 &s3c_device_lcd,
229 &s3c_device_wdt,
230 &s3c_device_i2c0,
231 &s3c_device_iis,
232 &s3c_device_dm9000,
233 + &uda1340_codec,
234 + &s3c24xx_uda134x,
235 + &samsung_asoc_dma,
236 };
注意:上述添加的各类结构体均要放在添加设备的devices[ ]结构体数组之前,否则会出现未定义,以及定义了没使用等错误。因为编译器是按顺序编译,所以声明必须放在结构体或者函数之前。
[leiyuxing@centos6 linux-3.0]$ make
二、在内核中配置uda1341设备驱动
要注意的是,这里的OSS 接口其实是基于ALSA 接口创建的,因为新的内核中现在都已经改用ALSA 设计,这里是为了和以前的软件兼容才这样做的内核配置如下
[leiyuxing@centos6 linux-3.0]$ make menuconfig
make之后将得到的新内核烧进开发板,若在启动过程打印的内核信息中有以下的声卡信息则表明声卡驱动添加成功
开发板输入>: cat /proc/devices 命令会出现如下信息
。。。。。。7 vcs10 misc13 input14 sound21 sg29 fb89 i2c90 mtd。。。。。。
三、mdplay移植和播放MP3音乐
(一)移植前的准备
所需源码包
madplay-0.15.2b.tar.gz //播放程序的压缩包,MP3播放器的源码,下载地址 https://sourceforge.net/projects/mad/files/
libmad-0.15.1b.tar.gz //madplay的库文件 ,下载地址 https://sourceforge.net/projects/mad/files/libmad/0.15.1b/libmad-0.15.1b.tar.gz/download?use_mirror=jaist
libid3tag-0.15.1b.tar.gz //mp3的解码库,下载地址http://download.csdn.net/detail/qin1174586290/6364763
zlib-1.1.4.tar.gz //用于文件的压缩与解压,下载地址http://zlib.net/fossils/
创建文件夹用来存放源码包:
[leiyuxing@centos6 linux-3.0]$ cd[leiyuxing@centos6 ~]$ cd fl2440/3rdparty/[leiyuxing@centos6 3rdparty]$ mkdir uda1341[leiyuxing@centos6 3rdparty]$ cd uda1341/[leiyuxing@centos6 uda1341]$ mkdir mad
将上述源码包下载到uda1341文件夹下,用tar -xzf 指令解压(由于是.tar.gz格式)
[leiyuxing@centos6 uda1341]$ tar -xzf libmad-0.15.1b.tar.gz[leiyuxing@centos6 uda1341]$ tar -xzf libid3tag-0.15.1b.tar.gz[leiyuxing@centos6 uda1341]$ tar -xzf madplay-0.15.2b.tar.gz[leiyuxing@centos6 uda1341]$ tar -xzf zlib-1.1.4.tar.gz[leiyuxing@centos6 uda1341]$ lslibid3tag-0.15.1b libmad-0.15.1b.tar.gz madplay-0.15.2b.tar.gzlibid3tag-0.15.1b.tar.gz mad zlib-1.1.4libmad-0.15.1b madplay-0.15.2b zlib-1.1.4.tar.gz
移植第三方程序的主要步骤分别为:解压缩、配置(./configure)、编译(make)、安装(make install)
一般源码包解压缩之后,若已经存在Makefile则可以直接make编译;但大多数情况下需要使用源码包目录下的./configure脚本来配置源码包生成Makefile文件;
以下几个配置参数:
--host: 用于指定平台;如: --host==arm-linux
--prefix: 用于指定文件的安装路径; 如:--prefix=/home/leiyuxing/fl2440/3rdparty/uda1341/mad
-I : 指定头文件的路径; 如:-I/home/leiyuxing/fl2440/3rdparty/uda1341/mad/include
-L : 指定库文件的路径;如:-L
/home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib--disable-shared 使用静态库编译
LDFLAGS:告诉链接器从哪里寻找库文件
CPPFLAGS 是编译选项,同自己用的编译器有关 可以 用于 C 和 C++ 两者预编处理
如果是要编译到arm板子上跑则在make的时候还需要加上AR(将.o文件打包生成.a的静态库文件)= LD(所链接)= CC(交叉编译器)= RANLIB(随机库创建器) AS(汇编器)= NM(库查看工具)
(二)配置,编译
注意:以下的步骤不能打乱,因为其中有依赖关系;还有每次都需要使用sudo权限,否则可能因权限不够而出错。
1.编译zlib-1.1.4
[leiyuxing@centos6 uda1341]$ cd zlib-1.1.4
(1)配置configure文件,生成Makefile
[leiyuxing@centos6 zlib-1.1.4]$ sudo ./configure --prefix=/home/leiyuxing/fl2440/3rdparty/uda1341/madChecking for gcc...Building static library libz.a version 1.1.4 with gcc.Checking for unistd.h... Yes.Checking for errno.h... Yes.Checking for mmap support... Yes.
(2)修改Makefile文件
[leiyuxing@centos6 zlib-1.1.4]$ vim Makefile
(3)编译make
[leiyuxing@centos6 zlib-1.1.4]$ sudo make
(4)安装make install
[leiyuxing@centos6 zlib-1.1.4]$ sudo make installcp zlib.h zconf.h /home/leiyuxing/fl2440/3rdparty/uda1341/mad/includechmod 644 /home/leiyuxing/fl2440/3rdparty/uda1341/mad/include/zlib.h /home/leiyuxing/fl2440/3rdparty/uda1314/mad/include/zconf.hcp libz.a /home/leiyuxing/fl2440/3rdparty/uda1341/mad/libcd /home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib; chmod 755 libz.acd /home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib; if test -f libz.so.1.1.4; then \rm -f libz.so libz.so.1; \ln -s libz.so.1.1.4 libz.so; \ln -s libz.so.1.1.4 libz.so.1; \(ldconfig || true) >/dev/null 2>&1; \fi
2.编译libid3tag-0.15.1b
[leiyuxing@centos6 uda1341]$ cd libid3tag-0.15.1b[leiyuxing@centos6 libid3tag-0.15.1b]$ sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/leiyuxing/fl2440/3rdparty/uda1341/mad CPPFLAGS=-I/home/leiyuxing/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib[leiyuxing@centos6 libid3tag-0.15.1b]$ sudo make[leiyuxing@centos6 libid3tag-0.15.1b]$ sudo make install
3.编译libmad-0.15.1b
[leiyuxing@centos6 libmad-0.15.1b]$ cd libmad-0.15.1b[leiyuxing@centos6 libid3tag-0.15.1b]$ sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/leiyuxing/fl2440/3rdparty/uda1341/mad CPPFLAGS=-I/home/leiyuxing/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib[leiyuxing@centos6 libmad-0.15.1b]$ sudo make
若出现以下错误:
解决:找到libmad configure之后的Makefile,删除 -fforce-mem原因是gcc 3.4 或者更高版本,已经将其去除了,所以会出现上面的错误!
[leiyuxing@centos6 libmad-0.15.1b]$ vim Makefile
删除后再执行一次sudo make
[leiyuxing@centos6 libmad-0.15.1b]$ sudo make install
4.安装madplay
[leiyuxing@centos6 uda1341]$ cd madplay-0.15.2b[leiyuxing@centos6 madplay-0.15.2b]$ sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/leiyuxing/fl2440/3rdparty/uda1341/mad CPPFLAGS=-I/home/leiyuxing/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib[leiyuxing@centos6 madplay-0.15.2b]$ sudo make
make成功生成madplay可执行程序.因为自己使用的静态编译(--disable-shared),可不用再make install,直接将 madplay下载到开发板/bin路径下后给予权限即可
[leiyuxing@centos6 madplay-0.15.2b]$ du -h madplay716K madplay[leiyuxing@centos6 madplay-0.15.2b]$ file madplaymadplay: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
(三)、上传开发板测试
将madplay传上电脑,接着使用Tftpd32软件和网线实现电脑与开发板互传
在开发板上执行
>: cd bin/>: tftp -gr madplay 192.168.1.2 >: chmod a+x madplay
>: cd >: tftp -gr shaletaiduodeleidi.mp3 192.168.1.2>: madplay shaletaiduodeleidi.mp3MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.Title: 贩贩贩?Artist:贩?Album:贩贩Genre: Blues
按键盘的减号可以减小音量,shift+可以增大音量,shift-瞬间恢复满音量,s键停止
OK!!!
遇到的问题:
问题一:
解决方法:
找到libmad configure之后的Makefile,删除 -fforce-mem原因是gcc 3.4 或者更高版本,已经将其去除了,所以会出现上面的错误!
问题二:
>: madplay shaletaiduodeleidi.mp3
madplay: can't load library 'libiconv.so.2'
解决方法:
先找到交叉编译下少的库
[leiyuxing@centos6 opt]$ find -iname libiconv.so.2./buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/sysroot/usr/lib/libiconv.so.2./buildroot-2012.08/output/target/usr/lib/libiconv.so.2./buildroot-2012.08/output/build/libiconv-1.14/lib/.libs/libiconv.so.2[leiyuxing@centos6opt]$ sz ./buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclinueabi/sysroot/usr/lib/libiconv.so.2
再拷到开发板的lib下
>: cd lib/>: tftp -gr libiconv.so.2 192.168.1.2libiconv.so.2 100% |*******************************| 930k 0:00:00 ETA