diff --git a/arm9/source/gamecart/spi.c b/arm9/source/gamecart/spi.c index 3069233..6c3fdff 100644 --- a/arm9/source/gamecart/spi.c +++ b/arm9/source/gamecart/spi.c @@ -35,6 +35,8 @@ int SPIWriteRead(CardType type, void* cmd, u32 cmdSize, void* answer, u32 answer } SPICARD_writeRead(NSPI_CLK_4MHz, cmd, answer, cmdSize, answerSize, false); SPICARD_writeRead(NSPI_CLK_4MHz, data, NULL, dataSize, 0, true); + + SPICARD_deinit(); return 0; } diff --git a/arm9/source/gamecart/spicard.c b/arm9/source/gamecart/spicard.c index 955548d..8b002c5 100644 --- a/arm9/source/gamecart/spicard.c +++ b/arm9/source/gamecart/spicard.c @@ -20,6 +20,8 @@ #include "spicard.h" #include "delay.h" +#define REG_CFG9_CARDCTL *((vu16*)0x1000000C) + #define SPICARD_REGS_BASE 0x1000D800 #define REG_NSPI_CNT *((vu32*)(SPICARD_REGS_BASE + 0x00)) #define REG_NSPI_DONE *((vu32*)(SPICARD_REGS_BASE + 0x04)) @@ -44,43 +46,12 @@ static inline void nspiWaitFifoBusy(void) void SPICARD_init(void) { - static bool inited = false; - if(inited) return; - inited = true; - - // TODO -#define REG_CFG9_CARDCTL *((vu16*)0x1000000C) -#define REG_CFG9_CARDSTATUS *((vu8* )0x10000010) -#define REG_CFG9_CARDCYCLES0 *((vu16*)0x10000012) -#define REG_CFG9_CARDCYCLES1 *((vu16*)0x10000014) - -#define REG_NTRCARDMCNT *((vu16*)0x10164000) -#define REG_NTRCARDROMCNT *((vu32*)0x10164004) - - REG_CFG9_CARDCYCLES0 = 0x1988; - REG_CFG9_CARDCYCLES1 = 0x264C; - // boot9 waits here. Unnecessary? - - REG_CFG9_CARDSTATUS = 3u<<2; // Request power off - while(REG_CFG9_CARDSTATUS != 0); // Aotomatically changes to 0 (off) - ioDelay(1000); - - REG_CFG9_CARDSTATUS = 1u<<2; // Prepare power on - ioDelay(10000); - - REG_CFG9_CARDSTATUS = 2u<<2; // Power on - ioDelay(27000); - - // Switch to NTRCARD controller. - REG_CFG9_CARDCTL = 0; - REG_NTRCARDMCNT = 0xC000u; - REG_NTRCARDROMCNT = 0x20000000; - ioDelay(120000); - REG_CFG9_CARDCTL |= 1u<<8; +} - REG_NSPI_INT_MASK = NSPI_INT_TRANSF_END; // Disable interrupt 1 - REG_NSPI_INT_STAT = NSPI_INT_AP_TIMEOUT | NSPI_INT_AP_SUCCESS | NSPI_INT_TRANSF_END; // Aknowledge +void SPICARD_deinit(void) +{ + REG_CFG9_CARDCTL &= ~(1u<<8); } /* @@ -104,6 +75,8 @@ void SPICARD_writeRead(NspiClk clk, const void *in, void *out, u32 inSize, u32 o { const u32 cntParams = NSPI_CNT_ENABLE | NSPI_CNT_BUS_1BIT | clk; + REG_CFG9_CARDCTL |= 1u<<8; + u32 buf; char *in_ = (char *) in; char *out_ = (char *) out; diff --git a/arm9/source/gamecart/spicard.h b/arm9/source/gamecart/spicard.h index 4726106..f7eee6d 100644 --- a/arm9/source/gamecart/spicard.h +++ b/arm9/source/gamecart/spicard.h @@ -57,10 +57,15 @@ typedef enum /** - * @brief Initializes the SPI buses. Call this only once. + * @brief Activates the SPI bus. Use after some cartridge interface has been initialized. */ void SPICARD_init(void); +/** + * @brief Deactivates the SPI bus. + */ +void SPICARD_deinit(void); + /** * @brief Automatically polls a bit of the command response. Use with the macro below. *