diff --git a/desmume/src/mc.cpp b/desmume/src/mc.cpp index 074e7e2f2..4ce5bdd32 100644 --- a/desmume/src/mc.cpp +++ b/desmume/src/mc.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2006 thoduv Copyright (C) 2006-2007 Theo Berkau - Copyright (C) 2008-2009 DeSmuME team + Copyright (C) 2008-2010 DeSmuME team This file is part of DeSmuME @@ -35,21 +35,22 @@ #include // it`s really need? #endif -#define FW_CMD_READ 0x3 -#define FW_CMD_WRITEDISABLE 0x4 -#define FW_CMD_READSTATUS 0x5 -#define FW_CMD_WRITEENABLE 0x6 -#define FW_CMD_PAGEWRITE 0xA +#define FW_CMD_READ 0x03 +#define FW_CMD_WRITEDISABLE 0x04 +#define FW_CMD_READSTATUS 0x05 +#define FW_CMD_WRITEENABLE 0x06 +#define FW_CMD_PAGEWRITE 0x0A +#define FW_CMD_READ_ID 0x9F #define BM_CMD_AUTODETECT 0xFF -#define BM_CMD_WRITESTATUS 0x1 -#define BM_CMD_WRITELOW 0x2 -#define BM_CMD_READLOW 0x3 -#define BM_CMD_WRITEDISABLE 0x4 -#define BM_CMD_READSTATUS 0x5 -#define BM_CMD_WRITEENABLE 0x6 -#define BM_CMD_WRITEHIGH 0xA -#define BM_CMD_READHIGH 0xB +#define BM_CMD_WRITESTATUS 0x01 +#define BM_CMD_WRITELOW 0x02 +#define BM_CMD_READLOW 0x03 +#define BM_CMD_WRITEDISABLE 0x04 +#define BM_CMD_READSTATUS 0x05 +#define BM_CMD_WRITEENABLE 0x06 +#define BM_CMD_WRITEHIGH 0x0A +#define BM_CMD_READHIGH 0x0B /* FLASH*/ #define COMM_PAGE_WRITE 0x0A @@ -228,31 +229,57 @@ u8 fw_transfer(memory_chip_t *mc, u8 data) } } + else if(mc->com == FW_CMD_READ_ID) + { + switch(mc->addr) + { + //here is an ID string measured from an old ds fat: 62 16 00 (0x62=sanyo) + //but we chose to use an ST from martin's ds fat string so programs might have a clue as to the firmware size: + //20 40 12 + case 0: + data = 0x20; + mc->addr=1; + break; + case 1: + data = 0x40; //according to gbatek this is the device ID for the flash on someone's ds fat + mc->addr=2; + break; + case 2: + data = 0x12; + mc->addr = 0; + break; + } + } else if(mc->com == FW_CMD_READSTATUS) { return (mc->write_enable ? 0x02 : 0x00); } - else /* finally, check if it's a new command */ + else //finally, check if it's a new command { switch(data) { - case 0: break; /* nothing */ + case 0: break; //nothing + + case FW_CMD_READ_ID: + mc->addr = 0; + mc->com = FW_CMD_READ_ID; + break; - case FW_CMD_READ: /* read command */ + case FW_CMD_READ: //read command mc->addr = 0; mc->addr_shift = 3; mc->com = FW_CMD_READ; break; - case FW_CMD_WRITEENABLE: /* enable writing */ + case FW_CMD_WRITEENABLE: //enable writing if(mc->writeable_buffer) { mc->write_enable = TRUE; } break; - case FW_CMD_WRITEDISABLE: /* disable writing */ + case FW_CMD_WRITEDISABLE: //disable writing mc->write_enable = FALSE; break; - case FW_CMD_PAGEWRITE: /* write command */ + case FW_CMD_PAGEWRITE: //write command if(mc->write_enable) { mc->addr = 0; @@ -262,7 +289,7 @@ u8 fw_transfer(memory_chip_t *mc, u8 data) else { data = 0; } break; - case FW_CMD_READSTATUS: /* status register command */ + case FW_CMD_READSTATUS: //status register command mc->com = FW_CMD_READSTATUS; break; diff --git a/desmume/src/mc.h b/desmume/src/mc.h index c5ac004e4..e0ee4a481 100644 --- a/desmume/src/mc.h +++ b/desmume/src/mc.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 thoduv Copyright (C) 2006 Theo Berkau - Copyright (C) 2008-2009 DeSmuME team + Copyright (C) 2008-2010 DeSmuME team This file is part of DeSmuME @@ -50,24 +50,24 @@ #define MC_SIZE_256MBITS 0x2000000 #define MC_SIZE_512MBITS 0x4000000 -typedef struct +struct memory_chip_t { - u8 com; /* persistent command actually handled */ - u32 addr; /* current address for reading/writing */ - u8 addr_shift; /* shift for address (since addresses are transfered by 3 bytes units) */ - u8 addr_size; /* size of addr when writing/reading */ - - BOOL write_enable; /* is write enabled ? */ - - u8 *data; /* memory data */ - u32 size; /* memory size */ - BOOL writeable_buffer; /* is "data" writeable ? */ - int type; /* type of Memory */ - char *filename; - FILE *fp; - u8 autodetectbuf[32768]; - int autodetectsize; -} memory_chip_t; + u8 com; //persistent command actually handled + u32 addr; //current address for reading/writing + u8 addr_shift; //shift for address (since addresses are transfered by 3 bytes units) + u8 addr_size; //size of addr when writing/reading + + BOOL write_enable; //is write enabled ? + + u8 *data; //memory data + u32 size; //memory size + BOOL writeable_buffer; //is "data" writeable ? + int type; //type of Memory + char *filename; + FILE *fp; + u8 autodetectbuf[32768]; + int autodetectsize; +}; //the new backup system by zeromus class BackupDevice diff --git a/tools/ds_tests/regs/arm7/source/arm7.cpp b/tools/ds_tests/regs/arm7/source/arm7.cpp index 75dcfd3be..e6ec14dc1 100644 --- a/tools/ds_tests/regs/arm7/source/arm7.cpp +++ b/tools/ds_tests/regs/arm7/source/arm7.cpp @@ -1,122 +1,162 @@ -/*--------------------------------------------------------------------------------- - -once upon a time, this was: default ARM7 core - -Copyright (C) 2005 -Michael Noland (joat) -Jason Rogers (dovoto) -Dave Murphy (WinterMute) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you -must not claim that you wrote the original software. If you use -this software in a product, an acknowledgment in the product -documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source -distribution. - ----------------------------------------------------------------------------------*/ -#include -#include -#include -#include "../../regstest.h" - +/*--------------------------------------------------------------------------------- + +once upon a time, this was: default ARM7 core + +Copyright (C) 2005 +Michael Noland (joat) +Jason Rogers (dovoto) +Dave Murphy (WinterMute) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you +must not claim that you wrote the original software. If you use +this software in a product, an acknowledgment in the product +documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source +distribution. + +---------------------------------------------------------------------------------*/ +#include +#include +#include +#include "../../regstest.h" +#include + arm7comm_t *arm7comm; -//--------------------------------------------------------------------------------- -void VcountHandler() { - //--------------------------------------------------------------------------------- - inputGetAndSend(); -} - -//--------------------------------------------------------------------------------- -void VblankHandler(void) { -//--------------------------------------------------------------------------------- - Wifi_Update(); -} - -void pokeMessage(const char* msg) -{ - const char* cp = msg; - int i=0; - while(*cp) - arm7comm->message[i++] = *cp++; - arm7comm->message[i] = 0; -} - -void fail(const char* msg, u32 offender=0) -{ - arm7comm->code = 1; - arm7comm->offender = offender; - pokeMessage(msg); - - fifoSendValue32(FIFO_USER_01,0); - while (1) swiWaitForVBlank(); -} - -//--------------------------------------------------------------------------------- -int main() { -//--------------------------------------------------------------------------------- - irqInit(); - fifoInit(); - - // read User Settings from firmware - readUserSettings(); - - // Start the RTC tracking IRQ - initClockIRQ(); - - SetYtrigger(80); - - installWifiFIFO(); - installSoundFIFO(); - - mmInstall(FIFO_MAXMOD); - - installSystemFIFO(); - - irqSet(IRQ_VCOUNT, VcountHandler); - irqSet(IRQ_VBLANK, VblankHandler); - - irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK); - - //find out where the arm9 wants us to stash our info - while(!fifoCheckAddress(FIFO_USER_01)) swiWaitForVBlank(); - arm7comm = (arm7comm_t*)fifoGetAddress(FIFO_USER_01); - - - //spu source reg should only be 27bit - //but it is not readable so what does it matter - for(int i=0;i<16;i++) - { - vu32* reg = (vu32*)(0x04000404 + (i<<4)); - *reg = 0xFFFFFFFF; - //if(*reg != 0x07FFFFFF) fail("spu source reg is only 27bit.\nshould be 0x07FFFFFF",*reg); - if(*reg != 0x00000000) fail("spu source reg is not readable!",*reg); - } - - //spu length reg should only be 22bit - for(int i=0;i<16;i++) - { - vu32* reg = (vu32*)(0x0400040C + (i<<4)); - *reg = 0xFFFFFFFF; - //if(*reg != 0x003FFFFF) fail("spu length reg is only 22bit.\nshould be 0x003FFFFF",*reg); - if(*reg != 0x00000000) fail("spu length reg is not readable!",*reg); - } - - - arm7comm->code = 2; - fifoSendValue32(FIFO_USER_01,0); - while (1) swiWaitForVBlank(); -} - - +//--------------------------------------------------------------------------------- +void VcountHandler() { + //--------------------------------------------------------------------------------- + inputGetAndSend(); +} + +//--------------------------------------------------------------------------------- +void VblankHandler(void) { +//--------------------------------------------------------------------------------- + Wifi_Update(); +} + +//modified from: http://www.bottledlight.com/ds/index.php/Main/Firmware +#define FW_READ_ID 0x9F +#define FW_READ 0x03 +#define FW_READ_STATUS 0x05 +u32 getFirmwareType() +{ + u32 result; + + // Get ID + while (REG_SPICNT & SPI_BUSY); + REG_SPICNT = SPI_ENABLE | SPI_CONTINUOUS | SPI_DEVICE_FIRMWARE; + REG_SPIDATA = FW_READ_ID; + while (REG_SPICNT & SPI_BUSY); + + result = 0; + for (int i = 0; i < 3; i++) { + REG_SPIDATA = 0; + while (REG_SPICNT & SPI_BUSY); + result = (REG_SPIDATA & 0xFF) | (result<<8); + } + + // Get status + //zeromus note: this is broken. not only does it put the byte in a different spot than the docs said it does, + //it is coded otherwise glitchily and just returns bytes of the 3-Byte flash ID + //(desmume shows five reads during the ID command; apparently this code fails to reset correctly) + while (REG_SPICNT & SPI_BUSY); + REG_SPICNT = SPI_ENABLE | SPI_CONTINUOUS | SPI_DEVICE_FIRMWARE; + REG_SPIDATA = FW_READ_STATUS; + while (REG_SPICNT & SPI_BUSY); + + REG_SPIDATA = 0; + while (REG_SPICNT & SPI_BUSY); + result = ((REG_SPIDATA & 0xFF) << 24) | result; + + return result; +} + + + +void pokeMessage(const char* msg) +{ + const char* cp = msg; + int i=0; + while(*cp) + arm7comm->message[i++] = *cp++; + arm7comm->message[i] = 0; +} + +void fail(const char* msg, u32 offender=0) +{ + arm7comm->code = 1; + arm7comm->offender = offender; + pokeMessage(msg); + + fifoSendValue32(FIFO_USER_01,0); + while (1) swiWaitForVBlank(); +} + +//--------------------------------------------------------------------------------- +int main() { +//--------------------------------------------------------------------------------- + irqInit(); + fifoInit(); + + // read User Settings from firmware + readUserSettings(); + + // Start the RTC tracking IRQ + initClockIRQ(); + + SetYtrigger(80); + + installWifiFIFO(); + installSoundFIFO(); + + mmInstall(FIFO_MAXMOD); + + installSystemFIFO(); + + irqSet(IRQ_VCOUNT, VcountHandler); + irqSet(IRQ_VBLANK, VblankHandler); + + irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK); + + //find out where the arm9 wants us to stash our info + while(!fifoCheckAddress(FIFO_USER_01)) swiWaitForVBlank(); + arm7comm = (arm7comm_t*)fifoGetAddress(FIFO_USER_01); + + + //spu source reg should only be 27bit + //but it is not readable so what does it matter + for(int i=0;i<16;i++) + { + vu32* reg = (vu32*)(0x04000404 + (i<<4)); + *reg = 0xFFFFFFFF; + //if(*reg != 0x07FFFFFF) fail("spu source reg is only 27bit.\nshould be 0x07FFFFFF",*reg); + if(*reg != 0x00000000) fail("spu source reg is not readable!",*reg); + } + + //spu length reg should only be 22bit + for(int i=0;i<16;i++) + { + vu32* reg = (vu32*)(0x0400040C + (i<<4)); + *reg = 0xFFFFFFFF; + //if(*reg != 0x003FFFFF) fail("spu length reg is only 22bit.\nshould be 0x003FFFFF",*reg); + if(*reg != 0x00000000) fail("spu length reg is not readable!",*reg); + } + + arm7comm->firmwareId = getFirmwareType(); + arm7comm->code = 2; + fifoSendValue32(FIFO_USER_01,0); + while (1) swiWaitForVBlank(); +} + + diff --git a/tools/ds_tests/regs/arm9/source/main.cpp b/tools/ds_tests/regs/arm9/source/main.cpp index 67390feb5..72a44adc4 100644 --- a/tools/ds_tests/regs/arm9/source/main.cpp +++ b/tools/ds_tests/regs/arm9/source/main.cpp @@ -90,6 +90,7 @@ int main(void) { swiWaitForVBlank(); } + iprintf("firmwareID: %08X\n",arm7comm.firmwareId); iprintf("arm7 finish code: %d\n",arm7comm.code); if(arm7comm.code == 1) diff --git a/tools/ds_tests/regs/regstest.h b/tools/ds_tests/regs/regstest.h index daf924758..ac22dafe0 100644 --- a/tools/ds_tests/regs/regstest.h +++ b/tools/ds_tests/regs/regstest.h @@ -1,8 +1,9 @@ -typedef struct _arm7comm_t +struct arm7comm_t { int code; u32 offender; char message[1024]; -} arm7comm_t; + u32 firmwareId; +}; //#define arm7comm ( (arm7comm_t*)0x02200000 ) \ No newline at end of file