diff --git a/gc/sdcard/card_io.h b/gc/sdcard/card_io.h index a33bae04..b71071c7 100644 --- a/gc/sdcard/card_io.h +++ b/gc/sdcard/card_io.h @@ -27,6 +27,11 @@ enum { CARDIO_ADDRESSING_BLOCK }; +enum { + CARDIO_TRANSFER_IMM = 0, + CARDIO_TRANSFER_DMA +}; + extern u8 g_CSD[MAX_DRIVE][16]; extern u8 g_CID[MAX_DRIVE][16]; extern u8 g_mCode[MAX_MI_NUM]; @@ -59,6 +64,7 @@ u32 sdgecko_getPageSize(s32 drv_no); s32 sdgecko_setPageSize(s32 drv_no, u32 size); u32 sdgecko_getAddressingType(s32 drv_no); +u32 sdgecko_getTransferMode(s32 drv_no); bool sdgecko_isInserted(s32 drv_no); bool sdgecko_isInitialized(s32 drv_no); diff --git a/libogc/gcsd.c b/libogc/gcsd.c index ac28b987..8f022d2a 100644 --- a/libogc/gcsd.c +++ b/libogc/gcsd.c @@ -79,6 +79,7 @@ static bool __gcsd_readSectors(int n, sec_t sector, sec_t numSectors, void *buff if((u32)sector != sector) return false; if((u32)numSectors != numSectors) return false; + if(!SYS_IsDMAAddress(buffer)) return false; if(numSectors == 1) ret = sdgecko_readSector(n, buffer, sector); diff --git a/libogc/sdgecko_io.c b/libogc/sdgecko_io.c index 987a64ef..0e48286b 100644 --- a/libogc/sdgecko_io.c +++ b/libogc/sdgecko_io.c @@ -84,6 +84,7 @@ static u16 _ioCrc16Table[256]; // SDHC support static u32 _initType[MAX_DRIVE]; static u32 _ioAddressingType[MAX_DRIVE]; +static u32 _ioTransferMode[MAX_DRIVE]; extern unsigned long gettick(void); @@ -399,7 +400,9 @@ static s32 __card_readresponse(s32 drv_no,void *buf,s32 len) __exi_wait(drv_no); - if(EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no])==0) { + if((_ioTransferMode[drv_no]==CARDIO_TRANSFER_DMA? + EXI_SelectSD(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]): + EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]))==0) { EXI_Unlock(drv_no); return CARDIO_ERROR_NOCARD; } @@ -440,7 +443,9 @@ static s32 __card_stopreadresponse(s32 drv_no,void *buf,s32 len) __exi_wait(drv_no); - if(EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no])==0) { + if((_ioTransferMode[drv_no]==CARDIO_TRANSFER_DMA? + EXI_SelectSD(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]): + EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]))==0) { EXI_Unlock(drv_no); return CARDIO_ERROR_NOCARD; } @@ -542,7 +547,9 @@ static s32 __card_datares(s32 drv_no,void *buf) __exi_wait(drv_no); - if(EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no])==0) { + if((_ioTransferMode[drv_no]==CARDIO_TRANSFER_DMA? + EXI_SelectSD(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]): + EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]))==0) { EXI_Unlock(drv_no); return CARDIO_ERROR_NOCARD; } @@ -658,14 +665,16 @@ static s32 __card_dataread(s32 drv_no,void *buf,u32 len) __exi_wait(drv_no); - if(EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no])==0) { + if((_ioTransferMode[drv_no]==CARDIO_TRANSFER_DMA? + EXI_SelectSD(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]): + EXI_Select(drv_no,_ioCardSelect[drv_no],_ioCardFreq[drv_no]))==0) { EXI_Unlock(drv_no); return CARDIO_ERROR_NOCARD; } ret = CARDIO_ERROR_READY; ptr = buf; - for(cnt=0;cnt