HI:
我们最近想要在DM8127上的M3核上用EDMA实现1080p的YUV422转成YUV420SP的格式转换,我参考了How to Use the EDMA3 Driver on a TMS320DM643x
Device 这个文档,在IPNCRDK3.5里发现并没有现成的EDMA的API函数可以调用,我的想法是这样的把YUV422 分拆成 Y 和UV分两次搬运EDMA一步完成420SP的数据转换 实现的函数如下:
void DM81XX_EDMA3_setParams_test(int chId,
int dmaQueue,
unsigned int srcAddr,
unsigned int dstAddr,
int acnt,int bcnt,int ccnt,
int srcBIdx,int destBIdx,
int srcCIdx,int destCIdx,
unsigned int bCntReload)
{
volatile unsigned int PaRAMEntryAddr =
DM81XX_EDMA3_PARAM_BASE + (chId * 0x20);
volatile unsigned int dchmapChId = DM81XX_EDMA3_DCHMAP0 + (chId * 4);
volatile unsigned int dmaQnum = DM81XX_EDMA3_DMAQNUM0 + ((chId / 8) * 4);
/* PaRAM entry setup */
*((volatile unsigned int *) (PaRAMEntryAddr + OPT)) = ((0) | // SAM ->
//
// INCR
// mode
(0 << 1) | // DAM
//
// ->
// INCR
// mode
(1 << 2) | // SYNCDIM
//
// ->
// AB
// synchronized
(0 << 3) | // STATIC
//
// ->
// non-static
// mode
(4 << 8) | // FWID
//
// ->
// FIFO
// width
// is
// 128
// bits
(0 << 11) | // TCCMODE
//
// ->
// Normal
// completion
(chId << 12) | // TCC
//
// ->
// Transfer
// Completion
// Code
(1 << 20) | // TCINTEN
//
// ->
// Transfer
// Complete
// Interrupt
// is
// enabled
(0 << 21) | // ITCINTEN
//
// ->
// Intermediate
// transfer
// complete
// interrupt
// is
// disabled
(0 << 22) | // TCCHEN
//
// ->
// Transfer
// Complete
// Chaining
// is
// disabled
(0 << 23) | // ITCCHEN
//
// ->
// Intermediate
// transfer
// complete
// chaining
// is
// disabled
(0 << 24)); // PRIVID
//
// ->
// Privilege
// identification
// for
// the
// external
// host/CPU/DMA
// that
*((volatile unsigned int *) (PaRAMEntryAddr + SRC)) = srcAddr;
*((volatile unsigned int *) (PaRAMEntryAddr + A_B_CNT)) =
(bcnt << 16) | (acnt);
*((volatile unsigned int *) (PaRAMEntryAddr + DST)) = dstAddr;
*((volatile unsigned int *) (PaRAMEntryAddr + SRC_DST_BIDX)) =
(destBIdx << 16) | (srcBIdx);
*((volatile unsigned int *) (PaRAMEntryAddr + LINK_BCNTRLD)) =
(bCntReload << 16) | 0xFFFF;
*((volatile unsigned int *) (PaRAMEntryAddr + SRC_DST_CIDX)) =
(destCIdx << 16) | srcCIdx;
*((volatile unsigned int *) (PaRAMEntryAddr + CCNT)) = ccnt;
if (chId < 32)
{
/* Set Shadow region for the channel */
*((volatile unsigned int *) DM81XX_EDMA3_DRAE3) |= (1 << chId);
/* Enable interrupt */
*((volatile unsigned int *) DM81XX_EDMA3_IESR) |= (1 << chId);
}
else
{
/* Set Shadow region for the channel */
*((volatile unsigned int *) DM81XX_EDMA3_DRAE3H) |= (1 << (chId - 32));
/* Enable interrupt */
*((volatile unsigned int *) DM81XX_EDMA3_IESRH) |= (1 << (chId - 32));
}
/* channel to PaRAM entry mapping */
*((volatile unsigned int *) dchmapChId) = (chId << 5); // maintainig one
// to one mapping
// between channel
// and PaRAM entry
/* channel to queue mapping */
*((volatile unsigned int *) dmaQnum) |= (dmaQueue << ((chId % 8) * 4));
}
我的参数是这样配置的(搬运Y数据的配置):chId = 0; dmaQueue =0.acnt = 1 ,bcnt=1920,ccnt =1080,dstbidx =2,dstcidx=1,srccidx=1920*2,dstcidx=1920,bCntReload = 1920;
发现调配置完EDMA后,调用DM81XX_EDMA3_triggerTransfer ,M3核就卡死了。
同样的EDMA通道 queue id 调用了RDK自带的EDMA的API 函数DM81XX_EDMA3_setParams copy 422的数据则没有这个问题。
我觉得那个文档给的思路没问题是不是我的EDMA参数配置有问题?还是在DM8127的RDK不支持EDMA的link重载的功能?有没有类似How to Use the EDMA3 Driver on a TMS320DM643x
Device 这样类似的文档可以参考?