1. 程式人生 > >ALSA音效卡筆記4-----體驗音效卡

ALSA音效卡筆記4-----體驗音效卡


1 、配置核心支援UDA1341

(1)核心

 解壓核心並打上補丁


配置核心


platform

需要設定哪些配置項,先看一下platform,需要把S3c24xx-i2s.c檔案配置上去,dma.c也要配置上去。這些檔案對應哪一個配置項,可以通過開啟核心目錄中以上兩個檔案所在目錄下的Makefile。

  • 配置編譯項CONFIG_SND_S3C24XX_I2S  // s3c24xx-i2s.c
搜尋S3c24xx-i2s可知最終會編譯進檔案snd-soc-s3c24cc-i2s-objs這個檔案裡。


而檔案snd-soc-s3c24cc-i2s-objs對應的配置項是CONFIG_SND_S3C24XX_I2S

因而需要配置編譯項CONFIG_SND_S3C24XX_I2S  // s3c24xx-i2s.c

  • 配置編譯項CONFIG_SND_SOC_SAMSUNG  // dma.c


因而需要配置編譯項CONFIG_SND_SOC_SAMSUNG  // dma.c

codec

  • 配置編譯項CONFIG_SND_SOC_UDA134X  // uda134x.c

看一下codec,需要把uda134x.c 檔案配置上去。這檔案對應哪一個配置項,可以通過開啟核心目錄中檔案所在目錄下的Makefile。



因而需要配置編譯項CONFIG_SND_SOC_UDA134X  // uda134x.c

machine

  • 配置編譯項CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c

看一下machine,需要把s3c24xx_uda134x.c 檔案配置上去。這檔案對應哪一個配置項,可以通過開啟核心目錄中檔案所在目錄下的Makefile。



因而需要配置編譯項CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c

搜尋那四個配置項,配置核心以把上面四項全部配置上去
-> Device Drivers
  -> Sound card support
    -> Advanced Linux Sound Architecture

      -> ALSA for SoC audio support
      <*>   ASoC support for Samsung     // CONFIG_SND_SOC_SAMSUNG
      <*>   SoC I2S Audio support UDA134X wired to a S3C24XX    // CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c          


-> System Type

[*] S3C2410 DMA support



2、 修改程式碼

machine

  • 修改mach-smdk2440.c 新增"s3c24xx_uda134x"平臺裝置

我們把S3c24xx-i2s.c檔案配置進核心了,S3c24xx-i2s.c只有platform_driver,但是platform_device在mach_mini2440.c(3.4.2核心用mach-smdk2440.c),需要修改這個檔案把同名的platform_device放進去。先構建一個smdk2440_audio的平臺裝置結構體,然後把這個結構體放進平臺裝置數組裡。這個陣列最後會把裡面的結構體註冊進核心。



platform


  • 修改s3c24xx-i2s.c 新增"s3c24xx-iis"平臺裝置

我們把s3c24xx-i2s.c檔案配置進核心了,S3c24xx-i2s.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到數組裡面)在devs.c,需要修改這個檔案把同名的platform_device放進去。先構建一個s3c_device_iis的平臺裝置結構體,然後把這個結構體放進平臺裝置數組裡。這個陣列最後會把裡面的結構體註冊進核心。

注:平臺裝置陣列在mach-smdk2440.c




codec

  • 修改mach-smdk2440.c 新增"samsung-audio"平臺裝置

我們把dma.c檔案配置進核心了,dma.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到數組裡面)在devs.c,需要修改這個檔案把同名的platform_device放進去。先構建一個samsung_asoc_dma的平臺裝置結構體,然後把這個結構體放進平臺裝置數組裡。這個陣列最後會把裡面的結構體註冊進核心。

注:平臺裝置陣列在mach-smdk2440.c



codec

  • 修改mach-smdk2440.c 新增"uda134x-codec"平臺裝置

我們把uda134x.c檔案配置進核心了,dma.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到數組裡面)mach-smdk2440.c,需要修改這個檔案把同名的platform_device放進去。先構建一個uda1340_codec的平臺裝置結構體,然後把這個結構體放進平臺裝置數組裡。這個陣列最後會把裡面的結構體註冊進核心。



3、編譯核心出現問題

修改bug: sound\soc\samsung\dma.c

pos += prtd->dma_period;
改為
pos += prtd->dma_period*limit;
4、實驗

     編譯核心並把編譯出來的核心拷貝到網路根檔案系統裡,設定啟動引數並啟動u-boot,u-boot引導核心啟動。開是否識別出聲卡





5、移植應用程式測試音效卡

 alsa-util是使用alsa-lib的一些應用程式,我們使用alsa-util可以用來播放聲音,錄音或者調整音量等等。

(1) 編譯alsa-lib, alsa-util以使用音效卡:
  •  alsa-lib  : 

解壓並切換到目錄下



在配置時不使用--prefix,因為這樣做會破壞檔案系統的結構,使用預設路徑(把庫編譯安裝到/usr目錄下,但/usr目錄是PC機用的,為了跟PC機不衝突,因而在配置前把/usr改名為/usr_bak

編譯:將原始碼變為機器可執行的程式碼檔案。
安裝:將可執行檔案安裝到作業系統裡,才可以使用。

mv /usr/bin/g* /tmp
就是移動 usr/bin/目錄下,以g開頭的檔案到/tmp目錄裡

sudo mv /usr /usr_bak

用echo $PATH檢視環境變數


修改環境變數,吧所有的usr改為usr_bak

export PATH=/usr_bak/local/sbin:/usr_bak/local/bin:/usr_bak/sbin:/usr_bak/bin:/sbin:/bin:/usr_bak/games:/usr_bak/local/arm/4.3.2/bin

配置

./configure --host=arm-linux

編譯

make

因為make install是安裝到usr目錄下面去

建立usr目錄

sudo mkdir /usr

改變usr目錄的所有者和所在組

sudo chown book:book /usr

安裝

make install

把/usr目錄拷貝到/work/projects/alsa/目錄下

sudo cp -rf  /usr  /work/projects/alsa/

把自己建立的/usr目錄刪掉

sudo rm -rf /usr

然後複製回來

sudo mv /usr_bak /usr


把環境變數改回來

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin

在我們的 /work/projects/alsa/下有編譯出來的/usr

把標頭檔案和庫複製進交叉工具鏈
cd /work/projects/alsa/usr/include
sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include


cd /work/projects/alsa/usr/lib
sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib


把usr目錄複製到網路根檔案系統目錄下
cd /work/projects/alsa
sudo -rfd usr /work/nfs_root/fs_mini_mdev_new


  •  alsa-util
 先編譯依賴:ncurses-5.9.tar.gz



把標頭檔案和庫複製進交叉工具鏈

cd /work/projects/alsa/ncurses-5.9/tmp/include/ncurses
sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cd /work/projects/alsa/ncurses-5.9/tmp/include/
sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cd /work/projects/alsa/ncurses-5.9/tmp/lib
sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
把庫複製到根檔案系統的lib目錄下
cd /work/projects/alsa/ncurses-5.9/tmp/lib
sudo cp *so* -rfd /work/nfs_root/fs_mini_mdev_new/lib
由於在拷貝過程中lib目錄下沒有發現動態庫.so,在配置時沒有制定生成動態庫,因而需要重新配置加入--with-shard


安裝錯誤無需理會,只要在tmp臨時檔案生成標頭檔案和庫檔案就可以了

解壓並切換到其目錄下

配置

ncurses是庫ncurses-5.9的名字


./configure --host=arm-linux --prefix=$PWD/tmp --with-curses=ncurses --disable-xmlto --disable-nls

–disable-FEATURE 
當你想禁用某個FEATURE的時候可以使用它

with選項來指定具體的軟體包地址,通過without選項來指定不使用指定的軟體包

編譯和安裝

make
sudo make install


把安裝在tmp目錄下的檔案拷貝到網路跟檔案系統



6、測試

用aplay -h看是否能用

拷貝音訊檔案到網路檔案系統


進行播放


出現無法找到音效卡

aplay或者alsa-lib使用的音效卡節點預設是在/dev/snd/目錄下

因而需要新建/dev/snd目錄

mkdir /dev/snd

cd /dev/snd/

ln -s  原始檔 目標檔案  做軟連結
和快捷方式只能共享執行檔案不同,linux通過連結檔案能共享幾乎所以型別的檔案
在當前目錄建立指向原始檔的連結
ln -s /dev/controlC0 
ln -s /dev/pcmC0D0p 
ln -s /dev/pcmC0D0c


播放:

aplay Windows.wav

調音量用amixer來調,用amixer -h檢視用法

檢視控制項

amixer controls

檢視當前音量,numid=1表示第一個control,為什麼是numid=1,是因為用amixer controls命令顯示出第一個控制項是Master Playback Volume就是他的音量


amixer cget numid=1

設定音量,numid=1表示第一個control,30是設定的音量值

amixer cset numid=1 30

7、把核心的修改製作成補丁檔案

(1)把.config檔案拷貝為config_ok檔案,儲存我們修改的配置。然後make distclean


(2)把修改後的核心改個名字,然後解壓原版核心


(3)製作補丁檔案

(4)打上補丁後,吧config_ok複製為.config就可以了

轉自:http://blog.csdn.net/qingkongyeyue/article/details/52504235