Hi,
I am trying to set a manual DMA transfer (can't use the driver at the moment due to tooling issues), and I have a simple function that configures the registers according to the manual and starts a transfer.
The transfer is complete (I get the interrupt) but has not actually executed (no data is transfered).
The function is really very basic: enable the event, the interrupt, set the param and manually initilize the access. any thoughts on what I might be missing?
_______________________________________________
int Edma3Tx(int chan, U32 param, int len, U8* Src, U8* Dst)
{
U32 *DChMap = ((U32 *)(EDMA3_DCHMAP0 + 4*chan));
U32 *EESR = (U32 *)EDMA3_EESR;
U32 *EESRH = (U32 *)EDMA3_EESRH;
U32 *PaRAM = ((U32 *)(EDMA3_PARAM_RAM_BASE + 0x20*param));
U32 *IER = (U32 *)EDMA3_IER;
U32 *IERH = (U32 *)EDMA3_IERH;
U32 *ESR = (U32 *)EDMA3_ESR;
U32 *ESRH = (U32 *)EDMA3_ESRH;
//Param num config:
*DChMap = (param << 5); //set the param number in the relvant channel register
//Event triggering:
if (chan < 32)
*EESR |= 1<<chan; //set the correct bit that will trigger the EDMA event in either low or high register
else
*EESRH |= 1<<(chan-32);
//PaRAM programming:
PaRAM[0] = 0x80100000; // options: supervisor access, int enabled
PaRAM[1] = (U32)(Src); // src
PaRAM[2] = 0x10000 | (len & 0xFFFF); // bcnt,acnt (b = 1, a = len)
PaRAM[3] = (U32)(Dst); // dst
PaRAM[4] = 0x0;
PaRAM[5] = 0x0;
PaRAM[6] = 0x0;
PaRAM[7] = 0x1; //ccnt = 1
//Int enable:
if (chan < 32)
*IER = *IER | 1<<chan;
else
*IERH = *IERH | 1<<(chan-32);
//Initiate transfer:
if (chan < 32)
*ESR = *ESR | 1<<chan; //set the correct bit that will trigger the EDMA event in either low or high register
else
*ESRH = *ESRH | 1<<(chan-32);
};