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], ¶ms, 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的数据传输。