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.

DM8168 EDMA



1、在Capture中下面的函数是用来干什么的?

Void CaptureLink_drvMergeData_Yuv422i(CaptureLink_Obj * pObj,UInt32 queId,UInt32 queChId,FVID2_Frame *pFrame)

看了一下内部的实现,还是没有看懂求指教!

2、上面函数中调用的下面的DMA函数是将数据拷贝到DMA中吗?

Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);

  • 你好,

    你看的是哪个版本的DVR RDK?我看了一下,v3.0以后都没有你说的这两个函数调用了。建议你还是更新一下软件。

    Utils_dmaCopy2D利用了EDMA实现了两维的数据复制。

  • 是这个版本的hdvpss_01_00_01_37_patched,

    Void CaptureLink_drvMergeData_Yuv422i(CaptureLink_Obj * pObj,
    UInt32 queId,
    UInt32 queChId,
    FVID2_Frame *pFrame)
    {
    Int32 status;
    System_LinkChInfo* pChInfo = &pObj->info.queInfo[queId].chInfo[queChId];
    CaptureLink_ChObj *pChObj;
    pChObj = &pObj->chObj[queId][queChId];
    Int32 width, height, pitch0;
    Int32 startx, starty;
    width = pChInfo->width;
    height = pChInfo->height;
    pitch0 = pChInfo->pitch[0];
    startx = pChInfo->startX;
    starty = pChInfo->startY;

    if((width<=0)||(height<=0)||(pitch0<=0))
    {
    Vps_printf("### Cap: width %d, height %d, pitch0 %d\n",\
    width, height, pitch0);
    return;
    }
    int *addr;
    addr=pObj->tmpBufAddr;
    Vps_printf("----->pitch0:%d,addr:0x%08x\n",pitch0,addr);
    addr=pFrame->addr[0][0];
    Vps_printf("----->pFrame->addr[0][0]:0x%08x\n",addr);

    pChObj->Dma2DParam_Merge.destAddr[0] = pObj->tmpBufAddr;
    pChObj->Dma2DParam_Merge.srcAddr[0] = pFrame->addr[0][0]+pitch0;
    pChObj->Dma2DParam_Merge.width = width;
    pChObj->Dma2DParam_Merge.height = height/2;
    pChObj->Dma2DParam_Merge.destPitch[0] = pitch0;
    pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0*2;

    pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV;
    pChObj->Dma2DParam_Merge.srcStartX = startx;
    pChObj->Dma2DParam_Merge.srcStartY = starty;
    pChObj->Dma2DParam_Merge.destStartX = startx;
    pChObj->Dma2DParam_Merge.destStartY = starty/2;

    status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
    UTILS_assert(status==FVID2_SOK);

    pChObj->Dma2DParam_Merge.destAddr[0] = pFrame->addr[0][0]+pitch0;
    pChObj->Dma2DParam_Merge.srcAddr[0] = pFrame->addr[0][0]+pitch0*2;
    pChObj->Dma2DParam_Merge.width = width;
    pChObj->Dma2DParam_Merge.height = height/2-1;
    pChObj->Dma2DParam_Merge.destPitch[0] = pitch0;
    pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0*2;

    pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV;
    pChObj->Dma2DParam_Merge.srcStartX = startx;
    pChObj->Dma2DParam_Merge.srcStartY = starty;
    pChObj->Dma2DParam_Merge.destStartX = startx;
    pChObj->Dma2DParam_Merge.destStartY = starty/2;

    status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
    UTILS_assert(status==FVID2_SOK);

    pChObj->Dma2DParam_Merge.destAddr[0] = pFrame->addr[0][0]+pitch0*height/2;
    pChObj->Dma2DParam_Merge.srcAddr[0] = pObj->tmpBufAddr;
    pChObj->Dma2DParam_Merge.width = width;
    pChObj->Dma2DParam_Merge.height = height/2;
    pChObj->Dma2DParam_Merge.destPitch[0] = pitch0;
    pChObj->Dma2DParam_Merge.srcPitch[0] = pitch0;

    pChObj->Dma2DParam_Merge.dataFormat = FVID2_DF_YUV422I_YUYV;
    pChObj->Dma2DParam_Merge.srcStartX = startx;
    pChObj->Dma2DParam_Merge.srcStartY = starty/2;
    pChObj->Dma2DParam_Merge.destStartX = startx;
    pChObj->Dma2DParam_Merge.destStartY = starty;

    status = Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);
    if(status==FVID2_SOK)
    UTILS_assert(status==FVID2_SOK);
    }

    我计算了一下参数设置如下:

    没有搞懂这样做的目的?

  • 你好,

    请参考mcfw下的capture link相关代码,而不是hdvpss下面的。

  • 哦!抱歉是MCFW下的写错了,是DVR_RDK ,

    请教一下 Utils_dmaCopy2D(&pObj->dmaObj, &pChObj->Dma2DParam_Merge, 1);

    函数,就是应用EDMA将Frame从我设置的源地址复制到目的地址是吗?是否是连续传送呢?

    另外SRCBIDX和DSTBIDX的作用是什么呢?