s3c2440之uda1341声卡驱动以及madplay播放器移植

来源:互联网 发布:js onclick事件传参 编辑:程序博客网 时间:2024/05/17 01:29

===================================================

主机操作系统:Centos 6.7 
交叉编译器环境:arm-linux-gcc-4.5.4 (可通过命令/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -v查询)
开发板平台: fl2440 
Linux内核版本: linux-3.0 .54

===================================================================

一、fl2440底板关于I2S原理图:


      该驱动是基于I2S总线的。即IIS(Inter-IC Sound bus)。
      IIS总线只处理声音数据。其他信号(如控制信号)必须单独传输。为了使芯片的引出管脚尽可能少,IIS只使用了三根串行总线。这三根线分别是:提供分时复用功能的数据线、字段选择线(声道选择)、时钟信号线。上图三个引脚就是我们待会需要加入代码中的引脚。
      ALSA Advanced Linux Sound Architecture(高级Linux声音体系)的缩写)是为声卡提供驱动的Linux内核组件。一部分的目的是支持声卡的自动配置,以及完美的处理系统中的多个声音设备,这些目的大多都已达到。另一个声音框架JACK使用 ALSA 提供低延迟的专业级音频编辑和混音能力。ALSA是一个完全开放源代码的音频驱动程序集,而且完全兼容OSS

OSSOpen Sound System)是 linux 平台上一个统一的音频接口即只要音频处理应用程序按照OSSAPI来编写,那么在移植到另外一个平台时,只需要重新编译即可。值得注意的是OSS只是部分开源。无论是选择ALSA还是OSS都是为了一个目的:将声卡抽象为一个统一的设备供linux程序员使用。我们前期测试选用的OSS系列。


二、修改mach-smdk2440.c 
 
        如今的Linux内核,已经完美的支持UDA1341 音频芯片的驱动, 我们只要在arch/arm/mach-s3c2440/mach-smdk2440.c 文件中注册UDA1341 平台设备的控制端口就可以了。在此贴上我的补丁文件。因为之前添加过dm9000的驱动,所以含有dm9000驱动部分的修改可忽略。
 [yangni@yangni  linux-3.0.54]$vim arch/arm/mach-s3c2440/mach-smdk2440.c
--- smdk2440.c2012-12-03 12:59:38.000000000 -0800+++ mach-smdk2440.c2017-04-12 11:40:02.691913086 -0800@@ -44,9 +44,13 @@ #include <plat/clock.h> #include <plat/devs.h> #include <plat/cpu.h>+//add+#include <sound/s3c24xx_uda134x.h>               //添加声卡头文件  #include <plat/common-smdk.h> +#include <linux/dm9000.h>  //添加DM9000网卡的头文件+ static struct map_desc smdk2440_iodesc[] __initdata = { /* ISA IO Space map (memory space selected by A24) */ @@ -102,6 +106,50 @@ } }; + +/*  add DM9000 ethernet drivers ,whitch is bodify by liuchengdeng  */++#define DM9000_BASE    (S3C2410_CS4 + 0x300) +static struct resource s3c_dm9000_resource[] = { +    [0] = { +            .start = DM9000_BASE,+            .end   = DM9000_BASE + 3,+            .flags = IORESOURCE_MEM +          },+    [1] = { +            .start = DM9000_BASE + 4,+            .end   = DM9000_BASE + 7, +            .flags = IORESOURCE_MEM+          },+    [2] = {  +            .start = IRQ_EINT7,+            .end   = IRQ_EINT7,+            .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, +          }++};+++static struct dm9000_plat_data s3c_dm9000_pdata = {+    .flags      = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),+};++static struct platform_device s3c_device_dm9000 = {+    .name       = "dm9000",+    .id     = -1,+    .num_resources  = ARRAY_SIZE(s3c_dm9000_resource),+    .resource   = s3c_dm9000_resource,+    .dev        = { +        .platform_data  = &s3c_dm9000_pdata,+        },+};+++/*********END********/++++ /* LCD driver info */  static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {@@ -149,18 +197,45 @@ .lpcsel= ((0xCE6) & ~7) | 1<<4, }; +//add uda134X+static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = { +    .l3_clk = S3C2410_GPB(4),  +    .l3_data = S3C2410_GPB(3),    //这里添加了我们在原理图上的三个引脚+    .l3_mode = S3C2410_GPB(2),  +    .model = UDA134X_UDA1341,  +};++static struct platform_device s3c24xx_uda134x = {  +    .name = "s3c24xx_uda134x",         //添加设备名,以便与驱动匹配+    .dev = { +        .platform_data = &s3c24xx_uda134x_data,  +    }+};++static struct platform_device uda1340_codec = {+    .name = "uda134x-codec",  +    .id = -1,+};++//+static struct platform_device *smdk2440_devices[]  __initdata = { &s3c_device_ohci, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis,+    &s3c_device_dm9000,    +    //add+    &uda1340_codec,  +    &s3c24xx_uda134x,          //把添加好的结构体加入smdk设备内+    &samsung_asoc_dma,   };  static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));-s3c24xx_init_clocks(16934400);+//s3c24xx_init_clocks(16934400);+  s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); } 
      这里修改其实主要概括起来就三个步骤:
  1. 添加头文件
  2. 添加相关设备结构体
  3. 将设备结构体加入主设备结构体

三、修改内核配置文件:
      主要是为了添加声卡的相关支持。
[yangni@yangni linux-3.0.54]$ export TERM=vt100
[yangni@yangni linux-3.0.54]$ make menuconfig
        进入选项  Device Drivers  ---> 
<*> Sound card support  --->  
       <*>   Advanced Linux Sound Architecture  --->  
 
按照上图选中相关项,然后进入ALSA for SoC audio support 继续配置相关选项:


    配置完成后,保存退出,然后make。
    make成功后将内核下载到开发板上,并且烧录文件系统。启动开发板后,看到如下打印信息就可以确定添加驱动成功了。如果显示sound cards not found则表示没有成功。


  当然,你也可以在开发板上通过cat /proc/devices命令查看声卡驱动。


四、移植madplay播放器:
      移植第三方程序的主要步骤分别为:解压缩、配置(./configure)、编译(make)、安装(make install)
(一)准备源码包:
    移植之前我们需要下载四个源码包,这里个源码包在网上搜索,都可以找到,在C论坛下载频道都有资源。
madplay-0.15.2b.tar.gz, //播放程序的压缩包,MP3播放器的源码
libmad-0.15.1b.tar.gz,    //madplay的库文件
libid3tag-0.15.1b.tar.gz    //mp3的解码库
zlib-1.1.4.tar.gz      //用于文件的压缩与解压

创建文件夹来放源码包:

[yangni@yangni  ~]$ cd fl2440/3rdparty/

[yangni@yangni  3rdparty]$ mkdir uda1341

[yangni@yangni  3rdparty]$ cd uda1341/

[yangni@yangni  uda1341]$ mkdir mad



然后把所有的压缩包都解压出来:

[yangni@yangni mad]$tar -xzf libmad-0.15.1b.tar.gz

[yangni@yangni mad]$ tar -xzf libid3tag-0.15.1b.tar.gz

[yangni@yangni mad]$tar -xzf madplay-0.15.2b.tar.gz

[yangni@yangni mad]$tar -xzf zlib-1.1.4.tar.gz

(二)配置与编译:
       一般源码包解压缩之后,若已经存在Makefile则可以直接make编译;但大多数情况下需要使用源码包目录下的./configure脚本来配置源码包生成Makefile文件
我们通常可以使用./configure --help来查看配置选项:
       

这里我们必须知道以下几个配置参数:

   --host:   用于指定平台;如: --host==arm-linux

   --prefix: 用于指定文件的安装路径;   如:--prefix=/home/yangni/fl2440/3rdparty/uda1341/mad   (这里的路径就是你存放这些包的路径)

   -I     指定头文件的路径;  如:-I/home/yangni/fl2440/3rdparty/uda1341/mad/include   

   -L    指定库文件的路径;如:-L/home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib--disable-shared 

   --disable-shared       这个选项是告诉编译器使用静态库编译;        

注:

四次编译存在依赖关系,顺序不能乱。并且每次都应用sudo权限。

编译分为三个步骤,所以看似要做很多工作,但是基本都是一样的:

  1. 生成Makefile
  2. 编译(sudo make)
  3. 安装(sudo make install)

1、编译zlib-1.1.4:

(1)配置configure文件,生成Makefile

[yangni@yangni  uda1341]$ cd zlib-1.1.4 

[yangni@yangni  zlib-1.1.4]$ sudo ./configure --prefix=/home/yangni/fl2440/3rdparty/uda1341/mad



(2)修改Makefile:

[yangni@yangni  zlib-1.1.4]$vim Makefile


将原来的命令修改成我们的交叉编译器命令。
ar命令:可以用来创建、修改库,也可以从库中提出单个模块。当给静态库增建一个成员时(加入一个 .o 文件到静态库中),“ ar ”可直接将需要增加的 .o 文件简单的追加到静态库的末尾。
ranlib命令:ar将.o文件追加到末尾后,需要ranlib命令对静态库的符号索引表进行更新。

(3)编译(make):
[yangni@yangni  zlib-1.1.4]$sudo make
(4)安装(make install):
[yangni@yangni  zlib-1.1.4]$sudo make install


2.编译libid3tag-0.15.1b :
[yangni@yangni  uda1341]$ cd libid3tag-0.15.1b 
[yangni@yangnilibid3tag-0.15.1b ]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/yangni/fl2440/3rdparty/uda1341/mad  CPPFLAGS=-I/home/yangni/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/yangni/fl2440/3rdparty/uda1341/mad/lib

[yangni@yangni libid3tag-0.15.1b ]$sudo make
[yangni@yangni libid3tag-0.15.1b ]$sudo make install
3、编译libmad-0.15.1b:
      步骤基本与第二步一样。
[yangni@yangni  uda1341]$ cd libmad-0.15.1b
[yangni@yangni libmad-0.15.1b ]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/yangni/fl2440/3rdparty/uda1341/mad  CPPFLAGS=-I/home/yangni/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/yangni/fl2440/3rdparty/uda1341/mad/lib
[yangni@yangni libmad-0.15.1b]$sudo make
这里编译出现了错误:

原因gcc 3.4 或者更高版本,已经将-fforce-mem去除了,所以我们要在Makefile中删除它
解决:找到libmad configure之后的Makefile,删除 -fforce-mem
[yangni@yangni libmad-0.15.1b ]$vim Makefile

找到删除它,重新执行sudo make
[yangni@yangni libmad-0.15.1b ]$sudo make
[yangni@yangni libmad-0.15.1b ]$sudo make install

4、编译madplay-0.15.2b
[yangni@yangni  madplay-0.15.2b]$ cd libid3tag-0.15.1b 
[yangni@yangni madplay-0.15.2b]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/yangni/fl2440/3rdparty/uda1341/mad  CPPFLAGS=-I/home/yangni/fl2440/3rdparty/uda1341/mad/include/ LDFLAGS=-L/home/yangni/fl2440/3rdparty/uda1341/mad/lib
[yangni@yangni  madplay-0.15.2b]$ sudo make
这里不需要再make install了,因为我们之前使用的是静态编译。
make以后我们会发现生成了可执行文件madplay,这就是我们要下载到开发板上的文件:


五、下载到开发板上测试:

>: tftp -gr madplay 192.168.1.8

>: tftp -gr feihua.mp3 192.168.1.8


>: chmod a+x madplay 

>: ./madplay feihua.mp3

此时可能提示错误:



这里提示找不到相关的动态库,是交叉编译器除了问题。那么我们去交叉编译器所在目录找寻相关的库文件,将文件下载到开发板并放入/lib路径中。
[yangni@yangni  madplay-0.15.2b]$ cd /opt
[yangni@yangni  opt]find -iname  libiconv.so.2
用sz命令把该文件传到windows下,


然后下载到开发板上,并拷贝到lib中。

如果再出现,则继续按相同的方法解决。
然后就可以顺利运行了:

>: ./madplay feihua.mp3


按键盘的减号可以减小音量,shift+可以增大音量,shift-瞬间恢复满音量,s键停止,暂停(b),停止(ESC)。
注:由于我们的开发板是没有外放的(没有喇叭),所以只能插上耳机才可以听见mp3。

参考文档:
http://write.blog.csdn.net/postedit?ref=toolbar
http://blog.csdn.net/u010944778/article/details/45246307
0 0