设为首页 收藏本站
搜索
开启辅助访问 切换到宽版

QQ登录

只需一步,快速开始

注册 找回密码
查看: 7622|回复: 20

[技术讨论] WM8960声卡驱动

[复制链接]
dage 发表于 2014-4-11 22:47:46 | 显示全部楼层 |阅读模式
这几天在调试TQ210的WM8960声卡驱动,发现厂家也是封装成KO了。郁闷!
于是就自己替换厂家的wm8960.ko跟s5pv210_wm8960.ko驱动(位于/system/lib/modules)。
1. 首先要禁止上面2个驱动自动加载。  方法:注释或删掉/system/etc/init.tq210.sh文件中"sound_insmod"即可。
2. 参考网址“http://www.arm9home.net/simple/index.php?t27280.html”即可。
3. 需要注意的是需要修改wm8960.c文件中的“wm8960_reg”。 参考下面即可。
4. 附图为需要注意的地方, 其他的不用做什么修改。。
5. 记得打开"Kernel_3.0.8_TQ210_for_Android_v1.2\sound\soc\samsung\Makefile"中被注释掉的:
obj-$(CONFIG_SND_S5PV2XX_SOC_WM8960)  += snd-soc-s3c-idma.o
obj-$(CONFIG_SND_S5PV2XX_SOC_WM8960)  += snd-soc-i2s.o
snd-soc-wm8960-objs     := wm8960.o
obj-$(CONFIG_SND_SOC_WM8960_TQ210)   += snd-soc-wm8960.o
snd-soc-tq210-wm8960-objs    := tq210_wm8960.o
obj-$(CONFIG_SND_SOC_WM8960_TQ210)  += snd-soc-tq210-wm8960.o


/*
* wm8960 register cache
* We can't read the WM8960 register space when we are
* using 2 wire for device control, so we cache them instead.
*/
static const u16 wm8960_reg[WM8960_CACHEREGNUM] = {
0x0017, 0x0017, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0002,
0x01c0, 0x0040, 0x00ff, 0x00ff,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x007b, 0x0100, 0x0032,
0x0000, 0x00d1, 0x00d1, 0x01c0,
0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000,
0x0100, 0x0130, 0x0050, 0x0050,
0x0050, 0x0050, 0x0000, 0x0000,
0x0079, 0x0079, 0x0040, 0x0000,
0x0000, 0x0050, 0x0050, 0x0000,
0x0002, 0x0037, 0x004d, 0x0080,
0x0008, 0x0031, 0x0026, 0x00e9,
};



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1威望 +10 收起 理由
wpaycn + 10

查看全部评分

 楼主| dage 发表于 2014-6-7 12:57:11 | 显示全部楼层
我的WM8960驱动终于可以录音了。
wm8960_set_dai_fmt最后加入以下两句即可:
         snd_soc_write(codec, WM8960_POWER1, 0xFE);
         snd_soc_write(codec, WM8960_IFACE2, 0x40);
另外TQ210_WM8960.C中要做如下修改:
static struct snd_soc_card tq210_soc_card = {
    .name = "tq210 audio",
    .dai_link = tq210_dai,
    .num_links = 2,
};

具体请见附图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| dage 发表于 2014-4-11 22:54:59 | 显示全部楼层
不好意思, 忘了一点。
wm8960.c中 wm8960_probe函数需要添加如下初始化代码:

#if 1
        reg = snd_soc_read(codec, WM8960_POWER1);
        snd_soc_write(codec, WM8960_POWER1, reg | 0x100);
        reg = snd_soc_read(codec, WM8960_LINPATH);
        snd_soc_write(codec, WM8960_LINPATH, reg | 0x1B8);
        reg = snd_soc_read(codec, WM8960_RINPATH);
        snd_soc_write(codec, WM8960_RINPATH, reg | 0x180);
        reg = snd_soc_read(codec, WM8960_LOUTMIX);
        snd_soc_write(codec, WM8960_LOUTMIX, reg | 0x100);
        reg = snd_soc_read(codec, WM8960_ROUTMIX);
        snd_soc_write(codec, WM8960_ROUTMIX, reg | 0x100);
        reg = snd_soc_read(codec, WM8960_BYPASS1);
        snd_soc_write(codec, WM8960_BYPASS1, reg | 0x080);
        reg = snd_soc_read(codec, WM8960_LOUT1);
        snd_soc_write(codec, WM8960_LOUT1, reg | 0x17F);
        reg = snd_soc_read(codec, WM8960_ROUT1);
        snd_soc_write(codec, WM8960_ROUT1, reg | 0x17F);
        reg = snd_soc_read(codec, WM8960_ADDCTL2);
        snd_soc_write(codec, WM8960_ADDCTL2, reg);
        reg = snd_soc_read(codec, WM8960_INBMIX1);
        snd_soc_write(codec, WM8960_INBMIX1, reg | 0x00E);
        reg = snd_soc_read(codec, WM8960_INBMIX2);
        snd_soc_write(codec, WM8960_INBMIX2, reg | 0x00E);
        reg = snd_soc_read(codec, WM8960_LOUTMIX);
        snd_soc_write(codec, WM8960_LOUTMIX, (reg & 0xF0F) | 0x80);
        reg = snd_soc_read(codec, WM8960_ROUTMIX);
        snd_soc_write(codec, WM8960_ROUTMIX, (reg & 0xF0F) | 0x80);
        reg = snd_soc_read(codec, WM8960_POWER3);
        snd_soc_write(codec, WM8960_POWER3, reg | 0x0C);
        reg = snd_soc_read(codec, WM8960_LOUT2);
        snd_soc_write(codec, WM8960_LOUT2, reg | 0x0F);
        reg = snd_soc_read(codec, WM8960_ROUT2);
        snd_soc_write(codec, WM8960_ROUT2, reg | 0x0F);
        reg = snd_soc_read(codec, WM8960_POWER2);
        snd_soc_write(codec, WM8960_POWER2, reg | 0x60);
#endif

hustljh 发表于 2014-4-12 00:38:29 | 显示全部楼层
好资料,学习了。

s1005056 发表于 2014-5-6 17:09:27 | 显示全部楼层
本帖最后由 s1005056 于 2014-5-6 17:27 编辑

感謝 dage 大的分析! 終於可以從TQ210聽到順暢的音樂了!

最後請問一下 dage 大,你的tq210_wm8960.c裡面是否有修改成如下的配置?
由於自行寫出來的驅動程式若沒有如下的修改,則會沒有聲音,不知道是不是有其他地方沒有改對,謝謝dage

  1. #define CDCLK         1
  2. #define CLKAUDIO    3

  3. /* 設置cpu dai的主時鐘 */
  4. // ret = snd_soc_dai_set_sysclk( cpu_dai, S3C64XX_CLKSRC_CDCLK, rate, SND_SOC_CLOCK_OUT );        //44100, original code
  5. ret = snd_soc_dai_set_sysclk( cpu_dai, CDCLK, rate, SND_SOC_CLOCK_OUT );        //44100
  6. if( ret < 0 ){
  7.        dprintk( "-%s(): AP sycclk CDCLK setting error, %d\n", __FUNCTION__, ret );
  8.        return ret;
  9. }

  10. // ret = snd_soc_dai_set_sysclk( cpu_dai, S3C_CLKSRC_CLKAUDIO, rate, SND_SOC_CLOCK_OUT );        //44100, original code
  11. ret = snd_soc_dai_set_sysclk( cpu_dai, CLKAUDIO, rate, 3 );        //44100
  12. if( ret < 0 ){
  13.        dprintk( "-%s(): AP sysclk CLKAUDIO setting error, %d\n", __FUNCTION__, ret );
  14.        return ret;
  15. }
复制代码




 楼主| dage 发表于 2014-5-6 21:20:14 | 显示全部楼层
我这边是这样初始化的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
s1005056 发表于 2014-5-8 10:33:26 | 显示全部楼层
喔喔~那看起來是一樣的
想再請問dage,應該如何得知
ret = snd_soc_dai_set_sysclk( cpu_dai, CDCLK, rate, CDCLK);        //44100
CDCLK的數值應該為1 ,而
ret = snd_soc_dai_set_sysclk( cpu_dai, CLKAUDIO, rate, CLKAUDIO );        //44100
CLKAUDIO的數值為3呢?是要看datasheet的哪一部分呀?

謝謝回覆

 楼主| dage 发表于 2014-5-18 10:30:52 | 显示全部楼层
这个我也是从网上下载的,没有过多研究。

s1005056 发表于 2014-6-4 18:13:34 | 显示全部楼层
dage 发表于 2014-5-18 10:30
这个我也是从网上下载的,没有过多研究。

請問dage大有試過錄音是否正常嗎?剛剛測試發現收不到音...QQ

 楼主| dage 发表于 2014-6-5 22:24:18 | 显示全部楼层
我的QQ也启动不了录音功能。

 楼主| dage 发表于 2014-6-5 22:25:54 | 显示全部楼层
现在用厂家的zImage_3.0.8_for_android_V1.0.bin也启动不了录音。

s1005056 发表于 2014-6-6 13:32:55 | 显示全部楼层
dage 发表于 2014-6-5 22:25
现在用厂家的zImage_3.0.8_for_android_V1.0.bin也启动不了录音。

廠家的很久之前試過好像是可以錄音的,但是剛剛測卻收不了音...怪怪的

感謝dage大大幫忙測試

s1005056 发表于 2014-6-9 17:34:35 | 显示全部楼层
本帖最后由 s1005056 于 2014-6-9 18:54 编辑
dage 发表于 2014-6-7 12:57
我的WM8960驱动终于可以录音了。
wm8960_set_dai_fmt最后加入以下两句即可:
         snd_soc_write(cod ...

請問dage大是用什裝置來做錄音的呢?
是板子上自帶的麥克風,還是另外接的呢?
另外請問dage有試過錄音超過5秒嗎?因為我的板子前3秒都還可以錄音,當log出現
samsung-i2s samsung-i2s.0: i2s_set_sysclk:533 Other DAI busy
後,就什麼都收不到了=口="


謝謝dage大回覆

 楼主| dage 发表于 2014-6-10 14:08:12 | 显示全部楼层
我这边用的是自带的那个"HI-MP3"录音的。
我这边用厂家自带的驱动也智能录音3s。
我自己的可以移植录音。我用的是外接的MIC。


 楼主| dage 发表于 2014-6-10 22:21:27 | 显示全部楼层
刚试了下,用板子上自带的MIC,也是可以录音的。
用自带的Hi-Q MP3录音机录了30s,都没什么问题。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|天嵌计算机科技 ( 粤ICP备11094220号  

GMT+8, 2017-11-22 11:59 , Processed in 0.500460 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表