From ac4ec6ee906ad9ab8adcfee71191d240f4807655 Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Tue, 9 Jul 2019 03:57:20 +0200 Subject: [PATCH] spicard.h: use void* pointers First initialized cart reads correctly now, and cardswap just hangs. --- arm9/source/gamecart/spi.c | 18 ------------------ arm9/source/gamecart/spicard.c | 18 +++++++++++++----- arm9/source/gamecart/spicard.h | 2 +- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/arm9/source/gamecart/spi.c b/arm9/source/gamecart/spi.c index 21d3c05..3069233 100644 --- a/arm9/source/gamecart/spi.c +++ b/arm9/source/gamecart/spi.c @@ -350,24 +350,6 @@ int SPIGetCardType(CardType* type, int infrared) { while(tries < maxTries){ res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; - res = SPIReadJEDECIDAndStatusReg(t, &jedec, &sr); // dummy - if(res) return res; if ((sr & 0xfd) == 0x00 && (jedec != 0x00ffffff)) { break; } if ((sr & 0xfd) == 0xF0 && (jedec == 0x00ffffff)) { t = EEPROM_512B; break; } diff --git a/arm9/source/gamecart/spicard.c b/arm9/source/gamecart/spicard.c index 448c4b3..955548d 100644 --- a/arm9/source/gamecart/spicard.c +++ b/arm9/source/gamecart/spicard.c @@ -100,11 +100,15 @@ bool _SPICARD_autoPollBit(u32 params) } */ -void SPICARD_writeRead(NspiClk clk, const u32 *in, u32 *out, u32 inSize, u32 outSize, bool done) +void SPICARD_writeRead(NspiClk clk, const void *in, void *out, u32 inSize, u32 outSize, bool done) { const u32 cntParams = NSPI_CNT_ENABLE | NSPI_CNT_BUS_1BIT | clk; - if(in) + u32 buf; + char *in_ = (char *) in; + char *out_ = (char *) out; + + if(in_) { REG_NSPI_BLKLEN = inSize; REG_NSPI_CNT = cntParams | NSPI_CNT_DIRE_WRITE; @@ -113,13 +117,15 @@ void SPICARD_writeRead(NspiClk clk, const u32 *in, u32 *out, u32 inSize, u32 out do { if((counter & 31) == 0) nspiWaitFifoBusy(); - REG_NSPI_FIFO = *in++; + memcpy(&buf, in_, min(4, inSize - counter)); + REG_NSPI_FIFO = buf; counter += 4; + in_ += 4; } while(counter < inSize); nspiWaitBusy(); } - if(out) + if(out_) { REG_NSPI_BLKLEN = outSize; REG_NSPI_CNT = cntParams | NSPI_CNT_DIRE_READ; @@ -128,8 +134,10 @@ void SPICARD_writeRead(NspiClk clk, const u32 *in, u32 *out, u32 inSize, u32 out do { if((counter & 31) == 0) nspiWaitFifoBusy(); - *out++ = REG_NSPI_FIFO; + buf = REG_NSPI_FIFO; + memcpy(out_, &buf, min(4, outSize - counter)); counter += 4; + out_ += 4; } while(counter < outSize); nspiWaitBusy(); diff --git a/arm9/source/gamecart/spicard.h b/arm9/source/gamecart/spicard.h index 4ecaaa9..4726106 100644 --- a/arm9/source/gamecart/spicard.h +++ b/arm9/source/gamecart/spicard.h @@ -80,7 +80,7 @@ bool _SPICARD_autoPollBit(u32 params); * @param[in] outSize Output size. Must be <= 0x1FFFFF. * @param[in] done Set to true if this is the last transfer (chip select). */ -void SPICARD_writeRead(NspiClk clk, const u32 *in, u32 *out, u32 inSize, u32 outSize, bool done); +void SPICARD_writeRead(NspiClk clk, const void *in, void *out, u32 inSize, u32 outSize, bool done); /**