diff --git a/arm9/source/gamecart/card_eeprom.c b/arm9/source/gamecart/card_eeprom.c deleted file mode 100644 index 5124c99..0000000 --- a/arm9/source/gamecart/card_eeprom.c +++ /dev/null @@ -1,307 +0,0 @@ -/*--------------------------------------------------------------------------------- - - Copyright (C) 2005 - 2010 - 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 "ndscard.h" -#include "card_eeprom.h" - -//--------------------------------------------------------------------------------- -u8 cardEepromCommand(u8 command) { -//--------------------------------------------------------------------------------- - u8 retval; - - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - - REG_AUXSPIDATA = command; - - eepromWaitBusy(); - - REG_AUXSPIDATA = 0; - eepromWaitBusy(); - retval = REG_AUXSPIDATA; - REG_AUXSPICNT = /*MODE*/0x40; - return retval; -} - - -//--------------------------------------------------------------------------------- -u32 cardEepromReadID() { -//--------------------------------------------------------------------------------- - int i; - - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - - REG_AUXSPIDATA = SPI_EEPROM_RDID; - - eepromWaitBusy(); - u32 id = 0; - for ( i=0; i<3; i++) { - REG_AUXSPIDATA = 0; - eepromWaitBusy(); - id = (id << 8) | REG_AUXSPIDATA; - } - - REG_AUXSPICNT = /*MODE*/0x40; - - return id; -} - - -//--------------------------------------------------------------------------------- -int cardEepromGetType(void) { -//--------------------------------------------------------------------------------- - int sr = cardEepromCommand(SPI_EEPROM_RDSR); - int id = cardEepromReadID(); - - if (( sr == 0xff && id == 0xffffff) || ( sr == 0 && id == 0 )) return -1; - if ( sr == 0xf0 && id == 0xffffff ) return 1; - if ( sr == 0x00 && id == 0xffffff ) return 2; - if ( id != 0xffffff) return 3; - - return 0; -} - -//--------------------------------------------------------------------------------- -u32 cardEepromGetSize() { -//--------------------------------------------------------------------------------- - - int type = cardEepromGetType(); - - if(type == -1) - return 0; - if(type == 0) - return 8192; - if(type == 1) - return 512; - if(type == 2) { - u32 buf1,buf2,buf3; - cardReadEeprom(0,(u8*)&buf1,4,type); - if ( !(buf1 != 0 && buf1 != 0xffffffff) ) { - buf3 = ~buf1; - cardWriteEeprom(0,(u8*)&buf3,4,type); - } else { - buf3 = buf1; - } - int size = 8192; - while (1) { - cardReadEeprom(size,(u8*)&buf2,4,type); - if ( buf2 == buf3 ) break; - size += 8192; - }; - - if ( buf1 != buf3 ) cardWriteEeprom(0,(u8*)&buf1,4,type); - - return size; - } - - int device; - - if(type == 3) { - int id = cardEepromReadID(); - - device = id & 0xffff; - - if ( ((id >> 16) & 0xff) == 0x20 ) { // ST - - switch(device) { - - case 0x4014: - return 1024*1024; // 8Mbit(1 meg) - break; - case 0x4013: - case 0x8013: // M25PE40 - return 512*1024; // 4Mbit(512KByte) - break; - case 0x2017: - return 8*1024*1024; // 64Mbit(8 meg) - break; - } - } - - if ( ((id >> 16) & 0xff) == 0x62 ) { // Sanyo - - if (device == 0x1100) - return 512*1024; // 4Mbit(512KByte) - - } - - if ( ((id >> 16) & 0xff) == 0xC2 ) { // Macronix - - if (device == 0x2211) - return 128*1024; // 1Mbit(128KByte) - MX25L1021E - } - - - return 256*1024; // 2Mbit(256KByte) - } - - return 0; -} - - -//--------------------------------------------------------------------------------- -void cardReadEeprom(u32 address, u8 *data, u32 length, u32 addrtype) { -//--------------------------------------------------------------------------------- - - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - REG_AUXSPIDATA = 0x03 | ((addrtype == 1) ? address>>8<<3 : 0); - eepromWaitBusy(); - - if (addrtype == 3) { - REG_AUXSPIDATA = (address >> 16) & 0xFF; - eepromWaitBusy(); - } - - if (addrtype >= 2) { - REG_AUXSPIDATA = (address >> 8) & 0xFF; - eepromWaitBusy(); - } - - - REG_AUXSPIDATA = (address) & 0xFF; - eepromWaitBusy(); - - while (length > 0) { - REG_AUXSPIDATA = 0; - eepromWaitBusy(); - *data++ = REG_AUXSPIDATA; - length--; - } - - eepromWaitBusy(); - REG_AUXSPICNT = /*MODE*/0x40; -} - - -//--------------------------------------------------------------------------------- -void cardWriteEeprom(u32 address, u8 *data, u32 length, u32 addrtype) { -//--------------------------------------------------------------------------------- - - u32 address_end = address + length; - int i; - int maxblocks = 32; - if(addrtype == 1) maxblocks = 16; - if(addrtype == 2) maxblocks = 32; - if(addrtype == 3) maxblocks = 256; - - while (address < address_end) { - // set WEL (Write Enable Latch) - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - REG_AUXSPIDATA = 0x06; eepromWaitBusy(); - REG_AUXSPICNT = /*MODE*/0x40; - - // program maximum of 32 bytes - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - - if(addrtype == 1) { - // WRITE COMMAND 0x02 + A8 << 3 - REG_AUXSPIDATA = 0x02 | (address & (1 << (8))) >> (8-3) ; - eepromWaitBusy(); - REG_AUXSPIDATA = address & 0xFF; - eepromWaitBusy(); - } - else if(addrtype == 2) { - REG_AUXSPIDATA = 0x02; - eepromWaitBusy(); - REG_AUXSPIDATA = address >> 8; - eepromWaitBusy(); - REG_AUXSPIDATA = address & 0xFF; - eepromWaitBusy(); - } - else if(addrtype == 3) { - REG_AUXSPIDATA = 0x02; - eepromWaitBusy(); - REG_AUXSPIDATA = (address >> 16) & 0xFF; - eepromWaitBusy(); - REG_AUXSPIDATA = (address >> 8) & 0xFF; - eepromWaitBusy(); - REG_AUXSPIDATA = address & 0xFF; - eepromWaitBusy(); - } - - for (i=0; address> 16) & 0xFF; - eepromWaitBusy(); - REG_AUXSPIDATA = (address >> 8) & 0xFF; - eepromWaitBusy(); - REG_AUXSPIDATA = address & 0xFF; - eepromWaitBusy(); - - REG_AUXSPICNT = /*MODE*/0x40; - - // wait erase to finish - REG_AUXSPICNT = /*E*/0x8000 | /*SEL*/0x2000 | /*MODE*/0x40; - REG_AUXSPIDATA = 0x05; - eepromWaitBusy(); - - do { - REG_AUXSPIDATA = 0; - eepromWaitBusy(); - } while (REG_AUXSPIDATA & 0x01); // WIP (Write In Progress) ? - REG_AUXSPICNT = /*MODE*/0x40; -} diff --git a/arm9/source/gamecart/card_eeprom.h b/arm9/source/gamecart/card_eeprom.h deleted file mode 100644 index d81b6a4..0000000 --- a/arm9/source/gamecart/card_eeprom.h +++ /dev/null @@ -1,38 +0,0 @@ -#include "ndscard.h" - -//--------------------------------------------------------------------------------- -static inline void eepromWaitBusy() { -//--------------------------------------------------------------------------------- - while (REG_AUXSPICNT & CARD_SPI_BUSY); -} - -// Reads from the EEPROM -void cardReadEeprom(u32 address, u8 *data, u32 length, u32 addrtype); - -// Writes to the EEPROM. TYPE 3 EEPROM must be erased first (I think?) -void cardWriteEeprom(u32 address, u8 *data, u32 length, u32 addrtype); - -// Returns the ID of the EEPROM chip? Doesn't work well, most chips give ff,ff -// i = 0 or 1 -u32 cardEepromReadID(); - -// Sends a command to the EEPROM -u8 cardEepromCommand(u8 command); - -/* - * -1:no card or no EEPROM - * 0:unknown PassMe? - * 1:TYPE 1 4Kbit(512Byte) EEPROM - * 2:TYPE 2 64Kbit(8KByte)or 512kbit(64Kbyte) EEPROM - * 3:TYPE 3 2Mbit(256KByte) FLASH MEMORY (some rare 4Mbit and 8Mbit chips also) - */ -int cardEepromGetType(void); - -// Returns the size in bytes of EEPROM -u32 cardEepromGetSize(); - -// Erases the entire chip. TYPE 3 chips MUST be erased before writing to them. (I think?) -void cardEepromChipErase(void); - -// Erases a single sector of the TYPE 3 chip -void cardEepromSectorErase(u32 address);