jz2440ARM开发板下添加Linux3.4.2的wm8976音频模块驱动

来源:互联网 发布:不要网络的搜题软件 编辑:程序博客网 时间:2024/05/20 17:23

环境:

硬件平台:韦东山JZ2440开发板,搭载wm8976音频模块

软件平台:VM、Ubuntu9.10、arm-linux-gcc-4.4.3、Linux3.4.2版本源码


最近在搞jz2440嵌入式,之前做UVC驱动,由于韦东山教程自带的linux2.6.22内核不支持UVC V4L2因此就移植了Linux3.4.2内核,这个内核非常棒,也比较新,基本够用了,然后使用arm-linux-gcc-4.4.3编译器作为开发环境,个人觉得这是最佳拍档了,呵呵~移植的过程中也是各种心酸,其中最难解决的就是wm8976音频驱动的问题,网上相关文章很少,找到的也只是只言片语,于是整整花了三天终于搞定。为了帮助兄弟们少走弯路,特地把过程记录下来,请叫我雷锋蜀黍~文章可能写的有点乱(几乎纯代码),呵呵,难为程序猿了,不喜勿喷。

1、虚拟机cd到linux3.4.2源码目录

2、添加文件sound/soc/codecs下面添加wm8976.c和wm8976.h文件,添加soc/samsung/s3c2440_wm8976.c文件,由于篇幅有限,相关文件放到本文后面供大家下载,拿走不谢~

3、修改文件

3.1
gedit sound/soc/codecs/Kconfig 在select SND_SOC_UDA134X下面添加(前面加个tab键,不是空格~~~)        <TAB>select SND_SOC_WM89763.2在
config SND_SOC_UDA134X         tristate  
下面添加config SND_SOC_WM8976    <space>tristate
3.3 gedit sound/soc/codecs/Makefile 在snd-soc-wm1250-ev1-objs := wm1250-ev1.o下面添加snd-soc-wm8976-objs := wm8976.o 在obj-$(CONFIG_SND_SOC_UDA134X)+= snd-soc-uda134x.o下面添加obj-$(CONFIG_SND_SOC_WM8976)+= snd-soc-wm8976.o3.4gedit sound/soc/samsung/dma.cdma_info.len = prtd->dma_period*limit;改为/*modify by pang 2017-6-13*/dma_info.len = prtd->dma_period;在static void audio_buffdone(void *data)函数中    注释掉:/*prtd->dma_pos += prtd->dma_period;if (prtd->dma_pos >= prtd->dma_end)prtd->dma_pos = prtd->dma_start;if (substream)snd_pcm_period_elapsed(substream);    */ 在spin_unlock(&prtd->lock);下面添加/*add by pang 2017-6-13*/if (substream)snd_pcm_period_elapsed(substream);    3.5 gedit sound/soc/samsung/Kconfig
在select SND_SOC_L3 select SND_SOC_UDA134X下面添加 config SND_SOC_SAMSUNG_S3C24XX_WM8976tristate "SoC I2S Audio support WM8976 wired to a S3C24XX"depends on SND_SOC_SAMSUNG && ARCH_S3C24XXselect SND_S3C24XX_I2Sselect SND_SOC_L3select SND_SOC_WM89763.6    gedit sound/soc/samsung/Makefile 在snd-soc-s3c24xx-uda134x-objs := s3c24xx_uda134x.o下面添加snd-soc-s3c24xx-wm8976-objs := s3c2440_wm8976.o     在obj-$(CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X) += snd-soc-s3c24xx-uda134x.o下面添加obj-$(CONFIG_SND_SOC_SAMSUNG_S3C24XX_WM8976) += snd-soc-s3c24xx-wm8976.o3.7修改mach-smdk2440.c,添加初始化模块gedit arch/arm/mach-s3c24xx/mach-smdk2440.c 在#include <plat/common-smdk.h>下面添加#include <sound/s3c24xx_uda134x.h>在该文件的前面添加下面几个函数(后面用到)/*add by pang 2017-6-13*/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};/*add by pang 2017-6-13*/static struct platform_device smdk2440_audio = {.name= "s3c24xx_uda134x",.id= 0,.dev= {.platform_data= &smdk2440_audio_pins,},};/*add by pang 2017-6-13*/static struct platform_device uda1340_codec = {.name = "uda134x-codec",.id = -1,};在函数 static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_ohci, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis,下面添加:&smdk2440_audio, /*modify by pang 2017-6-13*/&samsung_asoc_dma, /*modify by pang 2017-6-13*//*modify by pang ,this will case problem of touchscreens and sounddevice has problem when play audio in jz2440 2017-6-13*///&uda1340_codec, 把s3c24xx_init_clocks(16934400);改为s3c24xx_init_clocks(12000000);3.8配置内核编译菜单-> 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
$make uImage
enjoy it!大功告成,好运~


相关代码下载
阅读全文
0 0
原创粉丝点击