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.

EDMA傳輸沒有進入callback funtion?(AM335X, Mcasp0, 2TX, 2RX)

Other Parts Discussed in Thread: LM49350

硬體環境:
     定制一塊3358(zch package)的板子
     透過mcasp0與兩個lm49350相接
     codec1:
          TX:axr3
          RX:axr4
     codec2:
          TX:axr0
          RX:axr1
問題:
     1.單顆codec(1TX, 1RX)測試下
       dma傳輸並沒有發生? 沒有進入davinci-pcm.c, davinci_pcm_dma_irq()
       CLK部份:
          MCLK : 12MHz
          SCLK : 1.5MHz
          LRCK : 48kHz
       改了am335x_evm_snd_data1中的.asp_chan_q
       全部的number, 只有EVENTQ_0能讓DMA傳輸就能正常運作
       但是不知道為什麼會這樣? 不知道哪些可能的因素會造成這樣?
     2.在davinci-pcm.c中的davinci_pcm_dma_request()
        ret = prtd->asp_channel = edma_alloc_channel(params->channel,
            davinci_pcm_dma_irq, substream,
            prtd->params->asp_chan_q);
        params->channel 印出來的值為9,
        若仿照edma_test.c中將params->channel改成EDMA_CHANNEL_ANY
        則無法進入callback funtion - davinci_pcm_dma_irq()
        是因為有些dma channel是保留做特殊用途嗎?
     3.最終我們要實現的是2TX, 2RX
        但是目前在2TX, 2RX下, DMA的傳輸無法運作, 一次都沒有進入davinci_pcm_dma_irq()
        以下是我們目前有修改的部分, 但始終無法正確傳輸
        能否提供些能讓driver能支援mutil channel的方向
相關修改:
>>board-am335xevm.c
/* Module pin mux for mcasp0 */
static struct pinmux_config mcasp0_pin_mux[] = {
     {"mcasp0_ahclkx.mcasp0_ahclkx", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
     {"mcasp0_aclkx.mcasp0_aclkx", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
     {"mcasp0_fsx.mcasp0_fsx", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
  // codec 1
     {"mcasp0_axr0.mcasp0_axr0", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},                // D12
     {"mcasp0_axr1.mcasp0_axr1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},  // D13
  // codec 2
     {"mcasp0_ahclkr.mcasp0_axr2", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},              // C12
     {"mcasp0_fsr.mcasp0_axr3", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},    // C13
     {NULL, 0},
};
static u8 am335x_iis_serializer_direction1[] = {
     //INACTIVE_MODE,     INACTIVE_MODE,     TX_MODE,     RX_MODE,           // codec1
     //TX_MODE,     RX_MODE,     INACTIVE_MODE,     INACTIVE_MODE,           // codec2
      TX_MODE,     RX_MODE,     TX_MODE,     RX_MODE,                               // codec1, 2
      INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,
      INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,
      INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,     INACTIVE_MODE,
};
static struct snd_platform_data am335x_evm_snd_data1 = {
     .tx_dma_offset     = 0x46000000,     /* McASP0 0x46000000 */
     .rx_dma_offset     = 0x46000000,
     .op_mode     = DAVINCI_MCASP_IIS_MODE,
     .num_serializer     = ARRAY_SIZE(am335x_iis_serializer_direction1),
     .tdm_slots     = 2,
     .serial_dir     = am335x_iis_serializer_direction1,
     .asp_chan_q     = EVENTQ_0,
  //.asp_chan_q     = EVENTQ_1,         //=> x
  //.asp_chan_q     = EVENTQ_2,       //=> x
  //.asp_chan_q     = EVENTQ_3,       => x
  //.asp_chan_q     = EVENTQ_DEFAULT, => x
     .version     = MCASP_VERSION_3,
  // .txnumevt     = 1,      // single code 1 TX
  // .rxnumevt     = 1,      // single code 1 RX
     .txnumevt     = 2,
     .rxnumevt     = 2,
};
錯誤訊息:
/ # aplay -D"hw:0,0" -r16000 -traw -fS16_LE -c1 c304-2_48k_16bits_stereo_49s.wav

[   53.275665] Trace davinci-pcm.c: davinci_pcm_open
[   53.280670] Trace davinci-pcm.c: davinci_pcm_dma_request : prtd->asp_channel:8, prtd->params->asp_chan_q=0, prtd->asp_link[0]=191
Playing WAVE 'c304-2_48k_16bits_stereo_49s.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
[   53.398864] Trace davinci-pcm.c: davinci_pcm_prepare
[   53.467315] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 0, hwbuf = ffda0000
[   53.487030] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 2000, hwbuf = ffda2000
[   53.560485] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 4000, hwbuf = ffda4000
[   53.582000] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 6000, hwbuf = ffda6000
[   53.601409] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 8000, hwbuf = ffda8000
[   53.661102] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = a000, hwbuf = ffdaa000
[   53.680847] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = c000, hwbuf = ffdac000
[   53.701324] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = e000, hwbuf = ffdae000
[   53.774719] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 10000, hwbuf = ffdb0000
[   53.794219] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 12000, hwbuf = ffdb2000
[   53.853851] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 14000, hwbuf = ffdb4000
[   53.874481] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 16000, hwbuf = ffdb6000
[   53.893951] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 18000, hwbuf = ffdb8000
[   53.949310] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 1a000, hwbuf = ffdba000
[   53.973114] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 1c000, hwbuf = ffdbc000
[   53.994262] pcm_lib: transfer 8192 bytes, runtime->dma_bytes = 131072, runtime->dma_addr = 8f100000, runtime->dma_area = ffda0000, frames_to_bytes(runtime, hwoff) = 1e000, hwbuf = ffdbe000
[   54.011962] Trace davinci-pcm.c: davinci_pcm_trigger [start]
[   54.017913] Trace davinci-mcasp.c: davinci_mcasp_trigger
[   54.023498] Trace davinci-mcasp.c: davinci_mcasp_start
[   54.028900] Trace davinci-mcasp.c: mcasp_start_tx
aplay: pcm_write:1939: write error: Input/output error
[   64.070800] Trace davinci-mcasp.c: davinci_mcasp_trigger
[   64.077667] Trace davinci-mcasp.c: mcasp_stop_tx
/ #
  • Jiang,你这个问题,解决了吗?我也正准备使用一个McASP接两个CODEC,如您已解决,能给相关的一些建议吗?我邮箱是gzwader@163.com,谢了!

  • ERIC1 说:

    Jiang,你这个问题,解决了吗?我也正准备使用一个McASP接两个CODEC,如您已解决,能给相关的一些建议吗?我邮箱是gzwader@163.com,谢了!

    请问您运行的os是linux么?如果是,软件已经做好了

  • 有没有关于EDMA的一些设计资料,最近在关注GPMC接口的DMA传输

  • Yaoming,非常感谢你的的回复,我这边运行的OS是LINUX,用一个McASP接两个CODEC,也就是一个MCASP当作两个I2S总线使用,如果软件已做好了,能否给一些建议呢?或着内核版本是多少,我找了些资料也没有找到相关的介绍,例如如下参数该如何修改。

    static u8 am335x_iis_serializer_direction0[] = { 
     TX_MODE, INACTIVE_MODE, RX_MODE,        INACTIVE_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
    };
     这个我知道应改成:

    static u8 am335x_iis_serializer_direction0[] = { 
     TX_MODE, RX_MODE, TX_MODE,  RX_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
     INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
    };
     

    但后面的不知道如何修改?

    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 = 1,
     .rxnumevt = 1,
    };

    :sound/soc/davinci/davinci-evm.c
    static struct snd_soc_dai_link am335x_evm_dai = {
     .name = "TLV320AIC3X",
     .stream_name = "AIC3X",
     .cpu_dai_name = "davinci-mcasp.0", //1-->0
     .codec_dai_name = "tlv320aic3x-hifi",
     .codec_name = "tlv320aic3x-codec.3-001b", //2-->1
     .platform_name = "davinci-pcm-audio",
     .init = evm_aic3x_init,
     .ops = &evm_ops,
    };