———————————————————————————————————————主機作業系統:Centos 6.7 交叉編譯器環境:arm-linux-gcc-4.5.4 開發闆平台: FL2440 Linux核心版本: linux-3.0 開發子產品: s3c2440 uda1341聲霸卡驅動與madplay播———————————————————————————————————————
一、在初始化檔案中加入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>
59
60+ #include <sound/s3c24xx_uda134x.h>
61 //#include <mach/gpio-nrs.h>
62 #include <plat/common-smdk.h>
63
64 #include <linux/dm9000.h>
65
66 /* 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 vcs
10 misc
13 input
14 sound
21 sg
29 fb
89 i2c
90 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]$ ls
libid3tag-0.15.1b libmad-0.15.1b.tar.gz madplay-0.15.2b.tar.gz
libid3tag-0.15.1b.tar.gz mad zlib-1.1.4
libmad-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/mad
Checking 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 install
cp zlib.h zconf.h /home/leiyuxing/fl2440/3rdparty/uda1341/mad/include
chmod 644 /home/leiyuxing/fl2440/3rdparty/uda1341/mad/include/zlib.h /home/leiyuxing/fl2440/3rdparty/uda1314/mad/include/zconf.h
cp libz.a /home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib
cd /home/leiyuxing/fl2440/3rdparty/uda1341/mad/lib; chmod 755 libz.a
cd /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 madplay
716K madplay
[leiyuxing@centos6 madplay-0.15.2b]$ file madplay
madplay: 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.mp3
MPEG 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
>: cd lib/
>: tftp -gr libiconv.so.2 192.168.1.2
libiconv.so.2 100% |*******************************| 930k 0:00:00 ETA