C'est ces fonction là qu'il faut utiliser ?
int initTripleBufferDMA( struct LCDinfo *nfo, int dmanum, void (*intr)(void) ) {
int dmaint;
long dmabase = 0;
nfo->dmaintr = intr;
switch (dmanum) {
case DMA0_INT:
dmabase = 0x14600000;
dmaint = 17;
break;
case DMA1_INT:
dmabase = 0x14600020;
dmaint = 18;
break;
case DMA2_INT:
dmabase = 0x14600040;
dmaint = 19;
break;
case DMA3_INT:
dmabase = 0x14600060;
dmaint = 20;
break;
default:
nfo->dmaintr = NULL;
dmaint = 0;
}
// calculate DMA registers
nfo->disrc = (long *)dmabase;
nfo->didst = (long *)(dmabase + 0x04);
nfo->dcon = (long *)(dmabase + 0x08);
nfo->dstat = (long *)(dmabase + 0x0c);
nfo->dmasktrig = (long *)(dmabase + 0x18);
// setup interrupt..
if (intr) {
/*localInstallIRQ(dmaint,intr);*/
installIRQ(dmaint,intr);
}
return 0;
}
//
// w - [in] if non 0 sync display
//
// Returns:
// A ptr to current work buffer..
//
unsigned char *tripleBufferDMA( struct LCDinfo *nfo, int w ) {
long ptr;
long n;
int i = nfo->currentBuf;
ptr = (long)nfo->bufs[(i+1) % 3];
n = (nfo->x + nfo->offx) * nfo->posy + nfo->posx;
// check if we need to sync the screen...
if (w & 0x02) {
waitLine(1);
}
if (w & 0x01) {
waitLine(0);
}
// setup new buffers.. for display..
rLCDSADDR1 = (ptr >> 1) + n;
rLCDSADDR2 = ((ptr & 0x003ffffe) >> 1) + n + nfo->basel;
// clear previous displayed buffer..
n = nfo->dmaintr ? 1 : 0;
ptr = (long)nfo->bufs[i];
*((long *)ptr) = 0;
*nfo->dmasktrig |= 0x04;
*nfo->disrc = ptr; // select system bus (AHB)+autoinc
*nfo->didst = ptr + 4; // select system bus (AHB)+autoinc
*nfo->dcon = (0 << 30) | // demand mode
(1 << 29) | // DREQ & DACK are synched to HCLK (AHB)
(n << 28) | // disable DMA0 int
(0 << 27) | // unit transfer
(1 << 26) | // whole servmode
(0x00 << 24) | // HWSRCSEL ?? not used
(0 << 23) | // sw request mode
(1 << 22) | // auto reload off
(0x02 << 20) | // data size == word
(nfo->bufsize >> 2); // count..
// start DMA.. and don't wait for it to finish..
*nfo->dmasktrig = 0x03;
// return new work buffer..
nfo->currentBuf = (i+1) % 3;
return nfo->bufs[(i+2) % 3];
}
je n'y comprend rien du tout.
Et au fait Orion, tu dis qu'il ne faut pas optimiser avec des décalage de bits mais dans ces deux fonctions je ne vois que ça !
