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.

TDA4VM: UDMA 2D setup: Should dicnt0 always be equal to icnt0?

Part Number: TDA4VM

Hi,

I'm trying to setup a Column2Row transformation using appUdma API, as depicted below:

As you can see, I'm using dicnt0 = 4, while icnt0 = 1. This does not work. However, if I use dicnt0=1, dicnt1=4, ddim1=1, then it works.

I haven't seen documented anywhere that dicnt0 should always be equal to icnt0. Is this UDMA API quirk?

Here's an approximation of my code:

int32_t Col2Row_4x4(float* src, float* dst)
{
    app_udma_copy_nd_prms_t prms_nd;
    int32_t ret = 0;

    /* Set Up the Copy */
    appUdmaCopyNDPrms_Init(&prms_nd);
    prms_nd.copy_mode = 0;
    prms_nd.eltype = 0;
    
    /* Source Params */
    prms_nd.icnt0 = sizeof(float;
    prms_nd.icnt1 = 4;
    prms_nd.icnt2 = 1;
    prms_nd.icnt3 = 1;
    prms_nd.dim1 = sizeof(float);
    prms_nd.dim2 = 0;
    prms_nd.dim3 = 0;
    prms_nd.src_addr = (uint64_t) src;
    
    /* Destination Params */
    prms_nd.dicnt0 = sizeof(float) * 4;
    prms_nd.dicnt1 = 1;
    prms_nd.dicnt2 = 1;
    prms_nd.dicnt3 = 1;
    prms_nd.ddim1 = 0;
    prms_nd.ddim2 = 0;
    prms_nd.ddim3 = 0;
    prms_nd.dest_addr = (uint64_t) dst;
    
    
    ret = appUdmaCopyNDInit(udmaCpyCh, prms_nd);
    if (0 == ret)
    {
        ret = appUdmaCopyNDTrigger(udmaCpyCh);
        if (0 == ret)
        {
            ret = appUdmaCopyNDWait(udmaCpyCh);
        }
        appUdmaCopyNDDeinit(udmaCpyCh);
    }
    return ret;
}

  • Hi FredC_LT,

    Are you using any trigger or Event functionality on icnt0? Then in this case, both src and dst parameters must be same. 

    Regards,

    Brijesh

  • i Brijesh,

    I'm using the vision_apps app_udma API.

    Specifically:

    • appUdmaCopyNDInit()
    • appUdmaCopyNDTrigger()
    • appUdmaCopyNDWait()

    appUdmaCopyNDInit() initializes a CSL_UdmapTR15* with the following flags:

    pTr->flags  = CSL_FMK(UDMAP_TR_FLAGS_TYPE, CSL_UDMAP_TR_FLAGS_TYPE_4D_BLOCK_MOVE);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EOL, 0U);
    
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
    
    
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
    
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U);
    pTr->flags |= CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
    

    appUdmaCopyNDTrigger() calls 
    Udma_chSetSwTrigger(ch_obj->drv_ch_handle, CSL_UDMAP_TR_FLAGS_TRIGGER_GLOBAL0);
     
    Do these classify as triggers/events on ICNT0?
  • Hi FredC_LT,

    ok, this does not enable any trigger or event, so it should work. Let me check with team if there is any other restriction.

    Regards,

    Brijesh

  • Hi FredC_LT,

    Can you please try with below highlighted change? 

    int32_t Col2Row_4x4(float* src, float* dst)

    {

        app_udma_copy_nd_prms_t prms_nd;

        int32_t ret = 0;

     

        /* Set Up the Copy */

        appUdmaCopyNDPrms_Init(&prms_nd);

        prms_nd.copy_mode = 0;

        prms_nd.eltype = 0;

       

        /* Source Params */

        prms_nd.icnt0 = sizeof(float);

        prms_nd.icnt1 = 4;

        prms_nd.icnt2 = 1;

        prms_nd.icnt3 = 1;

        prms_nd.dim1 = sizeof(float) * 4; // size of element * number of elements in row.

        prms_nd.dim2 = 0;

        prms_nd.dim3 = 0;

        prms_nd.src_addr = (uint64_t) src;

       

        /* Destination Params */

        prms_nd.dicnt0 = sizeof(float) * 4;

        prms_nd.dicnt1 = 1;

        prms_nd.dicnt2 = 1;

        prms_nd.dicnt3 = 1;

        prms_nd.ddim1 = 0;

        prms_nd.ddim2 = 0;

        prms_nd.ddim3 = 0;

        prms_nd.dest_addr = (uint64_t) dst;

       

        

        ret = appUdmaCopyNDInit(udmaCpyCh, prms_nd);

        if (0 == ret)

        {

            ret = appUdmaCopyNDTrigger(udmaCpyCh);

            if (0 == ret)

            {

                ret = appUdmaCopyNDWait(udmaCpyCh);

            }

            appUdmaCopyNDDeinit(udmaCpyCh);

        }

        return ret;

    }

  • That was probably initially a typo. I double-checked and it is what I'm using.

        prm.icnt0 = sizeof(float);
        prm.icnt1 = 4;
        prm.icnt2 = 1;
        prm.icnt3 = 1;
        prm.dim1 = sizeof(float) * 4;
        prm.dim2 = 0;
        prm.dim3 = 0;
    
        // set the dest parameters
        prm.dicnt0 = sizeof(float) * 4;
        prm.dicnt1 = 1;
        prm.dicnt2 = 1;
        prm.dicnt3 = 1;
        prm.ddim1 = 0;
        prm.ddim2 = 0;
        prm.ddim3 = 0;

    Output:

    src: {
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
    }
    dst: {
      { 1, 0, 0, 0 },
      { 0, 0, 0, 0 },
      { 0, 0, 0, 0 },
      { 0, 0, 0, 0 },
    }

    If I use this instead:

        prm.icnt0 = sizeof(float);
        prm.icnt1 = 4;
        prm.icnt2 = 1;
        prm.icnt3 = 1;
        prm.dim1 = sizeof(float) * 4;
        prm.dim2 = 0;
        prm.dim3 = 0;
    
        // set the dest parameters
        prm.dicnt0 = sizeof(float);
        prm.dicnt1 = 4;
        prm.dicnt2 = 1;
        prm.dicnt3 = 1;
        prm.ddim1 = sizeof(float);
        prm.ddim2 = 0;
        prm.ddim3 = 0;

    Then it works:

    src: {
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
      { 1, 2, 3, 4 },
    }
    dst: {
      { 1, 1, 1, 1 },
      { 0, 0, 0, 0 },
      { 0, 0, 0, 0 },
      { 0, 0, 0, 0 },
    }

  • Hi Brijesh, did you have a chance to review?

  • Hi Fred,

    Brijesh will review and follow-up on this in the next couple of days.

    regards

    Suman 

  • Hi Fred,

    Confirmed with the HW team, icnt0 and dicnt0 must be same in this case. 

    Regards,

    Brijesh