gbadev.org forum archive

This is a read-only mirror of the content originally found on forum.gbadev.org (now offline), salvaged from Wayback machine copies. A new forum can be found here.

DS development > FIFO example?

#166435 - Echo49 - Sun Feb 08, 2009 6:19 am

I couldn't find a FIFO example in devkitpro/examples. Does anyone know where to find examples utilising custom FIFO channels?

#166593 - Lazy1 - Wed Feb 11, 2009 3:08 am

Here is how I did my cheap fifo stuff for my arm7 IMF player:

Arm7:
Code:

#define MakeID( a, b, c, d ) ( ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a ) 

void Fifo_Arm7MusicService( int Count, void* Userdata ) {
   u32 Data[ 6 ];
   
   if ( Count ) {
      fifoGetDatamsg( FIFO_USER_01, Count, ( u8* ) Data );
      
      switch ( Data[ 0 ] ) {
         case MakeID( 'M', 'O', 'P', 'L' ): {
            MakeOPL( );
            break;
         }
         case MakeID( 'P', 'L', 'A', 'Y' ): {
            StartMusic( Data[ 1 ] );
            break;
         }
         case MakeID( 'S', 'T', 'O', 'P' ): {
            StopMusic( );
            break;
         }
         case MakeID( 'B', 'U', 'F', 'R' ): {
            RingBufferSize = Data[ 1 ];
            RingBuffer = ( short* ) Data[ 2 ];
            
            SampleBufferSize = Data[ 3 ];
            SampleBuffer = ( short* ) Data[ 4 ];
            
            if ( ! RingBuffer || ! SampleBuffer )
               Noise( );
            
            break;
         }
         default: break;
      };
   }
}

//---------------------------------------------------------------------------------
int main() {
//---------------------------------------------------------------------------------
   //while ((*(vuint8*)0x04000240 & 0x02) == 0);    
   
   fake_heap_start = ( char* ) 0x06000000;
   fake_heap_end = ( char* ) 0x06020000;
   
   irqInit();
   fifoInit();

   // read User Settings from firmware
   readUserSettings();

   // Start the RTC tracking IRQ
   initClockIRQ();

   SetYtrigger(80);

   //installWifiFIFO();
   installSoundFIFO();

   //mmInstall(FIFO_MAXMOD);

   installSystemFIFO();
   
   // Music system fifo callbacks
   fifoSetDatamsgHandler( FIFO_USER_01, Fifo_Arm7MusicService, NULL );
   
   irqSet(IRQ_VCOUNT, VcountHandler);
   irqSet(IRQ_VBLANK, VblankHandler);

   irqEnable( IRQ_VBLANK | IRQ_VCOUNT );
   
   while ( 1 ) {
      swiWaitForVBlank( );
      
      if ( StartPlayingMusic == 1 ) {
         StartPlayingMusic = 0;
         
         // Enter play loop
         PlayTheTune( );
      }
   }

   // Keep the ARM7 mostly idle
   //while (1) swiWaitForVBlank();
}


Arm9:
Code:

#define MakeID( a, b, c, d ) ( ( d << 24 ) | ( c << 16 ) | ( b << 8 ) | a ) 
#define Arm7RingBufferSize ( 8192 * sizeof( u16 ) )
#define Arm7SampleBufferSize ( 11025 * sizeof( u16 ) )

int Arm7_MakeOPL( void ) {
   u32 Outgoing[ 1 ] = {
      MakeID( 'M', 'O', 'P', 'L' )
   };
   
   fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing );
   return 1;
}

void Arm7_StartMusic( u8* MusicBase ) {
   u32 Outgoing[ 2 ] = {
      MakeID( 'P', 'L', 'A', 'Y' ),
      ( u32 ) MusicBase
   };
   
   fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing );
}

void Arm7_StopMusic( void ) {
   u32 Outgoing[ 1 ] = {
      MakeID( 'S', 'T', 'O', 'P' )
   };
   
   fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing );
}

void Arm7_GiveBuffers( void ) {
   u32 Outgoing[ 5 ] = {
      MakeID( 'B', 'U', 'F', 'R' ),
      Arm7RingBufferSize,
      0,
      Arm7SampleBufferSize,
      0
   };
   
   Outgoing[ 2 ] = ( u32 ) malloc( Arm7RingBufferSize );
   Outgoing[ 4 ] = ( u32 ) malloc( Arm7SampleBufferSize );
   
   fifoSendDatamsg( FIFO_USER_01, sizeof( Outgoing ), ( u8* ) Outgoing );
}


Maybe not the best way of doing things but I had troubles using more than 3 or 4 user fifo channels.

#171133 - a128 - Mon Nov 02, 2009 10:56 am

I did a Fifo example for sending 32bit values from arm9->arm7 back to arm9

download here

http://www.storage.to/get/IQt1pekc/fifotest_nds.tgz
_________________
"Hey! It compiles! Ship it!"