请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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。 我缺少什么?