#include "terminal.h" #include "sio.h" // SPU DMA // by bITmASTER (bITmASTER@bigfoot.com) void printf (char *fmt, ...); char buffer[1024] __attribute__ ((aligned(32))); typedef unsigned int UINT; typedef struct { UINT ext_addr; // external address (SPU-RAM or parallel port) UINT cpu_addr; // CPU address UINT size; // size in bytes, all addr & size must be mod 32 !!! UINT dir; // 0: cpu->ext, 1: ext->cpu UINT mode; // 5 for SPU transfer UINT ctrl1; // b0 UINT ctrl2; // b0 UINT u1; // ?? } DMA; typedef struct { UINT ext_addr; UINT cpu_addr; UINT size; UINT status; } EXTDMASTAT; typedef struct { DMA dma[4]; UINT u1[4]; // function unknown UINT wait_state; UINT u2[10]; // function unknown UINT magic; EXTDMASTAT extdmastat[4]; } EXTDMAREGISTER; void main2( void ) { volatile int *spu_ram = (int *)0xa0800000; volatile int *xxy = (int *) 0xa05f6884; volatile int *qacr = (int *) 0xff000038; volatile int *shdma = (int *) 0xFFA00000; volatile EXTDMAREGISTER *extdmareg = (EXTDMAREGISTER *) 0xa05f7800; int i; int chn = 0; // 0: SPU; 1,2,3 for ext (parallel port) int dest; dest = 0xa0800000; // SPU memory extdmareg->wait_state = 0x0; // wait states (for non-dma access) extdmareg->magic = 0x4659404f; // magic number for release the ext DMA for ( i = 0; i < 64; i++ ) // fill SPU RAM spu_ram[i] = 0x12345678; for ( i = 0; i < 1024; i++ ) // test pattern buffer[i] = i; printf( "buffer: %p\n", buffer ); // yeah, the extern dma is a very complex thing // it uses the sh dma with On-demand data transfer mode (DDT mode) shdma[0x20/4] = 0; // SAR2 = 0 shdma[0x24/4] = 0; // DAR2 = 0 shdma[0x28/4] = 0; // DMATCR2 = 0 shdma[0x2c/4] = 0x12c0; // CHCR2 = 0x12c0, 32-byte block transfer, burst mode, External request, single address mode, Source address incremented shdma[0x40/4] = 0x8201; // DMAOR = 0x8201, 0—DMAC Master Enable, CH2 > CH0 > CH1 > CH3, On-Demand Data Transfer *xxy = 0; qacr[0] = 0x10; qacr[1] = 0x10; // reset all dma channels for ( i = 0; i < 4; i++ ) { extdmareg->dma[i].ctrl1 = 0; extdmareg->dma[i].ext_addr = 0; extdmareg->dma[i].cpu_addr = 0; extdmareg->dma[i].size = 0; extdmareg->dma[i].dir = 0; extdmareg->dma[i].mode = 0; extdmareg->dma[i].ctrl1 = 0; extdmareg->dma[i].ctrl2 = 0; } // start dma // dont forget flush cache before start dma extdmareg->dma[chn].ctrl1 = 0; extdmareg->dma[chn].ctrl2 = 0; extdmareg->dma[chn].ext_addr = dest & 0x1fffffe0; extdmareg->dma[chn].cpu_addr = (int) buffer & 0x1fffffe0; extdmareg->dma[chn].size = 64 | 0x80000000; extdmareg->dma[chn].dir = 0; extdmareg->dma[chn].mode = 5; // SPU: 5, ext: 0 extdmareg->dma[chn].ctrl1 = 1; extdmareg->dma[chn].ctrl2 = 1; terminal(); // yep, this is my terminal hexdump }
This page is the sole property of bITmASTER and merely mirrored by FuzzyMuzzle.com. Please direct all questions regarding this mirror's content to bITmASTER himself.