對於ok6410的madplay移植主要包括三部分。聲卡驅動移植,播放器的移植,以及alsa庫的移植。
一、首先移植聲卡驅動以及播放器
ok6410采用WM97系列的聲卡芯片,要使得內核支持該驅動,首先需要配置內核:
1.使用飛凌針對ok6410開發板提供的內核,進入內核頂層目錄執行命令:
make menuconfig ARCH=arm
進入內核配置菜單,在【Device drivers】->【Sound card support】->【Advance linux sound Architecture】->【ALSA for SOC audio support】目錄下面:
選中這兩個選項,並保存退出使用命令make uImage,編譯內核。完成之后將生成的uImage文件拷貝到要下載內核的目錄下
如:cp arch/arm/boot/uImage */tftp
二、madplay播放器的移植
madplay播放器程序主要依賴於如下庫:
下面就將這些庫安裝到根文件系統中:
2.1首先解壓這幾個庫
tar xvzf libid3tag-0.15.1b.tar.gz
tar xvzf libmad-0.15.1b.tar.gz
tar xvzf zlib-1.1.4.tar.gz
2.2緊接着將madplay壓縮包解壓
tar xvzf madplay-0.15.2b.tar.gz
2.2.1接下來編譯、安裝zlib
a、進入解壓好的zlib源碼目錄,使用./configure --shared --prefix=*/install 配置文件生成Makefile
--shared表示動態庫
--prefix=*/install指明后面執行make install后庫和頭文件的安裝路徑,這個路徑是自己定義的方便我們提取生的庫和文件,這里的install路徑是自己創建的文件夾(一般在當前解壓好的目錄內新建一個文件夾目錄)
b、修改生成的Makefile
將Makefile中出現的如下變量修改為:
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc
CPP=arm-linux-gcc -E
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
修改如下:
c、使用命令make編譯源碼,使用make install 將生成的庫和頭文件安裝到指定的目錄下面,這里是之前創建的install這個目錄
e、將生成的動態庫復制到根文件系統的rootfs/lib目錄下面:cp */install/lib/* */rootfs/lib
2.2.2編譯,安裝libid3tag
a、進入解壓好的libid3tag源目錄下,使用目錄:./configure --host=arm-linux --prefix=${PWD}/install,生成Makefile
其中:--host指明交叉編譯工具前綴
--prefix=${PWD}/install指明后面執行make install后庫和頭文件的安裝路徑,這里的install雖然不存在但是執行make install后會自動創建
b、使用命令:make編譯源碼,使用命令:make instal,將生成的庫和頭文件安裝到指定的目錄下
c、將生成的動態庫復制到根文件系統*/rootfs/lib目錄下,使用命令:cp */install/lib/* */rootfs/lib
2.2.3編譯、安裝libmad
這個編譯安裝完全可以參考前面的方法,只不過在生成的Makefile中需要把一個目前不在支持的編譯選項去掉。在Makefile的129行去掉-fforce-mem這個選項
2.2.4移植madplay播放器
a、進入madplay解壓好的源碼文件中
b、使用命令: ./configure --host=arm-linux,生成Makefile
c、使用命令;make,編譯madplay,即可在madplay源碼目錄頂層找到生成的播放器主程序madplay
d、使用命令:cp */madplay */rootfs/sbin,將madplay拷貝到開發板的根文件系統目錄下
到目前為止我們的播放器程序以及開發板的聲卡驅動程序都已經移植好了,當我們為根文件系統放一首以數字或者字母命名的音樂時如:madplay 1.MP3時盡然出現了文件找不到通過分析原來並不是文件找不到而是文件運行所需要的動態庫找不到通過查看madplay文件需要的動態庫有如下:
其中藍顏色的是標准的數學庫可以在我們PC機的arm-linux-gcc目錄下獲得,上面兩個就是我們在前面移植的那兩個庫,獲取標准數學庫的方法(為了避免以后需要時候在復制我們將全部的庫都拷貝到我們的開發板目錄下):
在使用madplay 1.MP3命令時很多人以為此時我們的音樂播放器已經開始工作了。但是願望總是美好的,不論是耳機還是喇叭都沒有聲音出現,那是因為我們還差一項工作需要做,那就是ALSA庫和工具移植。
三、ALSA庫和工具的移植
由於OK6410的Linux內核雖然有了聲卡的驅動,但是並沒有ALSA架構需要的應用程序接口庫。在用戶空間訪問聲卡的時候需要先經過ALSA庫才到內核訪問驅動程序,所以我們需要移植ALSA庫。而且由於6410使用的是wm9713或者wm9715的聲卡,該聲卡需要經過特殊的配置才可以使用,否則不能播放聲音。
3.1移植alsa-lib
a、可以到http://www.alsa-project.org/main/index.php/Download下載最新版本的alsa庫我使用的是(alsa-lib-1.0.29.tar.bz2)和工具包(alsa-utils-1.0.29.tar.bz2)
b、解壓alsa-lib-1.0.29.tar.bz2
使用命令:tar jxvf alsa-lib-1.0.29.tar.bz2
c、配置alsa-lib
./configure --host=arm-linux --prefix=/usr/local/share/arm-alsa --enable-shared --disable-python --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld
其中: --host :為使用的交叉編譯工具名,直接使用 arm-linux 也可以,根據 PC上安裝的交叉編譯工具來決定;
--prefix:即 make install 時程序安裝的目錄,可以根據自己的情況進行修改,不用拘泥
--enable:開啟功能 --disable :關閉功能,使用動態庫不需要Python。
--with-configdir: alsa 配置文件所在目錄,本目錄要定好位置,交叉編譯過后,移植到板子上時要和 PC 上路徑一致。也即是說如果配置的時候指定的是/usr/local/share/alsa目錄,那么你的配置文件在開發板上的絕對路徑也要是/usr/local/share/alsa。默認 alsa配置文件會在安裝目錄里。這個很重要,不能PC和開發板兩邊不匹配。
--with-plugindir: alsa_lib 所在目錄,目前意義不明,可以自由定位,也可以默認安裝,先不用管。但是這里指定的目錄會產生必要的庫文件,放到開發板的時候也要路徑和PC一樣。
d.編譯安裝
make
make install
3.2移植alsa-utils
a.解壓以后進入解壓得到的目錄
b.配置
./configure --host=arm-linux --prefix=/usr/local/share/arm-alsa CFLAGS="-I/usr/local/share/arm-alsa/include" LDFLAGS="-L/usr/local/share/arm-alsa/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/usr/local/share/arm-alsa/include --with-alsa-prefix=/usr/local/share/arm-alsa/lib CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld
其中:CFLAGS:編譯工具需要要的頭文件目錄,也就是前面編譯庫文件得到的頭文件
LDFLAGS:編譯工具需要要的庫文件目錄,也就是前面編譯庫文件得到的庫文件
--with-alsa-inc-prefix:和CFLAGS一樣 --with-alsa-prefix:和LDFLAGS一樣。
c.編譯和配置
make
make install
3.3復制生成文件到開發板
進入到PC的/usr/local/share目錄(之前配置時候指定的,根據你的配置選項決定),因為我們所有的安裝目錄都在這個目錄下。
a.將/usr/local/share目錄下的alsa,arm-alsa拷貝到開發板的/usr/local/share目錄下
cp ./alsa /home/OK6410/rootfs/usr/local/share -rfa
cp ./arm-alsa /home/OK6410/rootfs/usr/local/share -rfa
b.將/usr/local/lib目錄下的alsa_lib拷貝到開發板上/usr/local/lib(自己先創建)目錄下
cp ./alsa_lib /home/OK6410/rootfs/usr/local/lib/ -rfa
c.將/usr/local/share/arm-alsa/lib目錄下的文件拷貝到開發板根文件系統的/lib目錄下
cp ./arm-alsa/lib/* /home/OK6410/rootfs/lib –rfa
d.將arm-alsa/bin目錄下的文件拷貝到/sbin目錄下
cp ./arm-alsa/bin/* /home/OK6410/rootfs/bin -rfa
e.將arm-alsa/sbin目錄下的文件拷貝到/sbin目錄下
cp ./arm-alsa/sbin/* /home/OK6410/rootfs/bin -rfa
f.添加環境變量,編輯開發板的文件系統里的/etc/profile,切記是開發板的文件系統不是PC的文件系統啊!!!在結尾添加
export ALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf
g.復制聲卡需要的配置文件
由於wm9713/9714需要特殊配置,所以我們在移植了alsa-util以后便可以利用這個工具集中的alsactl對wm9714/9713進行配置,配置所需要的配置文件在SDK的wm9713目錄下。將他復制到開發板的/etc目錄即可。
h. 修改系統初始化腳本
由於alsa架構的庫和程序要去訪問/dev/snd目錄下的這些文件
controlC0 pcmC0D0c pcmC0D0p seq timer
但是實際上我們使用的內核和文件系統並沒有/dev/snd這個目錄,而是直接把這些設備結點創建在/dev目錄,所以需要我們手動創建,並將設備結點進行硬鏈接。因此我們在初始化腳本里面完成這個任務,在開發板文件系統里的/etc/init.d/rcS加上如下內容。
mkdir /dev/snd
ln /dev/controlC0 /dev/snd/controlC0
ln /dev/pcmC0D0c /dev/snd/pcmC0D0c
ln /dev/pcmC0D0p /dev/snd/pcmC0D0p
ln /dev/timer /dev/snd/timer
ln /dev/seq /dev/snd/seq
amixer cset numid=86 2
amixer cset numid=87 2
alsactl restore -f /etc/wm9714.conf
i、最后將wm9714.conf這個文件復制到開發板的/etc/目錄下面
最后重新啟動開發板將我們根文件系統掛在到上去執行:madplay 2.MP3就可以聽到歌聲了