This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3352: A new audio codec wm8974

Part Number: AM3352
Other Parts Discussed in Thread: TPS65910,

Hi~ Dear Ti

I'm adapting a new audio codec wm8974.

Linux kernel version:3.2.0
Hardware: MCASP0

Get some error log:
aplay -D hw:0,0 -f S16_LE -r 48000 -c 2 /dev/zero
Playing raw data '/dev/zero' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
[ 17.440694] _______Set clk 12288000 success_______
[ 17.445543] asoc: machine hw_params failed
aplay: set_params:1129: Unable to install hw params:
ACCESS: RW_INTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 32
CHANNELS: 2
RATE: 48000
PERIOD_TIME: (42666 42667)
PERIOD_SIZE: 2048
PERIOD_BYTES: 8192
PERIODS: 16
BUFFER_TIME: (682666 682667)
BUFFER_SIZE: 32768
BUFFER_BYTES: 131072
TICK_TIME: 0
And sound/soc/davinci/davinci-evm.c 

static int evm_hw_params(struct snd_pcm_substream *substream,
                         struct snd_pcm_hw_params *params)
{
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
        unsigned sysclk;

        /* ASP1 on DM355 EVM is clocked by an external oscillator */
        if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm() ||
            machine_is_davinci_dm365_evm())
                sysclk = 27000000;

        /* ASP0 in DM6446 EVM is clocked by U55, as configured by
         * board-dm644x-evm.c using GPIOs from U18.  There are six
         * options; here we "know" we use a 48 KHz sample rate.
         */
        else if (machine_is_davinci_evm())
                sysclk = 12288000;

        else if (machine_is_davinci_da830_evm() ||
                                machine_is_davinci_da850_evm())
                sysclk = 24576000;
        /* On AM335X, CODEC gets MCLK from external Xtal (12MHz). */
        else if (machine_is_am335xevm())
#ifdef CONFIG_MACH_AM335XEVM
                if (am335x_evm_get_id() == EVM_SK)
//                      sysclk = 24000000;
                {       printk("_______Set clk 12288000 success_______");
                        sysclk = 12288000;
                }else
#endif
                        sysclk = 12000000;

        else
                return -EINVAL;

        /* set codec DAI configuration */
        ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFM | SND_SOC_DAIFMT_NB_NF);
        if (ret < 0)
                return ret;

        /* set cpu DAI configuration */
        ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_NB_NF);
        if (ret < 0)
                return ret;

        /* set the codec system clock */
        ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_IN);
        if (ret < 0)
        return ret;

        return 0;
}

static struct snd_soc_dai_link am335x_evm_sk_dai = {
        .name = "WM8974",
        .stream_name = "M8974",
        //.cpu_dai_name = "davinci-mcasp.1",            // use mcasp0 on the QY board
        .cpu_dai_name = "davinci-mcasp.0",                              // modify by maoh of 2025-08-01
        .codec_dai_name = "wm8974-hifi",
        //.codec_name = "tlv320aic3x-codec.1-001b",
        .codec_name = "wm8974-codec.1-001a",               // wm8974
        .platform_name = "davinci-pcm-audio",
        .init = evm_aic3x_init,
        .ops = &evm_ops,
};

And arch/arm/mach-omap2/board-am335xevm.c

static struct snd_platform_data am335x_evm_snd_data0 = {
        .tx_dma_offset  = 0x46000000,   /* McASP0 */
        .rx_dma_offset  = 0x46000000,
        .op_mode        = DAVINCI_MCASP_IIS_MODE,
        .num_serializer = ARRAY_SIZE(am335x_iis_serializer_direction0),
        .tdm_slots      = 2,
        .serial_dir     = am335x_iis_serializer_direction0,
        .asp_chan_q     = EVENTQ_2,
        .version        = MCASP_VERSION_3,
        .txnumevt       = 32,
        .rxnumevt       = 32,
        .get_context_loss_count =
                        omap_pm_get_dev_context_loss_count,
};

static struct i2c_board_info __initdata am335x_i2c0_boardinfo[] = {
        {
                I2C_BOARD_INFO("tps65910", TPS65910_I2C_ID1),
                .platform_data  = &am335x_tps65910_info,
        },
        {
                I2C_BOARD_INFO("tlv320aic3x", 0x18),
        },
        {
                I2C_BOARD_INFO("wm8974", 0x1a),
        },
        {
                I2C_BOARD_INFO("ds1338", 0xd0 >> 1),
        },
};

static struct pinmux_config mcasp0_pin_mux[] = {
        {"mcasp0_aclkx.mcasp0_aclkx",   OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_fsx.mcasp0_fsx",               OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_axr0.mcasp0_axr0",             OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_axr1.mcasp0_axr1",             OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_ahclkx.mcasp0_ahclkx", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
        {NULL, 0},
};

WM8974 use externel oscillator 12.288Mhz.
I feel maye i should set MCASP0 to I2S Slave mode and set wm8974 to I2S master mode.
Do you have some suggestion to me?

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • wm8974并不是我们的产品,请到相应厂家进行咨询。

  • 我知道啊,现在我用am3352去适配一个新的codec,目前我需要将am3352的MCASP0设置为I2S从机模式,这个有什么参考嘛?主要我们手里的这个代码过老了,希望能有些参考,谢谢。

  • 问的是am335x系列的问题。

  • 可能没有比较适合的代码,但是AM3352相关代码都在SDK中,可以参考:
    www.ti.com/.../AM3352

  • 好的吧,感谢支持。那个报错我感觉是因为时钟没有配好,但是我不管怎么改都不行,所以来问问有没有什么想法。播放就会报错,时钟也不用量。

  • 我现在已经定位到一个具体的函数了,主要是想知道如何设置时钟,由codec做主的话。snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_OUT)对吗?

  • 我现在传入snd_soc_dai_set_sysclk(cpu_dai, 0, 0, SND_SOC_CLOCK_IN),告诉CPU系统时钟是输入的,但是内核直接跑飞了,请问这是为什么?

    Playing raw data '/usr/test/hotelcalifornia.mp3' : Unsigned 8 bit, Rate 8000 Hz, Mono
    [   22.683906] ______set sysclk 1228800 success_______________SND_SOC_DAIFMT_CBM_CFM____________________________wm8974_set_dai_fmt__________________
    [   22.698399] Unable to handle kernel NULL pointer dereference at virtual address 0000002a
    [   22.707048] pgd = ce690000
    [   22.709870] [0000002a] *pgd=8e4d2831, *pte=00000000, *ppte=00000000
    [   22.716433] Internal error: Oops: 17 [#1]
    [   22.720616] Modules linked in:
    [   22.723809] CPU: 0    Not tainted  (3.2.0 #173)
    [   22.728563] PC is at snd_soc_dai_set_sysclk+0x60/0x84
    [   22.733849] LR is at evm_hw_params+0xd0/0x24c
    [   22.738396] pc : [<c031fd94>]    lr : [<c03658d0>]    psr: a0000013
    [   22.738405] sp : cf3b9dc0  ip : 00000000  fp : cf3b9de4
    [   22.750378] r10: 00000000  r9 : cf70d938  r8 : cf71ecc0
    [   22.755829] r7 : 00000000  r6 : 00000000  r5 : 00000000  r4 : cf71ecc0
    [   22.762637] r3 : 00000002  r2 : 00000000  r1 : 00000000  r0 : cf1bf3c0
    [   22.769448] Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
    [   22.776891] Control: 10c5387d  Table: 8e690019  DAC: 00000015
    [   22.782885] Process aplay (pid: 2109, stack limit = 0xcf3b82f0)
    [   22.789057] Stack: (0xcf3b9dc0 to 0xcf3ba000)
    [   22.793609] 9dc0: c0364254 cf71a840 cf71a840 00bb8000 00000008 000000e0 cf3b9e1c cf3b9de8
    [   22.802143] 9de0: c03658d0 c031fd40 00000001 00000001 00000001 ce089000 cf70d800 ce089000
    [   22.810679] 9e00: cf71a840 cf71ecc0 cf218b80 c0365800 cf3b9e54 cf3b9e20 c032a324 c036580c
    [   22.819216] 9e20: 00000000 cf1bf3c0 cf3b9e54 00000000 cf315400 cf218b80 ce089000 00000000
    [   22.827751] 9e40: cf3b8000 00000000 cf3b9e74 cf3b9e58 c0308d70 c032a2d0 cf218b80 cf218b80
    [   22.836287] 9e60: beae4f2c ce089000 cf3b9ebc cf3b9e78 c0309e38 c0308ce8 00000200 ce32d2e0
    [   22.844822] 9e80: 00000000 ce691000 cf3b9ecc cf3b9e98 c0094a54 cf218b80 beae4f2c ce0ed648
    [   22.853360] 9ea0: 00000004 00000000 cf3b8000 00000000 cf3b9ef4 cf3b9ec0 c030aaa0 c03098e8
    [   22.861893] 9ec0: cf3b9f04 cf3b9ed0 c001a4b0 c005ad80 c0075ee8 c004339c c0075ef4 beae4f2c
    [   22.870426] 9ee0: beae4f2c ce0ed648 cf3b9f04 cf3b9ef8 c030ae7c c030aa6c cf3b9f74 cf3b9f08
    [   22.878959] 9f00: c00b7a98 c030ae50 c004312c c0042f74 cf3b9fb0 00000000 4015527c 00000009
    [   22.887496] 9f20: c06d07d4 0000000a c0071aa0 cf3b8000 00000044 00000000 cf3b9fb0 00000000
    [   22.896029] 9f40: 4015527c 4013b000 cf3b9f6c cf3b9f58 ce4ceb40 beae4f2c c25c4111 00000004
    [   22.904565] 9f60: 00000000 cf3b8000 cf3b9fa4 cf3b9f78 c00b7fb4 c00b7a1c fa200000 00000000
    [   22.913100] 9f80: cf3b9fac 401ffcc0 0002c608 beae4f2c 00000036 c0014428 00000000 cf3b9fa8
    [   22.921636] 9fa0: c0014280 c00b7f44 401ffcc0 0002c608 00000004 c25c4111 beae4f2c 00020001
    [   22.930176] 9fc0: 401ffcc0 0002c608 beae4f2c 00000036 beae54bc 0002c7f8 401fe7dc 00000001
    [   22.938713] 9fe0: 0002c658 beae4e70 4018ac1c 402df1cc 20000010 00000004 00000000 00000000
    [   22.947240] Backtrace: 
    [   22.949806] [<c031fd34>] (snd_soc_dai_set_sysclk+0x0/0x84) from [<c03658d0>] (evm_hw_params+0xd0/0x24c)
    [   22.959604]  r7:000000e0 r6:00000008 r5:00bb8000 r4:cf71a840
    [   22.965547] [<c0365800>] (evm_hw_params+0x0/0x24c) from [<c032a324>] (soc_pcm_hw_params+0x60/0x1cc)
    [   22.974995] [<c032a2c4>] (soc_pcm_hw_params+0x0/0x1cc) from [<c0308d70>] (snd_pcm_hw_params+0x94/0x334)
    [   22.984800] [<c0308cdc>] (snd_pcm_hw_params+0x0/0x334) from [<c0309e38>] (snd_pcm_common_ioctl1+0x55c/0xd8c)
    [   22.995051]  r7:ce089000 r6:beae4f2c r5:cf218b80 r4:cf218b80
    [   23.000985] [<c03098dc>] (snd_pcm_common_ioctl1+0x0/0xd8c) from [<c030aaa0>] (snd_pcm_playback_ioctl1+0x40/0x3e4)
    [   23.011699] [<c030aa60>] (snd_pcm_playback_ioctl1+0x0/0x3e4) from [<c030ae7c>] (snd_pcm_playback_ioctl+0x38/0x3c)
    [   23.022401]  r6:ce0ed648 r5:beae4f2c r4:beae4f2c
    [   23.027249] [<c030ae44>] (snd_pcm_playback_ioctl+0x0/0x3c) from [<c00b7a98>] (do_vfs_ioctl+0x88/0x528)
    [   23.036967] [<c00b7a10>] (do_vfs_ioctl+0x0/0x528) from [<c00b7fb4>] (sys_ioctl+0x7c/0x84)
    [   23.045499]  r9:cf3b8000 r8:00000000 r7:00000004 r6:c25c4111 r5:beae4f2c
    [   23.052333] r4:ce4ceb40
    [   23.055094] [<c00b7f38>] (sys_ioctl+0x0/0x84) from [<c0014280>] (ret_fast_syscall+0x0/0x30)
    [   23.063810]  r8:c0014428 r7:00000036 r6:beae4f2c r5:0002c608 r4:401ffcc0
    [   23.070837] Code: 1a000001 e3e00015 eafffff8 e5903010 (e593c028) 
    [   23.077247] ---[ end trace 30672e2af1c5d9e0 ]---

  • 我自己搞定了,这个3.2内核的代码缺很多东西。

  • 好的,非常高兴问题能解决