OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7494|回复: 15

Linux5.10移植ALSA驱动WM8960求助

[复制链接]

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
发表于 2021-6-1 09:24:44 | 显示全部楼层 |阅读模式
原子哥的样例是4.x版本,ALSA驱动架构相对比较老,新版kernel有调整,整体驱动框架设计合理很多;我也一直是拿5.10版本再玩;Kernel源码里没有imx-wm8960的驱动了,替代有一个通用的alsa驱动,fsl-asoc-card.c;理论上配合设备树,驱动就能生效,但是调试了很多次,声卡创建了,PCM设备也有了,aplay播放还是没有声音;
做了如下修改,懂的大神指导一下:
1. 在WM8960驱动里,在设置PLL的时候,将通路相关的配置和音量增益设置加进去;
2. 设备树里定义了clock为SAI2和mclk,但是没有gpr,但需要增加另外一个属性,fsl,sai-mclk-direction-output,我看了源码,起相同作用的;
3. 在驱动fsl-asoc-card.c里,if(of_device_is_compatible(np, "fsl,imx-audio-wm8960")) 条件下,priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM 改成 SND_SOC_DAIFMT_CBS_CFS;因为原理图上看wm8960是做从的;
另外,原子哥的样例里,DTS里有一项codec  master的属性,把我搞晕了,到底wm8960是做主还是从?有谁能一起讨论下的吗?

声卡创建成功,PCM设备也有,开始使用44.1KHZ的文件播放,log显示是设置时钟出错,无法得出这个采样率的比例ratio,换成48KHz的采样率之后可以,但是播放还是没声音,中间会出现under run;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-6-1 09:46:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2021-6-2 09:50:01 | 显示全部楼层
帮顶!
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2021-6-7 08:50:34 | 显示全部楼层
别沉了,有没有熟悉的,可以一起讨论下
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2021-9-28 08:50:46 | 显示全部楼层
看来对Linux 音频开发感兴趣的人不多啊;
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2021-9-28 08:54:46 | 显示全部楼层
以上相同操作,在原子出厂版本的kernel的驱动里,是起作用的,声音播放正常,这就说不清楚为什么了;
回复 支持 反对

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2021-9-28 09:48:37 | 显示全部楼层
顶一下,别沉了。
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2021-10-16 21:23:48 | 显示全部楼层
搞定了,说下大概的经过;
Linux-5.10版本里面包含了wm8960的驱动,但是声卡部分的,复用fsl-asoc-card.c也是可以使用的;
需要修改几处配置:
第一条:wm8960不需要配置PLL和CLK,因为原子的板子是CODEC做从,是根据输入的时钟来工作的;
第二条不需要,imx6ul-14x14-evk.dtsi默认的配置就包含了fsl,sai-mclk-direction-output属性;
第三条,对应第一条,wm8960不需要配置时钟,那么ASOC里的machine驱动部分就需要指定一些配置,在fsl-asoc-card.c文件里,fsl_asoc_card_probe函数,针对属性为“fsl,imx-audio-wm8960”的case,修改成如下:
                codec_dai_name = "wm8960-hifi";
                priv->cpu_priv.sysclk_freq[TX] = priv->codec_priv.mclk_freq;
                priv->cpu_priv.sysclk_freq[RX] = priv->codec_priv.mclk_freq;
                priv->cpu_priv.sysclk_dir[TX] = SND_SOC_CLOCK_OUT;
                priv->cpu_priv.sysclk_dir[RX] = SND_SOC_CLOCK_OUT;
                priv->cpu_priv.slot_width = 32;
                priv->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;

参考源码里,soc做主的case:"fsl,imx-audio-cs42888"
指定了soc的时钟参数和最重要的dai_fmt,即codec做从,默认是codec做主的;
sysclk_freq赋值为codec_priv.mclk_freq,查找代码,是需要配置clk信息在codec的dts节点里:
修改codec的dts节点如下:
        codec: wm8960@1a {
                #sound-dai-cells = <0>;
                compatible = "wlf,wm8960";
                reg = <0x1a>;
                clocks = <&clks IMX6UL_CLK_SAI2>;        //
                clock-names = "mclk";                                //

                wlf,shared-lrclk;
        };

第四条:配置声卡的dts信息:
在根节点下添加一个sound节点,把imx6ul-14x14-evk.dtsi里的删掉;
    sound {
        compatible = "fsl,imx-audio-wm8960";
        model = "imx6ul-wm8960";
        audio-cpu = <&sai2>;
        audio-codec = <&codec>;
        audio-asrc = <&asrc>;

        audio-routing =
            "Headphone Jack", "HP_L",
            "Headphone Jack", "HP_R",
            "LINPUT2", "Mic Jack",
            "LINPUT1", "Mic Jack",
            "RINPUT1", "Mic Jack",
            "RINPUT2", "Mic Jack";
    };
很多属性我还没有添加,这个是最简单的了;可以正常播放的

第五条:Linux5.10内核版本里,imx6ul-14x14-evk.dtsi配置的sai2的时钟是12288000,是对应的48KHz的采样率,原子的版本是11289600,对应的是44.1KHz;
第六条:一切配置好之后,加载好驱动,就可以看到声卡信息;
但是直接播放没有声音,也是我这个帖子之前贴出来询问的:原因是因为CODEC的默认配置问题,8960里的组件默认状态都是关闭的,也就是声音数据即使进入codec,也是无法听到的,需要配置通路信息;
以板载的小喇叭为例,需配置如下:
1. 因为喇叭接在speaker Right out上,需要打开对应的mixer
amixer cset numid=54,iface=MIXER,name='Right Output Mixer PCM Playback Switch' 1
2. 设置speaker的音量为最大
amixer cset numid=13,iface=MIXER,name='Speaker Playback Volume' 127
3. 设置DAC里播放音量为230 step,最大为255
amixer cset numid=10,iface=MIXER,name='Playback Volume' 230

然后使用aplay -D hw:0,0 xxx.wav 即可听到声音;
wav文件需48KHz采样率的;

怎么配置codec通路的,也是我在空闲时研究alsa的widget和routing时才弄明白的;需要根据原理图,对应着8960的通路图来配置;
再送一个配置,headphone 输出音频的配置:
amixer cset numid=51,iface=MIXER,name='Left Output Mixer PCM Playback Switch' 1
amixer cset numid=54,iface=MIXER,name='Right Output Mixer PCM Playback Switch' 1

amixer cset numid=11,iface=MIXER,name='Headphone Playback Volume' 127
amixer cset numid=10,iface=MIXER,name='Playback Volume' 230
回复 支持 反对

使用道具 举报

3

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2019-10-21
在线时间
40 小时
发表于 2021-10-17 21:56:37 | 显示全部楼层
帮顶,顺便我想请教一下,alsa-lib 和 alsa-utils 移植后,播放正常,无法录制的问题怎么解决啊
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2021-10-18 15:48:02 | 显示全部楼层
JerryHandsome 发表于 2021-10-17 21:56
帮顶,顺便我想请教一下,alsa-lib 和 alsa-utils 移植后,播放正常,无法录制的问题怎么解决啊

需要配置MIC录音通路,看下wm8960的通路图,数据经过哪些组件,对应的都要配置,还有capture volume也需要设置,默认的比较小;
回复 支持 反对

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2021-10-18 18:19:28 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

1

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2021-3-9
在线时间
56 小时
发表于 2021-10-18 18:49:20 | 显示全部楼层
主线上的nxp官方板应该有对应的更改,可以看下他们的设备树以及驱动部分,参考一下
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-2-16
在线时间
5 小时
发表于 2022-4-11 13:18:32 | 显示全部楼层
jzhang123 发表于 2021-10-18 15:48
需要配置MIC录音通路,看下wm8960的通路图,数据经过哪些组件,对应的都要配置,还有capture volum ...

阿尔法imx6ull开发板wm8960原理图及amixer配置左右声道相反问题:硬件接线图上MAIN_MIC是接在LINPUT1和LINPUT2左声道,而在使用MIC录音时,通过amixer sset配置输入音频路径时,却配置的是RINPUT2(右声道),到底是什么原因导致配置与原理图相反?
回复 支持 反对

使用道具 举报

1

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2021-3-9
在线时间
56 小时
发表于 2022-4-20 11:45:31 | 显示全部楼层
aneycj 发表于 2022-4-11 13:18
阿尔法imx6ull开发板wm8960原理图及amixer配置左右声道相反问题:硬件接线图上MAIN_MIC是接在LINPUT1和LI ...

旧版内核里面的bug,驱动里面定义的寄存器和名称反了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2021-1-3
在线时间
21 小时
发表于 2022-5-31 16:13:35 | 显示全部楼层
请问楼主,是配置不对通路会出现underrun!!! 吗?我的按照您的方案配置了还是不行,一直循环输出错误underrun,只不过我的主控是s5pv210,但我想我的问题和你一模一样呀,都快卡这一个月了
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
 楼主| 发表于 2022-9-3 20:30:06 | 显示全部楼层
13132587810 发表于 2022-5-31 16:13
请问楼主,是配置不对通路会出现underrun!!! 吗?我的按照您的方案配置了还是不行,一直循环输出错误underr ...

出现under run估计是时钟配置的问题,你的采样率跟时钟不匹配了,可以换个采样率的音频播放试试看
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 09:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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