程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> s3c2440 UDA1341聲卡驅動與madplay播放器移植,

s3c2440 UDA1341聲卡驅動與madplay播放器移植,

編輯:C++入門知識

s3c2440 UDA1341聲卡驅動與madplay播放器移植,


 

1.配置聲卡UDA1341驅動

因為linux3.0內核中還有mini2440的初始化文件,於是直接進入/arch/arm/mach-s3c2440/mach-mini2440.c中查看後修改得到

--- mach-smdk2440_o.c 2015-04-24 11:39:20.492017397 +0800 +++ mach-smdk2440.c 2015-04-24 12:26:01.457015793 +0800 @@ -45,6 +45,7 @@ #include  #include  +#include  +#include  #include  static struct map_desc smdk2440_iodesc[] __initdata = { @@ -155,8 +156,32 @@ &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, + &uda1340_codec, + &s3c2440_audio, + &samsung_asoc_dma, }; +/* add by handy */ +/* AUDIO */ +static struct s3c24xx_uda134x_platform_data s3c2440_audio_pins = { + .l3_clk = S3C2410_GPB(4), + .l3_mode = S3C2410_GPB(2), + .l3_data = S3C2410_GPB(3), + .model = UDA134X_UDA1341 +}; + +static struct platform_device s3c2440_audio = { + .name = s3c24xx_uda134x, + .id = 0, + .dev = { + .platform_data = &s3c2440_audio_pins, + }, +}; +static struct platform_device uda1340_codec = { + .name = uda134x-codec, + .id = -1, +}; +/* add by handy */ static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));



然後直接make menuconfig即可; PS:復制粘貼也要注意有沒有多出空白字符,如果scureCRT的插件裝的多的話建議直接用虛擬機文本編輯,一模一樣的用虛擬機編輯就能一次通過make。而scureCRT死都不過,一直顯示未定義。

首先進入 Device Drivers -->

\

\

\

\

make之後燒錄到板子上,若最後打印的一長串信息裡找到上述打印出的信息則表示成功 。

2.madplay在S3c2440上移植,順利播放mp3音樂

交叉編譯器環境:arm-linux-gcc-4.5.4
開發板平台: FL2440
Linux內核版本: 3.0

() madplay移植前的准備:
所需源碼包:

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 //用於文件的壓縮與解壓
新建文件目錄並上傳源碼包到madplay目錄並解壓;
[pikaqiu@centos6 ~]$ mkdir madplay
[pikaqiu@centos6 ~]$ mkdir madplay/mad
[pikaqiu@centos6 madplay]$ ls
libid3tag-0.15.1b libmad-0.15.1b mad madplay-0.15.2b zlib-1.1.4

移植第三方程序的主要步驟分別為:解壓縮、配置(./configure)、編譯(make)、安裝(make install);

一般源碼包解壓縮之後,若已經存在Makefile則可以直接make編譯;但大多數情況下需要使用源碼包目錄下的./configure腳本來配置源碼包生成Makefile文件;
我們通常可以使用./configure --help來查看配置選項。

這裡我們必須知道以下幾個配置參數:

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

--prefix: 用於指定文件的安裝路徑; 如:--prefix=/home/pikaqiu/madplay/mad

-I指定頭文件的路徑; 如:-I/home/pikaqiu/madplay/mad/include/

-L指定庫文件的路徑;如:-L/home/pikaqiu/madplay/mad/lib

--disable-shared使用靜態庫編譯;

如果是要編譯到arm板子上跑則在make的時候還需要加上AR(將.o文件打包生成.a的靜態庫文件)= LD(所鏈接)= CC(交叉編譯器)=

(二)下面開始正式配置,編譯:
注意:以下的步驟不能打亂,因為其中有依賴關系;還有每次都需要使用sudo權限,否則可能因權限不夠而出錯。

1.首先編譯zlib-1.1.4

[pikaqiu@centos6 madplay]$ cd zlib-1.1.4/
(1)配置configure文件,生成Makefile
[pikaqiu@centos6 madplay]$sudo ./configure --prefix=home/pikaqiu/madplay/mad
(2)修改Makefile文件
[pikaqiu@centos6 zlib-1.1.4]$ vim Makefile
修改以下三項:
CC=gcc 修改為CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
AR=ar rc 修改為AR=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar rc
RANLIB=ranlib 修改為RANLIB=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib

(三)編譯make
[pikaqiu@centos6 zlib-1.1.4]$ sudo make
若沒有錯誤便是make成功,可以繼續下一步
(四)安裝make install

2.編譯libid3tag-0.15.1b

[pikaqiu@centos6 madplay]$ cd libid3tag-0.15.1b/
(1)配置configure文件,生成Makefile
[pikaqiu@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/pikaqiu/madplay/mad CPPFLAGS=-I/home/pikaqiu/madplay/mad/include/ LDFLAGS=-L/home/pikaqiu/madplay/mad/lib
(2)編譯make
[pikaqiu@centos6 libid3tag-0.15.1b]$ sudo make
若沒有錯誤便是make成功,可以繼續下一步
(四)安裝make install

3.編譯libmad-0.15.1b

[pikaqiu@centos6 madplay]$cd libmad-0.15.1b/

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

[pikaqiu@centos6 libmad-0.15.1b]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/pikaqiu/madplay/mad CPPFLAGS=-I/home/pikaqiu/madplay/mad/include/ LDFLAGS=-L/home/pikaqiu/madplay/mad/lib

(2)編譯make
此時出現一個錯誤:cc1: error: unrecognized command line option “-fforce-mem”

解決方式:vim Makefile

大概在129行左右找到包含的-fforce-mem字符串,將其刪除,即可。
原因:是gcc 3.4 或者更高版本,已經將其去除了,所以會出現上面的錯誤。
(3)安裝make install

4.安裝madplay

[pikaqiu@centos6 madplay]$cd madplay/

(1)配置configure文件,生成Makefile
[pikaqiu@centos6 madplay]$sudo ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --host=arm-linux --disable-shared --prefix=/home/pikaqiu/madplay/mad CPPFLAGS=-I/home/pikaqiu/madplay/mad/include/ LDFLAGS=-L/home/pikaqiu/madplay/mad/lib

我在此時又出現了一個錯誤:
configure: error: mad.h was not found
*** You must first install libmad before you can build this package.
*** If libmad is already installed, you may need to use the CPPFLAGS
*** environment variable to specify its installed location, e.g. -I

原因:提示說缺少頭文件,即提醒我們要用-I 指令來指定頭文件所在路徑。
解決方法:因為我指令上面已經有存在-L與-I 來指定庫與頭文件目錄,於是我先回到mad/include下查看,發現是真的沒有mad.h這個頭文件,於是我返回到頂層目錄madplay采用指令查找。
[pikaqiu@centos6 madplay]$ find -name mad.h
./libmad-0.15.1b/mad.h 然後將此拷貝到/mad/include目錄下後解決。

而在接下來又出現了這樣的錯誤:
configure: error: libmad was not found
*** You must first install libmad before you can build this package.
*** If libmad is already installed, you may need to use the LDFLAGS
*** environment variable to specify its installed location, e.g. -L
原因:缺少庫文件,即提醒我們要用-L來指定庫文件所在路徑。
解決方法:在/mad/lib/目錄下我又沒有找到我的libmad.a文件
[pikaqiu@centos6 madplay]$ find -name libmad.*
./mad/lib/libmad.la
./mad/lib/.libs/libmad.a
./mad/lib/libmad.a
./libmad-0.15.1b/libmad.list
./libmad-0.15.1b/msvc++/libmad.dsp
./libmad-0.15.1b/libmad.list.in
./libmad-0.15.1b/libmad.la
./libmad-0.15.1b/.libs/libmad.lai
./libmad-0.15.1b/.libs/libmad.la
./libmad-0.15.1b/.libs/libmad.a
./madplay-0.15.2b/.libs/libmad.la
./madplay-0.15.2b/.libs/libmad.a (這是我成功之後的find,但之前只有libmad-0.15.1b/.libs中有)
因為不曉得是需要.a還是.la,索性將之都拷貝到相應路徑,解決之。

(2)編譯make

滿心歡喜的以為問題解決,以為能夠make了麼,這時又出現了一個問題。
....
arm-linux-gcc: /home/pikaqiu/madplay/mad/lib/.libs/libmad.a: No such file or directory
make[2]: *** [madplay] 錯誤 1
make[2]: Leaving directory `/home/pikaqiu/madplay/madplay-0.15.2b'
make[1]: *** [all-recursive] 錯誤 1
make[1]: Leaving directory `/home/pikaqiu/madplay/madplay-0.15.2b'
make: *** [all] 錯誤 2
解決辦法:自己手動創建mad/lib/.libs/ 並將libmad.a文件拷貝到其目錄中後解決。

至此,終於make成功生成madplay的綠色可執行程序了.又因為我使用的是靜態編譯。此時可不用再make install,直接將 madplay下載到開發板後給予權限即可。

chmod 777 madplay

./madplay xxx.mp3 就能夠聽音樂了,博主親測!

madpaly還有一些快捷鍵,比如:增大/減小音量(+/-),暫停(b),停止(ESC)
沒看手冊,我胡亂測試了一下,發現按鍵盤的減號可以減小音量,shift+可以增大音量,shift-瞬間恢復滿音量,s鍵停止。


 

 

學習小結: 1、所有的第三方應用程序移植到開發板上使用,幾乎都會聯系上動態庫,靜態庫。所以需要熟悉這一方面的知識,比如如何鏈接動態庫靜態庫;如何指定頭文件路徑以及靜態鏈接,靜態編譯的參數等;
靜態編譯與動態編譯區別:
  動態編譯的可執行文件需要附帶一個動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點是縮小了執行文件本身的大小,並加快了編譯速度,節省了系統資源。但缺點也很明顯,就是只要用到了庫文件就需要帶上相應的函數庫,無論怎樣都要帶著一個小尾巴。這對我們移植比較小的程序的時候略微麻煩。

  靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來鏈接到可執行文件中去,因為包含了動態庫中的文件所以可執行文件會比較臃腫,也就是占空間資源。但是卻可以直接運行。所以其優缺點與動態編譯的可執行文件正好互補,就看具體情況來取捨了。

2、還要學會利用linux內核本身其他驅動的代碼進行驅動修改,比如smdk2440的dm9000網卡驅動你就可以去mini2440裡面尋找支持的dm9000驅動代碼,以此類推。

\

\

由圖可知我靜態編譯生成的可執行文件才672K並且not stripped表示沒有使用strip去掉部分的調試信息。所以我並沒有再次動態編譯。
但有一個問題:我明明可以直接把可執行文件燒錄到開發板上運行,而且一開始都指定了--disable-shard禁用共享庫。我file後的madplay居然顯示使用動態庫。求解

最後:在此也感謝所有前輩在網上分享的各種解決方法。在移植應用程序的過程中遇到的問題都需要自己耐心根據提示解決。


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved