在调试adau1761时,驱动正常加载上去,但aplay a.wav时,总是报
_____________________________
aplay /usr/share/sounds/alsa/key.wav
ALSA lib ../../../alsa-lib-1.1.9/src/pcm/pcm_direct.c:1271:(snd1_pcm_direct_initialize_slave) unable to install hw params
ALSA lib ../../../alsa-lib-1.1.9/src/pcm/pcm_dmix.c:1120:(snd_pcm_dmix_open) unable to initialize slave
aplay: main:828: audio open error: Invalid argument
____________________________
dmesg 后kernel 报错如下,
[ 386.622136] fsl-sai 30c30000.sai: id 0, rate:0HZ, freq 11289600hz
[ 386.628252] fsl-sai 30c30000.sai: id 1, rate:12288000HZ, freq 11289600hz
[ 386.635008] fsl-sai 30c30000.sai: id 2, rate:0HZ, freq 11289600hz
[ 386.641160] fsl-sai 30c30000.sai: id 3, rate:0HZ, freq 11289600hz
[ 386.647289] fsl-sai 30c30000.sai: failed to derive required Tx rate: 11289600
[ 386.654465] fsl-sai 30c30000.sai: ASoC: can't set 30c30000.sai hw params: -22
————————————————
错误 提示,跟进源码中,发现在函数:
static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
{
struct fsl_sai *sai = snd_soc_dai_get_drvdata(dai);
unsigned char offset = sai->soc->reg_offset;
unsigned long clk_rate;
unsigned int reg = 0;
u32 ratio, savesub = freq, saveratio = 0, savediv = 0;
u32 id;
int ret = 0;
/* Don't apply to slave mode */
if (sai->slave_mode[tx])
return 0;
fsl_sai_check_ver(dai);
for (id = 0; id < FSL_SAI_MCLK_MAX; id++)
{
clk_rate = clk_get_rate(sai->mclk_clk[id]);
if (!clk_rate)continue;
ratio = clk_rate / freq;
ret = clk_rate - ratio * freq;
/*
* Drop the source that can not be
* divided into the required rate.
*/
if (ret != 0 && clk_rate / ret < 1000) //
continue;
if ((ratio % 2 == 0 && ratio >= 2 && ratio <= 512) ||(ratio == 1 && sai->verid.id >= FSL_SAI_VERID_0301))
{
printk("fsl_sai_set_bclk line:%d \n",__LINE__);
if (ret < savesub) {
saveratio = ratio;
sai->mclk_id[tx] = id;
savesub = ret;
}
if (ret == 0)
break;
}
}
if (saveratio == 0) {
dev_err(dai->dev, "failed to derive required %cx rate: %d\n",tx ? 'T' : 'R', freq);
return -EINVAL;
}
中
if (ret != 0 && clk_rate / ret < 1000)
continue;
我的dts配置如下,
&sai3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai3>;
assigned-clocks = <&clk IMX8MP_CLK_SAI3>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;
assigned-clock-rates = <12288000>;
clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_IPG>, <&clk IMX8MP_CLK_DUMMY>,
<&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>, <&clk IMX8MP_CLK_DUMMY>,
<&clk IMX8MP_CLK_DUMMY>;
clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3";
fsl,sai-mclk-direction-output;
#sound-dai-cells = <0>;
status = "okay";
};
sound-adau1761 {
compatible = "simple-audio-card";
simple-audio-card,name = "adau1761-audio";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-inversion;
simple-audio-card,frame-master = <&adaucpu>;
simple-audio-card,bitclock-master = <&adaucpu>;
adaucpu:simple-audio-card,cpu {
sound-dai = <&sai3>;
dai-tdm-slot-num = <8>;
dai-tdm-slot-width = <32>;
};
simple-audio-card,codec {
sound-dai = <&codec_1>;
};
};
非常感谢各位大佬能指出这个问题所在,先感谢各位了!
Is that any alsa configuration file that Must be config?
@nxpfae
You may take the device tree file of boards under "freescale" folder for reference.
e.g.
Thank you for your replay.
But I think my dts configuration has not big problem because the kernel probe and device not has been generated successfully.
here is my dts changed,
&sai3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai3>;
assigned-clocks = <&clk IMX8MP_CLK_SAI3>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;
assigned-clock-rates = <12288000>;
clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_IPG>, <&clk IMX8MP_CLK_DUMMY>,
<&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>, <&clk IMX8MP_CLK_DUMMY>,
<&clk IMX8MP_CLK_DUMMY>;
clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3";
fsl,sai-mclk-direction-output;
#sound-dai-cells = <0>;
status = "okay";
};
sound-adau1761 {
compatible = "simple-audio-card";
simple-audio-card,name = "adau1761-audio";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-inversion;
simple-audio-card,frame-master = <&adaucpu>;
simple-audio-card,bitclock-master = <&adaucpu>;
adaucpu:simple-audio-card,cpu {
sound-dai = <&sai3>;
dai-tdm-slot-num = <8>;
dai-tdm-slot-width = <32>;
};
simple-audio-card,codec {
sound-dai = <&codec_1>;
};
};
Where is your codec_1?