Skip to content

Commit c4e40f0

Browse files
ExtremsWinterMute
authored andcommitted
More CARD corrections
(cherry picked from commit c2c2444)
1 parent 79e9f9d commit c4e40f0

2 files changed

Lines changed: 38 additions & 35 deletions

File tree

gc/ogc/card.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ distribution.
5050
/*! @} */
5151

5252

53-
#define CARD_WORKAREA (5*8*1024) /*!< minimum size of the workarea passed to Mount[Async]() */
53+
#define CARD_WORKAREA_SIZE (5*8*1024) /*!< minimum size of the workarea passed to Mount[Async]() */
5454
#define CARD_READSIZE 512 /*!< minimum size of block to read from memory card */
5555
#define CARD_FILENAMELEN 32 /*!< maximum filename length */
56-
#define CARD_MAXFILES 128 /*!< maximum number of files on the memory card */
56+
#define CARD_MAXFILES 127 /*!< maximum number of files on the memory card */
5757

5858
/*! \addtogroup card_errors Memory card error codes
5959
* @{
@@ -145,16 +145,16 @@ typedef struct _card_file {
145145
\param company[2] string identifier <=2.
146146
\param showall boolean flag whether to showall entries or ony those identified by card_gamecode and card_company, previously set within the call to CARD_Init()
147147
*/
148-
typedef struct _card_dir {
149-
s32 chn;
150-
u32 fileno;
151-
u32 filelen;
152-
u8 permissions;
153-
u8 filename[CARD_FILENAMELEN];
154-
u8 gamecode[4];
155-
u8 company[2];
156-
bool showall;
157-
} card_dir;
148+
typedef struct _card_dir {
149+
s32 chn;
150+
u32 fileno;
151+
u32 filelen;
152+
u8 permissions;
153+
char filename[CARD_FILENAMELEN];
154+
u8 gamecode[4];
155+
u8 company[2];
156+
bool showall;
157+
} card_dir;
158158

159159
/*! \typedef struct card_direntry
160160
\brief structure to hold the information of the save file entry ( aka GCI )
@@ -210,7 +210,7 @@ typedef struct _card_direntry {
210210
\param offset_data offset to additional data.
211211
*/
212212
typedef struct _card_stat {
213-
u8 filename[CARD_FILENAMELEN];
213+
char filename[CARD_FILENAMELEN];
214214
u32 len;
215215
u32 time; //time since 2000 in seconds
216216
u8 gamecode[4];

libogc/card.c

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ distribution.
4242
#include "cache.h"
4343
#include "dsp.h"
4444
#include "lwp.h"
45+
#include "lwp_watchdog.h"
4546
#include "exi.h"
4647
#include "card.h"
4748

@@ -82,7 +83,7 @@ struct card_bat {
8283
u16 updated;
8384
u16 freeblocks;
8485
u16 lastalloc;
85-
u16 fat[0xffc];
86+
u16 fat[0xffb];
8687
};
8788

8889
typedef struct _card_block {
@@ -198,7 +199,7 @@ static u32 card_latency[] =
198199
0x00000008,
199200
0x00000010,
200201
0x00000020,
201-
0x00000030,
202+
0x00000040,
202203
0x00000080,
203204
0x00000100,
204205
0x00000200
@@ -241,8 +242,8 @@ static vu16* const _viReg = (u16*)0xCC002000;
241242
static s32 __card_onreset(s32 final)
242243
{
243244
if(final==FALSE) {
244-
if(CARD_Unmount(CARD_SLOTA)==-1) return 0;
245-
if(CARD_Unmount(CARD_SLOTB)==-1) return 0;
245+
if(CARD_Unmount(CARD_SLOTA)==CARD_ERROR_BUSY) return 0;
246+
if(CARD_Unmount(CARD_SLOTB)==CARD_ERROR_BUSY) return 0;
246247
}
247248
return 1;
248249
}
@@ -509,7 +510,7 @@ static s32 __card_getfilenum(card_block *card,const char *filename,const char *g
509510
entries = dirblock->entries;
510511
for(i=0;i<CARD_MAXFILES;i++) {
511512
if(entries[i].gamecode[0]!=0xff) {
512-
if(strcmp(filename,(const char*)entries[i].filename)==0) {
513+
if(strncmp(filename,(const char*)entries[i].filename,CARD_FILENAMELEN)==0) {
513514
if((gamecode && gamecode[0]!=0xff && memcmp(entries[i].gamecode,gamecode,4)!=0)
514515
|| (company && company[0]!=0xff && memcmp(entries[i].company,company,2)!=0)) continue;
515516

@@ -550,7 +551,7 @@ static s32 __card_seek(card_file *file,s32 len,s32 offset,card_block **rcard)
550551
#endif
551552
if(entry->gamecode[0]!=0xff) {
552553
entry_len = entry->length*card->sector_size;
553-
if(entry_len<offset || entry_len<(offset+len)) {
554+
if(entry_len<=offset || entry_len<(offset+len)) {
554555
__card_putcntrlblock(card,CARD_ERROR_LIMIT);
555556
return CARD_ERROR_LIMIT;
556557
}
@@ -1017,9 +1018,9 @@ static void __setuptimeout(card_block *card)
10171018

10181019
if(card->cmd[0]==0xf1 || card->cmd[0]==0xf4) {
10191020
#ifdef _CARD_DEBUG
1020-
printf("__setuptimeout(%02x, %dsec)\n",card->cmd[0],1*(card->sector_size/8192));
1021+
printf("__setuptimeout(%02x, %dsec)\n",card->cmd[0],2*(card->sector_size/8192));
10211022
#endif
1022-
tb.tv_sec = 1*(card->sector_size/8192);
1023+
tb.tv_sec = 2*(card->sector_size/8192);
10231024
tb.tv_nsec = 0;
10241025
SYS_SetAlarm(card->timeout_svc,&tb,__timeouthandler,NULL);
10251026
} else if(card->cmd[0]==0xf2) {
@@ -1138,9 +1139,11 @@ static s32 __card_exthandler(s32 chn,s32 dev)
11381139
card = &cardmap[chn];
11391140

11401141
if(card->attached) {
1142+
#ifdef _CARD_DEBUG
11411143
if(card->card_tx_cb) {
11421144
printf("error: card->card_tx_cb!=NULL\n");
11431145
}
1146+
#endif
11441147
card->attached = 0;
11451148
EXI_RegisterEXICallback(chn,NULL);
11461149
SYS_CancelAlarm(card->timeout_svc);
@@ -1451,7 +1454,7 @@ static s32 __card_start(s32 chn,cardcallback tx_cb,cardcallback exi_cb)
14511454
_CPU_ISR_Restore(level);
14521455

14531456
#ifdef _CARD_DEBUG
1454-
printf("__card_start(done CARD_ERROR_READY)\n");
1457+
printf("__card_start(done CARD_ERROR_READY)\n");
14551458
#endif
14561459
return CARD_ERROR_READY;
14571460
}
@@ -1535,8 +1538,8 @@ static void __card_fatwritecallback(s32 chn,s32 result)
15351538
#endif
15361539
ret = result;
15371540
if(ret>=0) {
1538-
fat1 = (card->workarea+0x6000);
1539-
fat2 = (card->workarea+0x8000);
1541+
fat1 = (card->workarea+CARD_SYSBAT);
1542+
fat2 = (card->workarea+CARD_SYSBAT_BACK);
15401543
if(card->curr_fat==fat1) {
15411544
card->curr_fat = fat2;
15421545
memcpy(fat2,fat1,8192);
@@ -1567,8 +1570,8 @@ static void __card_dirwritecallback(s32 chn,s32 result)
15671570
#endif
15681571
ret = result;
15691572
if(ret>=0) {
1570-
dir1 = (card->workarea+0x2000);
1571-
dir2 = (card->workarea+0x4000);
1573+
dir1 = (card->workarea+CARD_SYSDIR);
1574+
dir2 = (card->workarea+CARD_SYSDIR_BACK);
15721575
if(card->curr_dir==dir1) {
15731576
card->curr_dir = dir2;
15741577
memcpy(dir2,dir1,8192);
@@ -1706,7 +1709,7 @@ static s32 __card_formatregion(s32 chn,u32 encode,cardcallback callback)
17061709
if(!cb) cb = __card_defaultapicallback;
17071710
card->card_api_cb = cb;
17081711

1709-
DCStoreRange(card->workarea,0xA000);
1712+
DCStoreRange(card->workarea,CARD_WORKAREA_SIZE);
17101713

17111714
card->format_step = 0;
17121715
if((ret=ogc_card_sectorerase(chn,(card->sector_size*card->format_step),__format_callback))>=0) return ret;
@@ -1986,10 +1989,10 @@ static s32 __card_domount(s32 chn)
19861989
EXI_RegisterEXICallback(chn,__card_exihandler);
19871990
EXI_Unlock(chn);
19881991

1989-
DCInvalidateRange(card->workarea,0xA000);
1992+
DCInvalidateRange(card->workarea,CARD_WORKAREA_SIZE);
19901993
}
19911994

1992-
if((ret=ogc_card_read(chn,(card->sector_size*(card->mount_step-2)),card->sector_size,card->workarea+((card->mount_step-2)<<13),__card_mountcallback))<0) goto exit;
1995+
if((ret=ogc_card_read(chn,(card->sector_size*(card->mount_step-2)),8192,card->workarea+((card->mount_step-2)<<13),__card_mountcallback))<0) goto exit;
19931996
return ret;
19941997

19951998
exit:
@@ -2388,7 +2391,7 @@ static s32 __dounlock(s32 chn,u32 *key)
23882391
cipher1[1] = e;
23892392
workarea[0] = (u32)cipher1;
23902393
workarea[1] = 8;
2391-
#ifdef HW_RVL
2394+
#if defined(HW_RVL)
23922395
workarea[2] = 0x10000000; // use MEM2 base
23932396
#else
23942397
workarea[2] = 0; // use ARAM base
@@ -2742,7 +2745,7 @@ s32 CARD_CreateEntryAsync(s32 chn,card_dir *direntry,card_file *file,cardcallbac
27422745
#ifdef _CARD_DEBUG
27432746
printf("CARD_CreateEntryAsync(%d,%p,%p,%p)\n",chn,direntry,file,callback);
27442747
#endif
2745-
len = strlen((const char*)direntry->filename);
2748+
len = strlen(direntry->filename);
27462749
if(len>CARD_FILENAMELEN) return CARD_ERROR_NAMETOOLONG;
27472750

27482751
if((ret=__card_getcntrlblock(chn,&card))<0) return ret;
@@ -2819,7 +2822,7 @@ s32 CARD_Open(s32 chn,const char *filename,card_file *file)
28192822
return ret;
28202823
}
28212824
dirblock = __card_getdirblock(card);
2822-
if(dirblock->entries[fileno].block<5 || dirblock->entries[fileno].block>=card->blocks) {
2825+
if(dirblock->entries[fileno].block<CARD_SYSAREA || dirblock->entries[fileno].block>=card->blocks) {
28232826
__card_putcntrlblock(card,CARD_ERROR_BROKEN);
28242827
return CARD_ERROR_BROKEN;
28252828
}
@@ -2843,19 +2846,19 @@ s32 CARD_OpenEntry(s32 chn,card_dir *entry,card_file *file)
28432846

28442847
file->filenum = -1;
28452848
if((ret=__card_getcntrlblock(chn,&card))<0) return ret;
2846-
if((ret=__card_getfilenum(card,(const char*)entry->filename,(const char*)entry->gamecode,(const char*)entry->company,&fileno))<0) {
2849+
if((ret=__card_getfilenum(card,entry->filename,(const char*)entry->gamecode,(const char*)entry->company,&fileno))<0) {
28472850
__card_putcntrlblock(card,ret);
28482851
return ret;
28492852
}
28502853

28512854
dirblock = __card_getdirblock(card);
2852-
if(dirblock->entries[fileno].block<5 || dirblock->entries[fileno].block>=card->blocks) {
2855+
if(dirblock->entries[fileno].block<CARD_SYSAREA || dirblock->entries[fileno].block>=card->blocks) {
28532856
__card_putcntrlblock(card,CARD_ERROR_BROKEN);
28542857
return CARD_ERROR_BROKEN;
28552858
}
28562859

28572860
file->chn = chn;
2858-
file->filenum = entry->fileno;
2861+
file->filenum = fileno;
28592862
file->offset = 0;
28602863
file->len = dirblock->entries[fileno].length*card->sector_size;
28612864
file->iblock = dirblock->entries[fileno].block;

0 commit comments

Comments
 (0)