1. 程式人生 > >alsa音效卡驅動移植

alsa音效卡驅動移植

1 配置核心支援UDA1341:  /* 下面是需要配置的巨集,後面函式的編譯取決這些巨集 */
CONFIG_SND_S3C24XX_I2S  // s3c24xx-i2s.c
CONFIG_SND_SOC_SAMSUNG  // dma.c
CONFIG_SND_SOC_UDA134X  // uda134x.c
CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c
CONFIG_S3C24XX_DMA

make menuconfig

-> 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   

/* ONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c      */   



-> System Type
[*] S3C2410 DMA support


2 修改程式碼
linux-3.4.2\arch\arm\mach-s3c24xx\mach-smdk2440.c 新增自己的platform_device,
參考linux-3.4.2\arch\arm\mach-s3c24xx\mach-mini2440.c有些只需要新增&s3c_device_iis,就行,因為這個結構體是被定義在linux-3.4.2\arch\arm\plat-samsung\Devs.c 

有些定義在自己單板相關的目錄,需要手動把這些構體複製過來。

2.1. 修改mach-smdk2440.c 新增"s3c24xx_uda134x"平臺裝置
#include <sound/s3c24xx_uda134x.h>
/* AUDIO */

static struct s3c24xx_uda134x_platform_data smdk2440_audio_pins = {

.l3_clk = S3C2410_GPB(4),
.l3_mode = S3C2410_GPB(2),
.l3_data = S3C2410_GPB(3),
.model = UDA134X_UDA1341
};

static struct platform_device mini2440_audio = {
.name= "s3c24xx_uda134x",
.id= 0,
.dev= {
.platform_data= &smdk2440_audio_pins,
},
};

在smdk2440_devices中新增&mini2440_audio,


2.2. 修改mach-smdk2440.c 新增"s3c24xx-iis"平臺裝置在smdk2440_devices中新增&s3c_device_iis,    /* 如果已經有了就不用新增 */

2.3. 修改mach-smdk2440.c 新增"samsung-audio"平臺裝置
在smdk2440_devices中新增&samsung_asoc_dma,

2.4. 修改mach-smdk2440.c 新增"uda134x-codec"平臺裝置
static struct platform_device uda1340_codec = {
.name = "uda134x-codec",
.id = -1,
};
在smdk2440_devices中新增&uda1340_codec,

下面這個BUG是測試應用程式的時候才發現的,執行時候dma讀取資料速度非常慢,出現聲音卡頓現象,檢視原始碼發現問題所在。

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

pos += prtd->dma_period;
改為
pos += prtd->dma_period*limit;

移植應用程式,參考這篇文章:http://blog.csdn.net/qq_21792169/article/details/51065786
alsa-lib安裝,一層封裝庫。alsa-util應用程式使用alsa-lib庫


1.先看看amixer支援哪些命令,大概有哪些功能
# amixer –help
2.再看看當前你的音訊系統(不同的音訊驅動對應不同的內容和操作介面)提供了那些供你使用的介面去操作
關於驅動裡面已經提供了多少介面可以去操作,可以用命令:
amixer contents
檢視,比如:
# amixer controls
# amixer cget numid=5,iface=MIXER,name=’PCM Volume’
# amixer cset numid=5,iface=MIXER,name=’PCM Volume’ 25
amixer cget    controls中所輸出的某個引數
amixer cset    controls中所輸出的某個引數      具體的值(比如,0,1,On,Off等)