TI中文支持网
TI专业的中文技术问题搜集分享网站

EDMA3的ECPY模块求助

ECPY模块,有几点不清楚的地方。用于EDMA3的ECPY相关函数与之前LLD提供的接口(譬如EDMA3_DRV_setSrcParams())有很大的改进之处,现在的API确是方便调用了,但有不解之处。这有个例子:

接口:SWOSD_TI_dmaStart(swOsdObj,pInA, pInB, pAlp, pOut,pLineBufA pLineBufpLineBufAlp, pLineBufOut,width);

  实现:void SWOSD_TI_dmaStart(SWOSD_TI_Obj *swOsdObj,UInt8 *pInA, UInt8 *pInB,UInt8 *pInAlp, UInt8 *pOut,UInt64 *pLineBufA, UInt64 *pLineBufB,Int32 *pLineBufAlp, UInt64 *pLineBufOut, UInt16 width)

{

                ECPY_Params params;

params.transferType = ECPY_1D1D;

params.srcAddr = (Ptr)pInA;

params.dstAddr = (Ptr)((Uns)pLineBufA + 0x30000000);

params.numElements = 1;

params.numFrames = 1;

params.srcElementIndex = 0;

params.dstElementIndex = 0;

params.srcFrameIndex = 0;

params.dstFrameIndex = 0;

                params.elementSize = width;

               ECPY_directConfigure(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], &params, SWOSD_DMA_CH_IN_A + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_DSTADDR, (Uns)pLineBufB + 0x30000000, SWOSD_DMA_CH_IN_B + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_SRCADDR, (Uns)pInB, SWOSD_DMA_CH_IN_B + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_DSTADDR, (Uns)pLineBufAlp + 0x30000000, SWOSD_DMA_CH_ALP + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_SRCADDR, (Uns)pInAlp, SWOSD_DMA_CH_ALP + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_DSTADDR, (Uns)pOut, SWOSD_DMA_CH_OUT + 1);

ECPY_directConfigure32(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], ECPY_PARAMFIELD_SRCADDR, (Uns)pLineBufOut + 0x30000000, SWOSD_DMA_CH_OUT + 1);

     /* submit as a four linked 1D transfers */

ECPY_directSetFinal(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA], SWOSD_DMA_CH_MAX);

           ECPY_directStartEdma(swOsdObj->ecpyHandle[SWOSD_DMA_HNDL_LINKED_DMA]);

 }

         #define SWOSD_DMA_CH_IN_A  0x0

         #define SWOSD_DMA_CH_IN_B  0x1

         #define SWOSD_DMA_CH_ALP   0x2

        #define SWOSD_DMA_CH_OUT  0x3

        #define SWOSD_DMA_CH_AUX  0x4

      #define SWOSD_DMA_CH_MAX   (SWOSD_DMA_CH_AUX+1)

       按照例子提供的代码,该函数应该是实现了link功能,实现了4个通道相续EDMA。但有几点疑问:

   1、ECPY_directConfigure配置了一个EDMA通道的参数,通道号为:SWOSD_DMA_CH_IN_A + 1,紧接着ECPY_directConfigure32()用来修改EDMA的相关参数,通道号分别为:SWOSD_DMA_CH_IN_B + 1 SWOSD_DMA_CH_ALP + 1,SWOSD_DMA_CH_OUT + 1 ,根据ECPY_directConfigure32()的说明,参数transferNo :transferNo Indicates which transfer the parameters correspond to (same value that would be passed to ECPY_configure()),但是我这里前面ECPY_configure的通道号与ECPY_directConfigure32()的通道号都不一样;ECPY_directConfigure32()仅仅修改了源地址和目的地址;

2、ECPY_setFinal 函数,文档上说明:Indicate that a given transfer will be the last in a sequence of linked transfers。首先一系列的link是如何完成的?前面只调用了ECPY_directConfigure32(),如何link上的,与谁link的?其次最后一次传输,该传输的通道号为SWOSD_DMA_CH_MAX ==5,参数还未设置如何进行最后次传输;

3、link一般是建立一个EDMA通道,让其他的EDMA参数连着LINK。从功能上看该代码是实现了这样的功能,但是不理解它是如何完成link的,以及传输一次后加载下一个参数后如何发起再下一个传输的,毕竟没看到chain功能。

  坐等TI专家帮我解答疑惑,一直很相信你们的效率,谢谢。

Jason miller:

 补充下,上面的例子是一个由DDR3到片内L2SRAM的数据传输。

赞(0)
未经允许不得转载:TI中文支持网 » EDMA3的ECPY模块求助
分享到: 更多 (0)