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 DRU 以进行 C7x 图像处理时出现问题

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1124234/tda4vm-problems-setting-up-udma-dru-for-c7x-image-processing

器件型号:TDA4VM

您好!

我正在尝试为我的图像处理项目设置 uDMA DRU、并参考 vision_apps/apps/basic_demos/app_c7x_kernel 应用、该应用使用 vision_apps/utils/uDMA 中提供的 app_uDMA API。 我找不到错误的位置、但-4在尝试取消初始化 UDMA 通道时收到错误代码。 以下是我的代码的相关部分:

typedef struct
{
    app_udma_ch_handle_t udmaChHdl;
    app_udma_copy_nd_prms_t tfrPrms;

} UDMAObj;

typedef struct
{
    /** Image params. */
    vx_uint8* img;
    vx_uint32 imgWidth;
    vx_uint32 imgHeight;
    vx_uint32 imgStride;

    /** UDMA objects. */
    UDMAObj udmaObjSrc;

    /** Block params. */
    vx_uint32 blkHeight;
    vx_uint32 numReps;
    vx_uint32 remHeight;

    /** L2 memory params. */
    vx_uint8 *pL2;

} tivxCompressParams;

static vx_status udma_create(UDMAObj *udmaObj, vx_uint32 dma_ch)
{
    vx_status status = VX_SUCCESS;

    memset(&udmaObj->tfrPrms, 0, sizeof(app_udma_copy_nd_prms_t));
    udmaObj->udmaChHdl = appUdmaCopyNDGetHandle(dma_ch);

    return status;
}

static vx_status udma_delete(UDMAObj *udmaObj)
{
    vx_status status = VX_SUCCESS;

    status = appUdmaCopyDelete(udmaObj->udmaChHdl);

    return status;
}

static vx_status udma_init(UDMAObj *udmaObj)
{
    vx_status status = VX_SUCCESS;

    status = appUdmaCopyNDInit(udmaObj->udmaChHdl, &udmaObj->tfrPrms);

    return status;
}

static vx_status udma_deinit(UDMAObj *udmaObj)
{
    vx_status status = VX_SUCCESS;

    status = appUdmaCopyNDDeinit(udmaObj->udmaChHdl);

    return status;
}

static vx_status compress_udma_setup_img(tivxCompressParams* prms, UDMAObj* udmaObj, vx_uint8* pL2)
{
    vx_status status = VX_SUCCESS;

    app_udma_copy_nd_prms_t *tfrPrms = (app_udma_copy_nd_prms_t *)&udmaObj->tfrPrms;

    tfrPrms->copy_mode  = 2U; // Halt UDMA after every block transfer, re-trigger to continue
    tfrPrms->eltype     = sizeof(uint8_t);

    tfrPrms->src_addr   = (uint64_t)prms->inImg;
    tfrPrms->dest_addr  = (uint64_t)pL2;

    tfrPrms->icnt0      = prms->imgWidth;
    tfrPrms->icnt1      = prms->blkHeight;
    tfrPrms->icnt2      = 2U;
    tfrPrms->icnt3      = prms->numReps / 2U;
    tfrPrms->dim1       = prms->imgStride;
    tfrPrms->dim2       = prms->imgStride * prms->blkHeight;
    tfrPrms->dim3       = prms->imgStride * prms->blkHeight * 2U;

    tfrPrms->dicnt0     = prms->imgWidth;
    tfrPrms->dicnt1     = prms->blkHeight;
    tfrPrms->dicnt2     = 2U;
    tfrPrms->dicnt3     = prms->numReps / 2U;
    tfrPrms->ddim1      = prms->imgStride;
    tfrPrms->ddim2      = L2_BLOCK_SIZE_ALIGNED;
    tfrPrms->ddim3      = 0U;

    status = udma_init(udmaObj);

    return status;
}

static vx_status compress_udma_setup(tivxCompressParams* prms)
{
    vx_status status = VX_SUCCESS;

    status = compress_udma_setup_img(prms, &prms->udmaObjSrc, prms->pL2);

    return status;
}

static vx_status compress_udma_teardown(tivxCompressParams* prms)
{
    vx_status status = VX_SUCCESS;

    status = udma_deinit(&prms->udmaObjSrc);

    return status;
}

vx_status compressProcess(tivxCompressParams* prms)
{
    vx_status status = VX_SUCCESS;

    status = compress_udma_setup(prms);

    if (VX_SUCCESS == status)
    {
        status = compress_udma_teardown(prms);
    }

    return status;
}

我从 compressProcess内核进程回调函数调用该函数。 其他参数是在代码的其他部分设置的、我认为这些部分在这里并不相关。 如果我设置 tfrPrms->copy_mode为0、那么我不会得到错误、但我的算法不起作用、因为我需要在流水线中进行单独的块传输。 正如我说过的、我的应用基于 app_c7x_kernel、其中copy_mode设置为2。 我缺少什么?