中级会员
- 积分
- 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 |
|