Hello,
I am trying to to copy buffer from address in SDRAM into address in IRAM using IDMA0 channel. The function I wrote is (from modified CSL):
CSL_IdmaRegsOvly idmaRegs = (CSL_IdmaRegsOvly)CSL_IDMA_0_REGS; // a structure that maps IDMA0 and IDMA1 registers
void IDMA0_Copy(Uint32 * dst, Uint32 * src, Uint32 length, Uint32 mask)
{
unsigned int restore_value;
// Save interrupt state
restore_value = _disable_interrupts();
idmaRegs->IDMA0_MASK = mask;
idmaRegs->IDMA0_SOURCE = (Uint32)src; // Set the source
idmaRegs->IDMA0_DEST = (Uint32)dst; // Set destination
idmaRegs->IDMA0_COUNT = CSL_FMKT(IDMA_IDMA0_COUNT_INT, INT)
| CSL_FMK(IDMA_IDMA0_COUNT_COUNT,length); // length is a multiple of 4
// Wait while the transfer is active
while(CSL_FEXT(idmaRegs->IDMA0_STAT,IDMA_IDMA0_STAT_ACTV) == 1);
// Restore interrupt state
_restore_interrupts(restore_value);
}
Physically I see in watch that I am writing to the IDMA registers, starting from address 0x01820000, but nothing happens.
The source address is 0xC300AD30 (in SDRAM), the destination address is 0x1180D8D0 (IRAM). Can I use the IDMA for these addresses? If so what I am doing wrong?
Thanks
Arye