hallo,
so scheint es zu gehen:
#define TSIZE 1000
#pragma data_alignment=4
static DWORD *p = (DWORD*)0x7FD00000; //p[TSIZE];
#pragma data_alignment=4
static DWORD *q = (DWORD*)0x7FD01000; //q[TSIZE];
void test_dma (void)
{
DWORD s;
MAMCR = 0; // muss wohl nicht sein...
for (s=0; s<TSIZE; s++)
{
p[s] = s;
q[s] = 0;
}
debug_printf ("%d %d %d\n", p[0], p[1], p[2]);
PCONP |= (1 << 29); // Enable GPDMA clock
// clear all interrupts
GPDMA_INT_TCCLR = 0x03;
GPDMA_INT_ERR_CLR = 0x03;
GPDMA_CH0_SRC = (DWORD)p; // Src pointer
GPDMA_CH0_DEST = (DWORD)q; // Dest. pointer
GPDMA_CH0_CTRL = ((TSIZE) & 0x0FFF) | // size
(4 << 12) | // 32 bytes burst
(4 << 15) | // 32 bytes burst
(2 << 18) | // 32 bits
(2 << 21) | // 32 bits
(1 << 26) | // source ptr increment
(1 << 27); // dest. ptr increment
GPDMA_CONFIG = 0x01; // Enable DMA channels, little endian
GPDMA_CH0_CFG = 1; // Start
// Wait...
//for (s=0; s<0x800000; s++);
//while (!(GPDMA_CH0_CFG & (1<<17)));
while (GPDMA_CH0_CFG & (1<<17));
debug_printf ("%d %d %d\n", q[TSIZE-3], q[TSIZE-2], q[TSIZE-1]);
}
...wenn sich ziel und startadresse im USB RAM befinden.
warum nur geht es nicht mit dem 'normalen' RAM?