From c51d8a7191785247307843bfdef939fe1173bc3d Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Sun, 25 Aug 2019 15:16:24 +0100 Subject: [PATCH] Fix Art Academy save writing Apparently, at least in my copy, the flash chip has a chance to fail a PP command, and just never complete it. So we just try again. --- arm9/source/gamecart/card_spi.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/arm9/source/gamecart/card_spi.c b/arm9/source/gamecart/card_spi.c index 434fcbc..958a929 100644 --- a/arm9/source/gamecart/card_spi.c +++ b/arm9/source/gamecart/card_spi.c @@ -74,8 +74,7 @@ const CardSPITypeData flashTypes[] = { { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_write, CardSPIEraseSector_real, 0x204013, 1 << 19, 65536, 256, 256, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_SE }, { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_write, CardSPIEraseSector_real, 0x621100, 1 << 19, 65536, 256, 256, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_SE }, { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_write, CardSPIEraseSector_real, 0x204014, 1 << 20, 65536, 256, 256, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_SE }, - // Untested (but pretty safe bet), for Art Academy - { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_erase_program, CardSPIEraseSector_real, 0x202017, 1 << 23, 65536, 32, 65536, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_SE }, + { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_erase_program, CardSPIEraseSector_real, 0x202017, 1 << 23, 65536, 256, 65536, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_SE }, // CTR { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_erase_program, CardSPIEraseSector_real, 0xC22211, 1 << 17, 4096, 32, 4096, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_MXIC_SE }, { CardSPIEnableWriting_regular, CardSPIReadSaveData_24bit, CardSPIWriteSaveData_24bit_erase_program, CardSPIEraseSector_real, 0xC22213, 1 << 19, 4096, 32, 4096, SPI_FLASH_CMD_PW, SPI_CMD_PP, SPI_FLASH_CMD_MXIC_SE }, @@ -132,7 +131,7 @@ int CardSPIWaitWriteEnd(CardSPIType type) { do { res = CardSPIWriteRead(type, &cmd, 1, &statusReg, 1, 0, 0); if (res) return res; - if (timer_msec(time_start) > 1000) return 1; + if (timer_msec(time_start) > 10000) return 1; } while(statusReg & SPI_FLG_WIP); return 0; @@ -253,7 +252,13 @@ int CardSPIWriteSaveData_24bit_erase_program(CardSPIType type, u32 offset, const cmd[1] = (u8)(pos >> 16); cmd[2] = (u8)(pos >> 8); cmd[3] = (u8) pos; - if ((res = _SPIWriteTransaction(type, cmd, 4, (void*) ((u8*) data - offset + pos), pageSize))) { + for(int i = 0; i < 10; i++) { + if (!(res = _SPIWriteTransaction(type, cmd, 4, (void*) ((u8*) data - offset + pos), pageSize))) { + break; + } + CardSPIWriteRead(type, "\x04", 1, NULL, 0, NULL, 0); + } + if(res) { free(newData); return res; } @@ -374,6 +379,13 @@ int CardSPIEraseSector(CardSPIType type, u32 offset) { return type.chip->eraseSector(type, offset); } +int CardSPIErase(CardSPIType type) { + for (u32 pos = 0; pos < CardSPIGetCapacity(type); pos += CardSPIGetEraseSize(type)) { + int res = CardSPIEraseSector(type, pos); + if(res) return res; + } + return 0; +} // The following routine use code from savegame-manager: