Change timeout on CardSPIWaitWriteEnd (#557)

Allows long waits for erase on things like Art Academy, but fails faster
elsewhere. In particular initialization fails almost instantly.
This commit is contained in:
Bálint Kovács 2019-10-26 13:12:18 +01:00 committed by Wolfvak
parent 2b05453685
commit 2e463c6b84
2 changed files with 8 additions and 8 deletions

View File

@ -123,7 +123,7 @@ int CardSPIWriteRead(CardSPIType type, const void* cmd, u32 cmdSize, void* answe
return 0; return 0;
} }
int CardSPIWaitWriteEnd(CardSPIType type) { int CardSPIWaitWriteEnd(CardSPIType type, u32 timeout) {
u8 cmd = SPI_CMD_RDSR, statusReg = 0; u8 cmd = SPI_CMD_RDSR, statusReg = 0;
int res = 0; int res = 0;
u64 time_start = timer_start(); u64 time_start = timer_start();
@ -131,7 +131,7 @@ int CardSPIWaitWriteEnd(CardSPIType type) {
do { do {
res = CardSPIWriteRead(type, &cmd, 1, &statusReg, 1, 0, 0); res = CardSPIWriteRead(type, &cmd, 1, &statusReg, 1, 0, 0);
if (res) return res; if (res) return res;
if (timer_msec(time_start) > 10000) return 1; if (timer_msec(time_start) > timeout) return 1;
} while(statusReg & SPI_FLG_WIP); } while(statusReg & SPI_FLG_WIP);
return 0; return 0;
@ -166,7 +166,7 @@ int _SPIWriteTransaction(CardSPIType type, void* cmd, u32 cmdSize, const void* d
int res; int res;
if ((res = CardSPIEnableWriting(type))) return res; if ((res = CardSPIEnableWriting(type))) return res;
if ((res = CardSPIWriteRead(type, cmd, cmdSize, NULL, 0, (void*) ((u8*) data), dataSize))) return res; if ((res = CardSPIWriteRead(type, cmd, cmdSize, NULL, 0, (void*) ((u8*) data), dataSize))) return res;
return CardSPIWaitWriteEnd(type); return CardSPIWaitWriteEnd(type, 1000);
} }
int CardSPIReadJEDECIDAndStatusReg(CardSPIType type, u32* id, u8* statusReg) { int CardSPIReadJEDECIDAndStatusReg(CardSPIType type, u32* id, u8* statusReg) {
@ -174,7 +174,7 @@ int CardSPIReadJEDECIDAndStatusReg(CardSPIType type, u32* id, u8* statusReg) {
u8 reg = 0; u8 reg = 0;
u8 idbuf[3] = { 0 }; u8 idbuf[3] = { 0 };
u32 id_ = 0; u32 id_ = 0;
int res = CardSPIWaitWriteEnd(type); int res = CardSPIWaitWriteEnd(type, 0);
if (res) return res; if (res) return res;
if ((res = CardSPIWriteRead(type, &cmd, 1, idbuf, 3, 0, 0))) return res; if ((res = CardSPIWriteRead(type, &cmd, 1, idbuf, 3, 0, 0))) return res;
@ -278,7 +278,7 @@ int CardSPIWriteSaveData(CardSPIType type, u32 offset, const void* data, u32 siz
u32 writeSize = type.chip->writeSize; u32 writeSize = type.chip->writeSize;
if (writeSize == 0) return 0xC8E13404; if (writeSize == 0) return 0xC8E13404;
int res = CardSPIWaitWriteEnd(type); int res = CardSPIWaitWriteEnd(type, 1000);
if (res) return res; if (res) return res;
while(pos < end) { while(pos < end) {
@ -344,7 +344,7 @@ int CardSPIReadSaveData(CardSPIType type, u32 offset, void* data, u32 size) {
if (size == 0) return 0; if (size == 0) return 0;
int res = CardSPIWaitWriteEnd(type); int res = CardSPIWaitWriteEnd(type, 1000);
if (res) return res; if (res) return res;
size = (size <= CardSPIGetCapacity(type) - offset) ? size : CardSPIGetCapacity(type) - offset; size = (size <= CardSPIGetCapacity(type) - offset) ? size : CardSPIGetCapacity(type) - offset;
@ -367,7 +367,7 @@ int CardSPIEraseSector_emulated(CardSPIType type, u32 offset) {
int CardSPIEraseSector_real(CardSPIType type, u32 offset) { int CardSPIEraseSector_real(CardSPIType type, u32 offset) {
u8 cmd[4] = { type.chip->eraseCommand, (u8)(offset >> 16), (u8)(offset >> 8), (u8) offset }; u8 cmd[4] = { type.chip->eraseCommand, (u8)(offset >> 16), (u8)(offset >> 8), (u8) offset };
int res = CardSPIWaitWriteEnd(type); int res = CardSPIWaitWriteEnd(type, 10000);
if (res) return res; if (res) return res;
return _SPIWriteTransaction(type, cmd, 4, NULL, 0); return _SPIWriteTransaction(type, cmd, 4, NULL, 0);

View File

@ -67,7 +67,7 @@ const CardSPITypeData * const FLASH_512KB_CTR; // Also common, including Detecti
const CardSPITypeData * const FLASH_1MB_CTR; // For example Pokemon Ultra Sun const CardSPITypeData * const FLASH_1MB_CTR; // For example Pokemon Ultra Sun
int CardSPIWriteRead(CardSPIType type, const void* cmd, u32 cmdSize, void* answer, u32 answerSize, const void* data, u32 dataSize); int CardSPIWriteRead(CardSPIType type, const void* cmd, u32 cmdSize, void* answer, u32 answerSize, const void* data, u32 dataSize);
int CardSPIWaitWriteEnd(CardSPIType type); int CardSPIWaitWriteEnd(CardSPIType type, u32 timeout);
int CardSPIEnableWriting(CardSPIType type); int CardSPIEnableWriting(CardSPIType type);
int CardSPIReadJEDECIDAndStatusReg(CardSPIType type, u32* id, u8* statusReg); int CardSPIReadJEDECIDAndStatusReg(CardSPIType type, u32* id, u8* statusReg);
int CardSPIGetCardSPIType(CardSPIType* type, bool infrared); int CardSPIGetCardSPIType(CardSPIType* type, bool infrared);