Linux设备驱动之udal341声卡驱动与madplay播放器移植

2019-07-12 18:53发布

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

主机操作系统: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

=================================================================== 一. S3C2440 与 UDA1341 接口硬件描述       下图为FL2440开发板 IIS Interface原理图, S3C2440 处理器内置了 IIS 总线接口,S3C2440 的 IIS 总线时钟信号 SCK 与 Philips 公司的 UDA1341 的 BCK 连接,字段选择连接于 WS 引脚。UDA1341 提供两个音频通道,分别用于输入和输出,对应的引脚连接:IIS 总线的音频输出 IISSDO 对应于 UDA1341 的音频输入,IIS 总线的音频输入 IISSDI 对应于UDA1341 的音频输出。       UDA1341 的 L3 接口相当于一个混音器控制接口,可以用来控制输入/输出音频信号的音量大小、低音等。L3 接口的引脚 L3MODE、L3DATA、L3CLOCK 分别连接到 S3C2440 的 3 个 GPIO 来控制。
ALSA (Advanced Linux Sound Architecture) 是在 Linux 下进行音频编程时一种可供选择的声卡驱动体系结构。它 支持多种声卡设备, 具有更加友好的编程接口,并且完全兼容于 OSS。 OSSOpen Sound System)是Linux平台上一个统一的音频接口即只要音频处理应用程序按照OSSAPI来编写,那么在移植到另外一个平台时,只需要重新编译即可。值得注意的是OSS只是部分开源。无论是选择ALSA还是OSS都是为了一个目的:将声卡抽象为一个统一的设备供linux程序员使用。我们测试选用的OSS系列。 二.修改配置文件 Linux-3.0 已经完美的支持UDA1341音频芯片的驱动, 我们只要在arch/arm/mach-s3c2440/mach-smdk2440.c 文件中注册UDA1341 平台设备的控制端口就可以了
(1)添加头文件

(2)添加相关设备结构体

(3)将设备结构体加入主设备结构体

注意:上述添加的各类结构体均要放在添加设备的devices[ ]结构体数组之前,否则会出现未定义,以及定义了没使用等错误。因为编译器是按顺序编译,所以声明必须放在结构体或者函数之前。 三.make menuconfig选项 Device Drivers  --->  <*> Sound card support  --->     [*]   Preclaim OSS device numbers        <*>   Advanced Linux Sound Architecture  --->          --- Advanced Linux Sound Architecture                                              | |           < >   Sequencer support                                                          | |   | |           <*>   OSS Mixer API                                                              | |   | |           <*>   OSS PCM (digital audio) API                                                | |   | |           [*]     OSS PCM (digital audio) API - Include plugin system                      | |   | |           [*]   Dynamic device file minor numbers                                          | |   | |           [ ]   Support old ALSA API                                                       | |   | |           [*]   Verbose procfs contents                                                    | |   | |           [ ]   Verbose printk                                                             | |   | |           [ ]   Debug                                                                      | |   | |           [ ]   Generic sound devices  --->                                                | |   | |           [ ]   ARM sound devices  --->                                                    | |   | |           [ ]   SPI sound devices  --->                                                    | |   | |           [*]   USB sound devices  --->         <*>   ALSA for SoC audio support  --->             |           --- ALSA for SoC audio support                                                   | |   | |               [ ]   Support LZO compression for register caches                                | |   | |               <*>   ASoC support for Samsung                                                   | |   | |               < >   SoC AC97 Audio support for LN2440SBC - ALC650                              | |   | |               <*>   SoC I2S Audio support UDA134X wired to a S3C24XX                           | |   | |               < >   SoC I2S Audio support for TLV320AIC23 on Simtec boards                     | |   | |               < >   SoC I2S Audio support for Simtec Hermes board                              | |   | |               < >   Build all ASoC CODEC drivers                                               | |   | |                                                                          重新编译,烧录开发板,启动过程中打印如下信息则表示添加驱动成功
四.mdplay移植和播放MP3音乐 移植第三方程序的主要步骤分别为:解压缩、配置(./configure)、编译(make)、安装(make install) 1.下载源码包  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/ [weiming@Huangweiming 3rdparty]$ cd [weiming@Huangweiming ~]$ cd fl2440/3rdparty/ [weiming@Huangweiming 3rdparty]$ mkdir uda1341 [weiming@Huangweiming 3rdparty]$ cd uda1341/ [weiming@Huangweiming uda1341]$ mkdir install 将上述源码包下载到uda1341文件夹下,用tar -xzf 指令解压(由于是.tar.gz格式)
一般源码包解压缩之后,若已经存在Makefile则可以直接make编译;但大多数情况下需要使用源码包目录下的./configure脚本来配置源码包生成Makefile文件; 以下几个配置参数:  --host:   用于指定平台;如: --host==arm-linux --prefix: 用于指定文件的安装路径;   如:--prefix=/home/weiming/fl2440/3rdparty/uda1341/install -I : 指定头文件的路径;  如:-I/home/weiming/fl2440/3rdparty/uda1341/install/include -L : 指定库文件的路径;如:-L /home/weiming/fl2440/3rdparty/uda1341/install/lib--disable-shared      使用静态库编译 LDFLAGS:告诉链接器从哪里寻找库文件 CPPFLAGS 是编译选项,同自己用的编译器有关 可以 用于 C 和 C++ 两者预编处理 如果是要编译到arm板子上跑则在make的时候还需要加上AR(将.o文件打包生成.a的静态库文件)=   LD(所链接)=     CC(交叉编译器)=   RANLIB(随机库创建器)       AS(汇编器)=    NM(库查看工具) 2.配置,编译 注: 四次编译存在依赖关系,顺序不能乱。并且每次都应用sudo权限。 (一)zlib-1.1.4: (1)配置configure文件,生成Makefile [weiming@Huangweiming uda1341]$ cd zlib-1.1.4 [weiming@Huangweiming zlib-1.1.4]$  sudo ./configure --prefix=/home/weiming/fl2440/3rdparty/uda1341/install
(2)修改Makefile: [weiming@Huangweiming zlib-1.1.4]$vim Makefile

(3)编译make [weiming@Huangweiming zlib-1.1.4]$sudo make (4)安装make install  [weiming@Huangweiming zlib-1.1.4]$sudo make install
(二)libid3tag-0.15.1b [weiming@Huangweiming uda1341]$ cd libid3tag-0.15.1b [weiming@Huangweiming libid3tag-0.15.1b]$ sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/weiming/fl2440/3rdparty/uda1341/install  CPPFLAGS=-I/home/weiming/fl2440/3rdparty/uda1341/install/include/ LDFLAGS=-L/home/weiming/fl2440/3rdparty/uda1341/install/lib  
[weiming@Huangweiming libid3tag-0.15.1b]$sudo make [weiming@Huangweiming libid3tag-0.15.1b]$sudo make install (三)libmad-0.15.1b: [weiming@Huangweiming uda1341]$ cd libmad-0.15.1b [weiming@Huangweiming libmad-0.15.1b]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/weiming/fl2440/3rdparty/uda1341/install  CPPFLAGS=-I/home/weiming/fl2440/3rdparty/uda1341/install/include/ LDFLAGS=-L/home/weiming/fl2440/3rdparty/uda1341/install/lib [weiming@Huangweiming libmad-0.15.1b]$sudo make 如出现以下错误:
解决方法:找到libmad configure之后的Makefile,删除 -fforce-mem原因是gcc 3.4 或者更高版本,已经将其去除了,所以会出现上面的错误。

删除后再执行一次sudo make [weiming@Huangweiming libmad-0.15.1b]$sudo make [weiming@Huangweiming libmad-0.15.1b]$sudo make install (四)madplay-0.15.2b [weiming@Huangweiming uda1341]$ cd madplay-0.15.2b [weiming@Huangweiming madplay-0.15.2b]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/weiming/fl2440/3rdparty/uda1341/install  CPPFLAGS=-I/home/weiming/fl2440/3rdparty/uda1341/install/include/ LDFLAGS=-L/home/weiming/fl2440/3rdparty/uda1341/install/lib [weiming@Huangweiming madplay-0.15.2b]$ sudo make   make成功生成madplay可执行程序.因为自己使用的静态编译(--disable-shared),可不用再make install make以后我们会发现生成了可执行文件madplay,这就是我们要下载到开发板上的文件:
五.开发板测试

插上耳机就能听到音乐了,通过按键盘的减号可以减小音量,shift+可以增大音量,shift-瞬间恢复满音量,s键停止。 到此,声卡驱动和播放器移植成功完成了。