imx8mp adau1761 audio codec driver error

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

imx8mp adau1761 audio codec driver error

964 Views
HelloMather
Contributor I

在调试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>;
};
};

 

非常感谢各位大佬能指出这个问题所在,先感谢各位了!

 

0 Kudos
Reply
6 Replies

860 Views
HelloMather
Contributor I

Is that any alsa configuration file that Must be config?

0 Kudos
Reply

906 Views
HelloMather
Contributor I

@nxpfae

0 Kudos
Reply

870 Views
jimmychan
NXP TechSupport
NXP TechSupport

You may take the device tree file of boards under "freescale" folder for reference.

e.g.

https://github.com/nxp-imx/linux-imx/blob/imx_5.4.70_2.3.0/arch/arm64/boot/dts/freescale/imx8mp-evk-...

0 Kudos
Reply

862 Views
HelloMather
Contributor I

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>;
};
};

0 Kudos
Reply

839 Views
jimmychan
NXP TechSupport
NXP TechSupport

Where is your codec_1?

0 Kudos
Reply

748 Views
HelloMather
Contributor I
here is my i2c codec_1 dts node, 
&i2c2 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
 
codec_1: adau1761@39 {
#sound-dai-cells = <0>;
compatible = "adi,adau1761";
reg = <0x39>;
clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>;
clock-names = "mclk";
};
 
};
0 Kudos
Reply