1

Est-ce que quelqu'un pourrait m'expliquer (ou me donner un lien) comment mettre en place un triple buffering ?
www.wikio.fr/user1921&info=comments

2

-

3

Ok, je vais aller y faire un tour.
www.wikio.fr/user1921&info=comments

4

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. sad
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 ! grin
www.wikio.fr/user1921&info=comments

5

-