From f24a7cf22d8c60a4e7b427e6335ec76107011211 Mon Sep 17 00:00:00 2001 From: Extrems Date: Sat, 23 Mar 2019 13:55:08 -0400 Subject: [PATCH 1/3] Tentative support for SD2SP2 (and USB Gecko). --- gc/ogc/disc_io.h | 3 ++- gc/sdcard/card_cmn.h | 2 +- gc/sdcard/gcsd.h | 1 + libogc/gcsd.c | 42 ++++++++++++++++++++++++++++++++++++++++++ libogc/sdgecko_io.c | 5 +++-- libogc/usbgecko.c | 4 ++-- 6 files changed, 51 insertions(+), 6 deletions(-) diff --git a/gc/ogc/disc_io.h b/gc/ogc/disc_io.h index 0a6ef3e5a..7f5ce5735 100644 --- a/gc/ogc/disc_io.h +++ b/gc/ogc/disc_io.h @@ -38,7 +38,8 @@ #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_GAMECUBE_SLOTA 0x00000010 #define FEATURE_GAMECUBE_SLOTB 0x00000020 -#define FEATURE_GAMECUBE_DVD 0x00000040 +#define FEATURE_GAMECUBE_PORT2 0x00000040 +#define FEATURE_GAMECUBE_DVD 0x00000080 #define FEATURE_WII_SD 0x00000100 #define FEATURE_WII_USB 0x00000200 #define FEATURE_WII_DVD 0x00000400 diff --git a/gc/sdcard/card_cmn.h b/gc/sdcard/card_cmn.h index bc189ee04..51be32b7b 100644 --- a/gc/sdcard/card_cmn.h +++ b/gc/sdcard/card_cmn.h @@ -34,7 +34,7 @@ #define CARDIO_ERROR_INVALIDPARAM -127 #define CARDIO_ERROR_FATALERROR -128 -#define MAX_DRIVE 2 +#define MAX_DRIVE 3 #define SECTOR_SIZE 512 #define NOT_INITIALIZED 0 diff --git a/gc/sdcard/gcsd.h b/gc/sdcard/gcsd.h index c27a7316f..09ddc189f 100644 --- a/gc/sdcard/gcsd.h +++ b/gc/sdcard/gcsd.h @@ -41,5 +41,6 @@ extern const DISC_INTERFACE __io_gcsda; extern const DISC_INTERFACE __io_gcsdb; +extern const DISC_INTERFACE __io_gcsd2; #endif diff --git a/libogc/gcsd.c b/libogc/gcsd.c index c109a34ce..088f3e884 100644 --- a/libogc/gcsd.c +++ b/libogc/gcsd.c @@ -152,6 +152,38 @@ static bool __gcsdb_shutdown(void) return __gcsd_shutdown(1); } + + +static bool __gcsd2_startup(void) +{ + return __gcsd_startup(2); +} + +static bool __gcsd2_isInserted(void) +{ + return __gcsd_isInserted(2); +} + +static bool __gcsd2_readSectors(sec_t sector, sec_t numSectors, void *buffer) +{ + return __gcsd_readSectors(2, sector, numSectors, buffer); +} + +static bool __gcsd2_writeSectors(sec_t sector, sec_t numSectors, const void *buffer) +{ + return __gcsd_writeSectors(2, sector, numSectors, buffer); +} + +static bool __gcsd2_clearStatus(void) +{ + return __gcsd_clearStatus(2); +} + +static bool __gcsd2_shutdown(void) +{ + return __gcsd_shutdown(2); +} + const DISC_INTERFACE __io_gcsda = { DEVICE_TYPE_GC_SD, FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_GAMECUBE_SLOTA, @@ -172,3 +204,13 @@ const DISC_INTERFACE __io_gcsdb = { __gcsdb_clearStatus, __gcsdb_shutdown }; +const DISC_INTERFACE __io_gcsd2 = { + DEVICE_TYPE_GC_SD, + FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_GAMECUBE_PORT2, + __gcsd2_startup, + __gcsd2_isInserted, + __gcsd2_readSectors, + __gcsd2_writeSectors, + __gcsd2_clearStatus, + __gcsd2_shutdown +} ; diff --git a/libogc/sdgecko_io.c b/libogc/sdgecko_io.c index 1f18ce0bd..7191da13e 100644 --- a/libogc/sdgecko_io.c +++ b/libogc/sdgecko_io.c @@ -1173,6 +1173,7 @@ static bool __card_check(s32 drv_no) #ifdef _CARDIO_DEBUG printf("__card_check(%d)\n",drv_no); #endif + if(drv_no==2) return TRUE; while((ret=EXI_ProbeEx(drv_no))==0); if(ret!=1) return FALSE; @@ -1311,7 +1312,7 @@ s32 sdgecko_readCID(s32 drv_no) { s32 ret; - if(drv_no=EXI_CHANNEL_2) return CARDIO_ERROR_NOCARD; + if(drv_no<0 || drv_no>=MAX_DRIVE) return CARDIO_ERROR_NOCARD; #ifdef _CARDIO_DEBUG printf("sdgecko_readCID(%d)\n",drv_no); #endif @@ -1460,7 +1461,7 @@ s32 sdgecko_doUnmount(s32 drv_no) exit: if(_ioCardInserted[drv_no]==TRUE) { _ioCardInserted[drv_no] = FALSE; - EXI_Detach(drv_no); + if(drv_no!=2) EXI_Detach(drv_no); } if(_ioRetryCB) return _ioRetryCB(drv_no); diff --git a/libogc/usbgecko.c b/libogc/usbgecko.c index cdac1bdf7..a918ea6c1 100644 --- a/libogc/usbgecko.c +++ b/libogc/usbgecko.c @@ -16,7 +16,7 @@ static u32 usbgecko_inited = 0; -static lwpq_t wait_exi_queue[2]; +static lwpq_t wait_exi_queue[3]; static s32 __usbgecko_exi_unlock(s32 chan,s32 dev) { @@ -28,7 +28,7 @@ static void __usbgecko_init(void) { u32 i; - for(i=0;i Date: Mon, 29 Jul 2019 23:27:41 -0400 Subject: [PATCH 2/3] Reduce R1 timeout. Remove ACMD42 on unmount. --- libogc/sdgecko_io.c | 57 +++++++++------------------------------------ 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/libogc/sdgecko_io.c b/libogc/sdgecko_io.c index 7191da13e..9dac9ed01 100644 --- a/libogc/sdgecko_io.c +++ b/libogc/sdgecko_io.c @@ -279,9 +279,8 @@ static void __exi_wait(s32 drv_no) static s32 __card_exthandler(s32 chn,s32 dev) { _ioCardInserted[chn] = FALSE; - sdgecko_doUnmount(chn); + _ioFlag[chn] = NOT_INITIALIZED; sdgecko_ejectedCB(chn); - EXI_Unlock(chn); return 1; } @@ -406,14 +405,11 @@ static s32 __card_writecmd(s32 drv_no,void *buf,s32 len) static s32 __card_readresponse(s32 drv_no,void *buf,s32 len) { u8 *ptr; - s32 startT,ret; + u32 cnt; + s32 ret; if(drv_no<0 || drv_no>=MAX_DRIVE) return CARDIO_ERROR_NOCARD; - ret = CARDIO_ERROR_READY; - ptr = buf; - *ptr = _ioClrFlag; - __exi_wait(drv_no); if(EXI_Select(drv_no,EXI_DEVICE_0,_ioCardFreq)==0) { @@ -421,17 +417,9 @@ static s32 __card_readresponse(s32 drv_no,void *buf,s32 len) return CARDIO_ERROR_NOCARD; } - if(EXI_ImmEx(drv_no,ptr,1,EXI_READWRITE)==0) { - EXI_Deselect(drv_no); - EXI_Unlock(drv_no); - return CARDIO_ERROR_IOERROR; - } -#ifdef _CARDIO_DEBUG - printf("sd response: %02x\n",((u8*)buf)[0]); -#endif - - startT = gettick(); - while(*ptr&0x80) { + ret = CARDIO_ERROR_READY; + ptr = buf; + for(cnt=0;cnt<16;cnt++) { *ptr = _ioClrFlag; if(EXI_ImmEx(drv_no,ptr,1,EXI_READWRITE)==0) { EXI_Deselect(drv_no); @@ -442,20 +430,8 @@ static s32 __card_readresponse(s32 drv_no,void *buf,s32 len) printf("sd response: %02x\n",((u8*)buf)[0]); #endif if(!(*ptr&0x80)) break; - if(__card_checktimeout(drv_no,startT,500)!=0) { - *ptr = _ioClrFlag; - if(EXI_ImmEx(drv_no,ptr,1,EXI_READWRITE)==0) { - EXI_Deselect(drv_no); - EXI_Unlock(drv_no); - return CARDIO_ERROR_IOERROR; - } -#ifdef _CARDIO_DEBUG - printf("sd response: %02x\n",((u8*)buf)[0]); -#endif - if(*ptr&0x80) ret = CARDIO_ERROR_IOTIMEOUT; - break; - } } + if(cnt>=16) ret = CARDIO_ERROR_IOTIMEOUT; if(len>1 && ret==CARDIO_ERROR_READY) { *(++ptr) = _ioClrFlag; if(EXI_ImmEx(drv_no,ptr,len-1,EXI_READWRITE)==0) ret = CARDIO_ERROR_IOERROR; @@ -1342,7 +1318,7 @@ s32 sdgecko_readStatus(s32 drv_no) if(drv_no<0 || drv_no>=MAX_DRIVE) return CARDIO_ERROR_NOCARD; #ifdef _CARDIO_DEBUG - printf("sdgecko_readCSD(%d)\n",drv_no); + printf("sdgecko_readStatus(%d)\n",drv_no); #endif ret = sdgecko_preIO(drv_no); if(ret!=0) return ret; @@ -1444,26 +1420,15 @@ s32 sdgecko_writeSectors(s32 drv_no,u32 sector_no,u32 num_sectors,const void *bu s32 sdgecko_doUnmount(s32 drv_no) { - s32 ret; - if(drv_no<0 || drv_no>=MAX_DRIVE) return CARDIO_ERROR_NOCARD; - - if(__card_check(drv_no)==TRUE && _ioFlag[drv_no]!=NOT_INITIALIZED) { - if((ret=__card_sendappcmd(drv_no))!=0) goto exit; - if((ret=__card_sendcmd(drv_no,0x2a,NULL))!=0) goto exit; - ret = __card_response1(drv_no); -#ifdef _CARDIO_DEBUG - printf("sdgecko_doUnmount(%d) disconnected 50KOhm pull-up(%d)\n",drv_no,ret); -#endif - } - _ioFlag[drv_no] = NOT_INITIALIZED; -exit: if(_ioCardInserted[drv_no]==TRUE) { _ioCardInserted[drv_no] = FALSE; + _ioFlag[drv_no] = NOT_INITIALIZED; if(drv_no!=2) EXI_Detach(drv_no); + sdgecko_ejectedCB(drv_no); } - if(_ioRetryCB) + if(_ioRetryCB) return _ioRetryCB(drv_no); return CARDIO_ERROR_READY; From 0d129bf62976b0cb53e4e5f1720e48cdef12ee52 Mon Sep 17 00:00:00 2001 From: emu_kidid Date: Wed, 18 Sep 2019 20:50:36 +0930 Subject: [PATCH 3/3] - Preserve original FEATURE_GAMECUBE_DVD order --- gc/ogc/disc_io.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gc/ogc/disc_io.h b/gc/ogc/disc_io.h index 7f5ce5735..e9d9dead1 100644 --- a/gc/ogc/disc_io.h +++ b/gc/ogc/disc_io.h @@ -38,8 +38,8 @@ #define FEATURE_MEDIUM_CANWRITE 0x00000002 #define FEATURE_GAMECUBE_SLOTA 0x00000010 #define FEATURE_GAMECUBE_SLOTB 0x00000020 -#define FEATURE_GAMECUBE_PORT2 0x00000040 -#define FEATURE_GAMECUBE_DVD 0x00000080 +#define FEATURE_GAMECUBE_DVD 0x00000040 +#define FEATURE_GAMECUBE_PORT2 0x00000080 #define FEATURE_WII_SD 0x00000100 #define FEATURE_WII_USB 0x00000200 #define FEATURE_WII_DVD 0x00000400