PDA

Voir la version complète : [GBA][Aide] utilisation du dma avec libgba


balou
14/07/2008, 19h55
Bonsoir,

Est-ce que quelqu'un a deja utilise le dma3 avec l'api de la libgba. Si oui est ce que cette personne pourrait me coller juste un bout de code?

Merci bien et a bientot surement. :)

Nesgba
21/07/2008, 01h36
désolé j'avais pas vu ce message. :hum:

le code est tellement simple (3 lignes) que tu peut ne pas passer par une lib. ;)

//## Def: Game Pak/Internal Memory <--> Internal Memory
void GBA_CopyDMA3(void *pdst, void *psrc, unsigned long size, unsigned long type){
#define GBA_DMA_ENABLE 0x80000000 // dma actif
#define GBA_DMA_TIMING_IMMEDIAT 0x00000000 // lance la copie immediatement
#define GBA_REG_DMA3SAD *(volatile unsigned long*)0x40000D4 // source
#define GBA_REG_DMA3DAD *(volatile unsigned long*)0x40000D8 // destination
#define GBA_REG_DMA3CNT *(volatile unsigned long*)0x40000DC // opt

GBA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = type | size | GBA_DMA_TIMING_IMMEDIAT | GBA_DMA_ENABLE ;

#undef GBA_DMA_ENABLE
#undef GBA_DMA_TIMING_IMMEDIAT
#undef GBA_REG_DMA3SAD
#undef GBA_REG_DMA3DAD
#undef GBA_REG_DMA3CNT
}

balou
21/07/2008, 23h07
désolé j'avais pas vu ce message. :hum:

le code est tellement simple (3 lignes) que tu peut ne pas passer par une lib. ;)

//## Def: Game Pak/Internal Memory <--> Internal Memory
void GBA_CopyDMA3(void *pdst, void *psrc, unsigned long size, unsigned long type){
#define GBA_DMA_ENABLE 0x80000000 // dma actif
#define GBA_DMA_TIMING_IMMEDIAT 0x00000000 // lance la copie immediatement
#define GBA_REG_DMA3SAD *(volatile unsigned long*)0x40000D4 // source
#define GBA_REG_DMA3DAD *(volatile unsigned long*)0x40000D8 // destination
#define GBA_REG_DMA3CNT *(volatile unsigned long*)0x40000DC // opt

GBA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = type | size | GBA_DMA_TIMING_IMMEDIAT | GBA_DMA_ENABLE ;

#undef GBA_DMA_ENABLE
#undef GBA_DMA_TIMING_IMMEDIAT
#undef GBA_REG_DMA3SAD
#undef GBA_REG_DMA3DAD
#undef GBA_REG_DMA3CNT
}

Merci Nesgba. :)

Tu as raison, j'ai surement voulu choisir un truc un peu inadequat comparé a ton code qui est precis et concis.

Sinon ne soit pas désolé de ne pas avoir vu le message. :) De toute facon, la patience est la mère de toutes les vertues. :D (la preuve en est.).

Merci pour ton code ca m'a bien aidé ;D Je suppose que type c'est pour annoncer a la gba quel type de bloc elle va devoir traité pour envoyer les donnees sur le bus? genre par paquets de 4 ou 8 octets?

Nesgba
21/07/2008, 23h45
en fait c'est plutôt des paquets de 2 ou 4 octets ;), après tu as des petites options sur la source et la destination (source/destination fixe, décrementation, j'aurai également aimé un offset entre chaque pixel :bave: mais bon)


unsigned char tsrc[240*160] ;
unsigned char tdst[240*160] ;

#define GBA_DMA_16 0x00000000 // copie en 16 bits
#define GBA_DMA_32 0x04000000 // copie en 32 bits

GBA_CopyDMA3(tdst,tsrc, (240*160)/2, GBA_DMA_16) ;
GBA_CopyDMA3(tdst,tsrc, (240*160)/4, GBA_DMA_32) ;


tout en sachant que les copies en 16 ou 32 bits vont pratiquement à la même vitesse. :hum:

thoduv
22/07/2008, 00h11
Sinon, avec libgba, c'est très simple aussi:

dmaCopy(src, dst, size); // utilise la DMA3 par défaut, et sélectionne automatiquement le mode (32bits/16bits) selon la taille qu'on demande, et l'alignement des adresses.

balou
10/08/2008, 19h59
Merci a tous les deux.

Thoduv, j'avais utilise cela et je n'avais aucun rendu de mon image.
J'ai utilise le code de nes, a savoir :

BA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = ... etc ...

et cela a fonctionne. :)

Merci du coup de mains ;)

Balou