Welcome 微信登录

首页 / 操作系统 / Linux / ALSA在ARM(S3C6410)中的移植

软硬件平台:ARM9(S3C2410A),UDA1341, 2.6.33.1内核,arm-none-linux-gnueabi-gcc-4.3.2ASoC:ALSA为嵌入式系统提供的SOC级驱动,支持PCM,I2S和AC97。详细内容可查阅:http://www.alsa-project.org/main/index.php/ASoC (1)驱动移植2.6.33.1已经为提供了UDA134X的ALSA驱动,只需要稍微配置即可。在arch/arm/mach-s3c2410/mach-smdk2410.c中添加:static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
        .l3_clk = S3C2410_GPB(4),
        .l3_data = S3C2410_GPB(3),
        .l3_mode = S3C2410_GPB(2),
        .model = UDA134X_UDA1341,
};static struct platform_device s3c24xx_uda134x = {
        .name = "s3c24xx_uda134x",
        .dev = {
                .platform_data    = &s3c24xx_uda134x_data,
        }
};在smdk2410_devices[]添加一项:&s3c24xx_uda134x配置内核选项,选中ALSA支持。 更新内核,启动显示usbcore: registered new interface driver usbhid                                
usbhid: USB HID core driver                                                    
usbcore: registered new interface driver snd-usb-audio                         
usbcore: registered new interface driver snd-usb-caiaq                         
No device for DAI UDA134X                                                      
No device for DAI s3c24xx-i2s                                                  
S3C24XX_UDA134X SoC Audio driver                                               
UDA134X SoC Audio Codec                                                        
asoc: UDA134X <-> s3c24xx-i2s mapping ok                                       
usb 1-1: new full speed USB device using s3c2410-ohci and address 2            
ALSA device list:                                                              
  #0: S3C24XX_UDA134X (UDA134X) 驱动移植成功。可以支持板子的UDA1341,可支持我的usb声卡了。(此处也可以直接使用alsa-driver提供驱动程序,具体我没有做) (2)alsa-lib移植版本alsa-lib-1.0.22./configure --host=arm-linux --target=arm-linux --prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr --enable-static --enable-shared --disable-python --with-configdir=/usr/local/share --with-plugindir=/usr/local/lib/alsa_lib编译安装,将库文件、配置文件和插件文件转移到嵌入式文件系统的对应目录上。 (3)alsa-utils移植版本alsa-utils-1.0.23PKG_CONFIG_PATH="/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/lib/pkgconfig" LDFLAGS="-L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib -lpthread -lc -lgcc" CFLAGS="-I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/include" ./configure --host=arm-linux --target=arm-linux --prefix=/home/gyh/mybook/alsa-utils-prefix --disable-alsamixer --with-alsa-prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/lib/ --with-alsa-inc-prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/将/home/gyh/mybook/alsa-utils-prefix目录拷贝到嵌入式文件系统的对应目录上。 (4)alsa配置在启动脚本中添加:(可能您的不需要)/bin/mkdir /dev/snd
/bin/ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c
/bin/ln -s /dev/pcmC0D0p /dev/snd/pcmC0D0p
/bin/ln -s /dev/controlC0 /dev/snd/controlC0
/bin/ln -s /dev/pcmC1D0c /dev/snd/pcmC1D0c
/bin/ln -s /dev/pcmC1D0p /dev/snd/pcmC1D0p
/bin/ln -s /dev/controlC1 /dev/snd/controlC1
/bin/ln -s /dev/seq /dev/snd/seq
/bin/ln -s /dev/timer /dev/snd/timer modprobe.conf文件内容为#for ALSA
alias char-major-116 sndoptions snd cards_limit=2
alias snd-card-0 snd-soc-uda134x #换成您自己的
alias snd-card-1 snd-usb-audio#for OSS
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0#OSS Emulation by ALSA
alias sound-service-0-0  snd-mixer-oss
alias sound-service-0-1  snd-seq-oss
alias sound-service-0-3  snd-pcm-oss
alias sound-service-0-8  snd-seq-oss
alias sound-service-0-12 snd-pcm-ossalias sound-slot-1 snd-card-1alias sound-service-1-0  snd-mixer-oss
alias sound-service-1-1  snd-seq-oss
alias sound-service-1-3  snd-pcm-oss
alias sound-service-1-8  snd-seq-oss
alias sound-service-1-12 snd-pcm-ossoptions snd-soc-uda134x index=0
options snd-usb-audio index=1 asound.conf里内容为# asoc:uda134x                                                                 
                                                                               
pcm.!dmix {                                                                    
        type dmix                                                              
        ipc_key 5678293                                                        
        ipc_key_add_uid yes                                                    
        slave {                                                                
                pcm "hw:0,0"                                                   
                period_time 0                                                  
                period_size 2048                                               
                buffer_size 16384                                              
                format S16_LE                                                  
                rate 48000                                                     
        }                                                                      
}                                                                              
                                                                               
pcm.!dsnoop {                                                                  
        type dsnoop                                                            
        ipc_key 5778293                                                        
        ipc_key_add_uid yes                                                    
        slave {                                                                
                pcm "hw:0,0"                                                   
                period_time 0                                                  
                period_size 2048                                               
                buffer_size 16384                                              
                format S16_LE                                                  
                rate 48000                                                     
        }                                                                      
}                                                                              
                                                                               
pcm.asymed {                                                                   
        type asym                                                              
        playback.pcm "dmix"                                                    
        capture.pcm "dsnoop"                                                   
}                                                                              
                                                                               
pcm.!default {                                                                 
        type plug                                                              
        slave.pcm "asymed"                                                     
}                                                                              
                                                                               
pcm.dsp0 {                                                                     
        type plug                                                              
        slave.pcm "asymed"                                                     
}                                                                              
                                                                               
ctl.mixer0 {                                                                   
        type hw                                                                
        card 0                                                                 
} (5)测试放音和录音./aplay try.wav &显示Playing WAVE "try.wav" : Signed 16 bit Little .....听到音乐了。 ./arecord -t wav -f dat myrecord.wav显示mapped channel 9 to 1Recording WAVE "myrecord.wav" : Signed 16 bit Little Endian, Rate 48000 Hz, Steo
对着麦克风说话,ctrl+C停止./aplay myrecord.wav听到刚才说的话。 设置音量./amixer set Master 50%./amixer set Capture 50%./alsactl store -f asound.state在开机启动脚本中增加脚本使每次开机恢复设置,我增加的脚本如下:/home/gyh/mybook/alsa-utils-prefix/sbin/alsactl restore -f /home/gyh/mybook/alsa-utils-prefix/sbin/asound.state