diff --git a/arm9/source/driveOperations.cpp b/arm9/source/driveOperations.cpp index 57d8598..6cfbe3c 100644 --- a/arm9/source/driveOperations.cpp +++ b/arm9/source/driveOperations.cpp @@ -153,9 +153,9 @@ TWL_CODE void nandUnmount(void) { } bool sdMount(void) { - extern const DISC_INTERFACE __io_dsisd; + extern const DISC_INTERFACE __my_io_dsisd; - fatMountSimple("sd", &__io_dsisd); + fatMountSimple("sd", &__my_io_dsisd); if (sdFound()) { sdMountedDone = true; fatGetVolumeLabel("sd", sdLabel); diff --git a/arm9/source/my_sd.c b/arm9/source/my_sd.c new file mode 100644 index 0000000..0be3397 --- /dev/null +++ b/arm9/source/my_sd.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include + +//--------------------------------------------------------------------------------- +bool my_sdio_Startup() { +//--------------------------------------------------------------------------------- + fifoSendValue32(FIFO_SDMMC,SDMMC_HAVE_SD); + while(!fifoCheckValue32(FIFO_SDMMC)); + int result = fifoGetValue32(FIFO_SDMMC); + + if(result==0) return false; + + fifoSendValue32(FIFO_SDMMC,SDMMC_SD_START); + + fifoWaitValue32(FIFO_SDMMC); + + result = fifoGetValue32(FIFO_SDMMC); + + return result == 0; +} + +//--------------------------------------------------------------------------------- +bool my_sdio_IsInserted() { +//--------------------------------------------------------------------------------- + fifoSendValue32(FIFO_SDMMC,SDMMC_SD_IS_INSERTED); + + fifoWaitValue32(FIFO_SDMMC); + + int result = fifoGetValue32(FIFO_SDMMC); + + return result == 1; +} + +//--------------------------------------------------------------------------------- +bool my_sdio_ReadSectors(sec_t sector, sec_t numSectors,void* buffer) { +//--------------------------------------------------------------------------------- + FifoMessage msg; + + DC_FlushRange(buffer,numSectors * 512); + + msg.type = SDMMC_SD_READ_SECTORS; + msg.sdParams.startsector = sector; + msg.sdParams.numsectors = numSectors; + msg.sdParams.buffer = buffer; + + fifoSendDatamsg(FIFO_SDMMC, sizeof(msg), (u8*)&msg); + + fifoWaitValue32(FIFO_SDMMC); + + int result = fifoGetValue32(FIFO_SDMMC); + + return result == 0; +} + +//--------------------------------------------------------------------------------- +bool my_sdio_WriteSectors(sec_t sector, sec_t numSectors,const void* buffer) { +//--------------------------------------------------------------------------------- + FifoMessage msg; + + DC_FlushRange(buffer,numSectors * 512); + + msg.type = SDMMC_SD_WRITE_SECTORS; + msg.sdParams.startsector = sector; + msg.sdParams.numsectors = numSectors; + msg.sdParams.buffer = (void*)buffer; + + fifoSendDatamsg(FIFO_SDMMC, sizeof(msg), (u8*)&msg); + + fifoWaitValue32(FIFO_SDMMC); + + int result = fifoGetValue32(FIFO_SDMMC); + + return result == 0; +} + + +//--------------------------------------------------------------------------------- +bool my_sdio_ClearStatus() { +//--------------------------------------------------------------------------------- + return true; +} + +//--------------------------------------------------------------------------------- +bool my_sdio_Shutdown() { +//--------------------------------------------------------------------------------- + return true; +} + +const DISC_INTERFACE __my_io_dsisd = { + DEVICE_TYPE_DSI_SD, + FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE, + (FN_MEDIUM_STARTUP)&my_sdio_Startup, + (FN_MEDIUM_ISINSERTED)&my_sdio_IsInserted, + (FN_MEDIUM_READSECTORS)&my_sdio_ReadSectors, + (FN_MEDIUM_WRITESECTORS)&my_sdio_WriteSectors, + (FN_MEDIUM_CLEARSTATUS)&my_sdio_ClearStatus, + (FN_MEDIUM_SHUTDOWN)&my_sdio_Shutdown +};