PS2SDK
PS2 Homebrew Libraries
mcman-internal.h
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # Copyright (c) 2009 jimmikaelkael
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
11 #ifndef __MCMAN_INTERNAL_H__
12 #define __MCMAN_INTERNAL_H__
13 
14 #ifndef MCMAN_ENABLE_EXTENDED_DEV_OPS
15 #if defined(BUILDING_VMCMAN)
16 #define MCMAN_ENABLE_EXTENDED_DEV_OPS 1
17 #else
18 #define MCMAN_ENABLE_EXTENDED_DEV_OPS 0
19 #endif
20 #endif
21 
22 #include <loadcore.h>
23 #include <intrman.h>
24 #include <sysclib.h>
25 #include <thbase.h>
26 #include <thsemap.h>
27 #if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
28 #include <timrman.h>
29 #include <modload.h>
30 #include <secrman.h>
31 #endif
32 #if MCMAN_ENABLE_EXTENDED_DEV_OPS
33 #include <iomanX.h>
34 #else
35 #include <ioman.h>
36 #endif
37 #ifdef _IOP
38 #include <cdvdman.h>
39 #else
40 #include <time.h>
41 #endif
42 #include <stdio.h>
43 #include <errno.h>
44 #ifndef BUILDING_VMCMAN
45 #ifdef BUILDING_XFROMMAN
46 #include <fls.h>
47 #else
48 #ifdef BUILDING_XMCMAN
49 #ifndef SIO2MAN_V2
50 #include <xsio2man.h>
51 #else
52 #include <rsio2man.h>
53 #endif
54 #else
55 #include <sio2man.h>
56 #endif
57 #endif
58 #endif
59 
60 #if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
61 #define MODNAME "mcman_cex"
62 #elif defined(BUILDING_VMCMAN)
63 #define MODNAME "vmcman"
64 #elif defined(BUILDING_XFROMMAN)
65 #define MODNAME "xfromman"
66 #elif defined(BUILDING_DONGLEMAN)
67 #define MODNAME "dongleman"
68 #endif
69 #define MODVER 0x20b
70 
71 #ifndef MCMAN_ENTRYPOINT
72 #ifdef _IOP
73 #define MCMAN_ENTRYPOINT _start
74 #else
75 #define MCMAN_ENTRYPOINT mcman_start
76 #endif
77 #endif
78 
79 #ifdef SIO_DEBUG
80  #include <sior.h>
81  #define DEBUG
82  #define DPRINTF(format, args...) \
83  sio_printf(MODNAME ": " format, ##args)
84 #else
85  #ifdef DEBUG
86  #define DPRINTF(format, args...) \
87  printf(MODNAME ": " format, ##args)
88  #else
89  #define DPRINTF(format, args...)
90  #endif
91 #endif
92 
93 typedef struct _MCCacheDir {
94  int cluster; // 0
95  int fsindex; // 4
96  int maxent; // 8
97  u32 unused;
98 } McCacheDir;
99 
100 // Card Flags
101 #define CF_USE_ECC 0x01
102 #define CF_BAD_BLOCK 0x08
103 #define CF_ERASE_ZEROES 0x10
104 
105 #ifdef BUILDING_VMCMAN
106 #define MCMAN_MAXSLOT 10
107 #else
108 #define MCMAN_MAXSLOT 4
109 #endif
110 #define MCMAN_CLUSTERSIZE 1024
111 #define MCMAN_CLUSTERFATENTRIES 256
112 
113 typedef struct _McFatCluster {
114  int entry[MCMAN_CLUSTERFATENTRIES];
115 } McFatCluster;
116 
117 #define MAX_CACHEENTRY 0x24
118 
119 typedef struct {
120  int entry[1 + (MCMAN_CLUSTERFATENTRIES * 2)];
121 } McFatCache;
122 
123 #define MAX_CACHEDIRENTRY 0x3
124 
125 typedef struct { // size = 48
126  u8 status; // 0
127  u8 wrflag; // 1
128  u8 rdflag; // 2
129  u8 unknown1; // 3
130  u8 drdflag; // 4
131  u8 unknown2; // 5
132  u16 port; // 6
133  u16 slot; // 8
134  u16 unknown3; // 10
135  u32 position; // 12
136  u32 filesize; // 16
137  u32 freeclink; // 20 link to next free cluster
138  u32 clink; // 24 link to next cluster
139  u32 clust_offset;// 28
140  u32 cluster; // 32
141  u32 fsindex; // 36
142  u32 parent_cluster; // 40
143  u32 parent_fsindex; // 44
144 } MC_FHANDLE;
145 
146 #define MAX_FDHANDLES 3
147 
148 #if MCMAN_ENABLE_EXTENDED_DEV_OPS
149 #define MC_IO_DEV_T iomanX_iop_device_t
150 #define MC_IO_FIL_T iomanX_iop_file_t
151 #define MC_IO_DRE_T iox_dirent_t
152 #define MC_IO_STA_T iox_stat_t
153 #define MC_IO_OPS_T iomanX_iop_device_ops_t
154 
155 // FIXME: The r/w/x flag order is opposite from iomanX
156 #define MC_IO_S_RD (FIO_S_IRUSR | FIO_S_IRGRP | FIO_S_IROTH)
157 #define MC_IO_S_WR (FIO_S_IWUSR | FIO_S_IWGRP | FIO_S_IWOTH)
158 #define MC_IO_S_EX (FIO_S_IXUSR | FIO_S_IXGRP | FIO_S_IXOTH)
159 #define MC_IO_S_FL FIO_S_IFREG
160 #define MC_IO_S_DR FIO_S_IFDIR
161 
162 #define MC_IO_CST_ATTR FIO_CST_ATTR
163 #define MC_IO_CST_MODE FIO_CST_MODE
164 #define MC_IO_CST_CT FIO_CST_CT
165 #define MC_IO_CST_MT FIO_CST_MT
166 #else
167 #define MC_IO_DEV_T iop_device_t
168 #define MC_IO_FIL_T iop_file_t
169 #define MC_IO_DRE_T io_dirent_t
170 #define MC_IO_STA_T io_stat_t
171 #define MC_IO_OPS_T iop_device_ops_t
172 
173 #define MC_IO_S_RD SCE_STM_R
174 #define MC_IO_S_WR SCE_STM_W
175 #define MC_IO_S_EX SCE_STM_X
176 #define MC_IO_S_FL SCE_STM_F
177 #define MC_IO_S_DR SCE_STM_D
178 
179 #define MC_IO_CST_ATTR SCE_CST_ATTR
180 #define MC_IO_CST_MODE SCE_CST_MODE
181 #define MC_IO_CST_CT SCE_CST_CT
182 #define MC_IO_CST_MT SCE_CST_MT
183 #endif
184 
185 // internal functions prototypes
186 #if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
187 extern int mcsio2_transfer(int port, int slot, sio2_transfer_data_t *sio2data);
188 #endif
189 extern void long_multiply(u32 v1, u32 v2, u32 *HI, u32 *LO);
190 extern int mcman_chrpos(const char *str, int chr);
191 extern void mcman_wmemset(void *buf, int size, int value);
192 extern int mcman_calcEDC(void *buf, int size);
193 extern int mcman_checkpath(const char *str);
194 extern int mcman_checkdirpath(const char *str1, const char *str2);
195 extern void mcman_invhandles(int port, int slot);
196 extern int McCloseAll(void);
197 extern int mcman_detectcard(int port, int slot);
198 extern int mcman_dread(int fd, MC_IO_DRE_T *dirent);
199 extern int mcman_getstat(int port, int slot, const char *filename, MC_IO_STA_T *stat);
200 extern int mcman_getmcrtime(sceMcStDateTime *tm);
201 extern void mcman_initPS2com(void);
202 extern void mcman_deinitPS2com(void);
203 #if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
204 extern void sio2packet_add(int port, int slot, int cmd, u8 *buf);
205 #endif
206 extern int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf);
207 extern int mcman_readpage(int port, int slot, int page, void *buf, void *eccbuf);
208 extern int mcman_cardchanged(int port, int slot);
209 extern int mcman_resetauth(int port, int slot);
210 extern int mcman_probePS2Card2(int port, int slot);
211 extern int mcman_probePS2Card(int port, int slot);
212 #if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
213 extern int secrman_mc_command(int port, int slot, sio2_transfer_data_t *sio2data);
214 #endif
215 extern int mcman_getcnum (int port, int slot);
216 extern int mcman_correctdata(void *buf, void *ecc);
217 extern int mcman_sparesize(int port, int slot);
218 extern int mcman_setdevspec(int port, int slot);
219 extern int mcman_reportBadBlocks(int port, int slot);
220 extern int mcman_setdevinfos(int port, int slot);
221 extern int mcman_format2(int port, int slot);
222 extern int mcman_fatRseek(int fd);
223 extern int mcman_fatWseek(int fd);
224 extern int mcman_findfree2(int port, int slot, int reserve);
225 extern int mcman_dread2(int fd, MC_IO_DRE_T *dirent);
226 extern int mcman_getstat2(int port, int slot, const char *filename, MC_IO_STA_T *stat);
227 extern int mcman_setinfo2(int port, int slot, const char *filename, sceMcTblGetDir *info, int flags);
228 extern int mcman_read2(int fd, void *buffer, int nbyte);
229 extern int mcman_write2(int fd, void *buffer, int nbyte);
230 extern int mcman_close2(int fd);
231 extern int mcman_getentspace(int port, int slot, const char *dirname);
232 extern int mcman_cachedirentry(int port, int slot, const char *filename, McCacheDir *pcacheDir, McFsEntry **pfse, int unknown_flag);
233 extern int mcman_getdirinfo(int port, int slot, McFsEntry *pfse, const char *filename, McCacheDir *pcd, int unknown_flag);
234 extern int mcman_open2(int port, int slot, const char *filename, int flags);
235 extern int mcman_chdir(int port, int slot, const char *newdir, char *currentdir);
236 extern int mcman_writecluster(int port, int slot, int cluster, int flag);
237 extern int mcman_getdir2(int port, int slot, const char *dirname, int flags, int maxent, sceMcTblGetDir *info);
238 extern int mcman_delete2(int port, int slot, const char *filename, int flags);
239 extern int mcman_checkBackupBlocks(int port, int slot);
240 extern int mcman_unformat2(int port, int slot);
241 extern void mcman_initPS1PDAcom(void);
242 extern void mcman_deinitPS1PDAcom(void);
243 extern int mcman_probePS1Card2(int port, int slot);
244 extern int mcman_probePS1Card(int port, int slot);
245 extern int mcman_probePDACard(int port, int slot);
246 extern int mcman_setPS1devinfos(int port, int slot);
247 extern int mcman_format1(int port, int slot);
248 extern int mcman_open1(int port, int slot, const char *filename, int flags);
249 extern int mcman_read1(int fd, void *buffer, int nbyte);
250 extern int mcman_write1(int fd, void *buffer, int nbyte);
251 extern int mcman_getPS1direntry(int port, int slot, const char *filename, McFsEntryPS1 **pfse, int flag);
252 extern int mcman_dread1(int fd, MC_IO_DRE_T *dirent);
253 extern int mcman_getstat1(int port, int slot, const char *filename, MC_IO_STA_T *stat);
254 extern int mcman_setinfo1(int port, int slot, const char *filename, sceMcTblGetDir *info, int flags);
255 extern int mcman_getdir1(int port, int slot, const char *dirname, int flags, int maxent, sceMcTblGetDir *info);
256 extern int mcman_clearPS1direntry(int port, int slot, int cluster, int flags);
257 extern int mcman_delete1(int port, int slot, const char *filename, int flags);
258 extern int mcman_close1(int fd);
259 extern int mcman_findfree1(int port, int slot, int reserve);
260 extern int mcman_fatRseekPS1(int fd);
261 extern int mcman_fatWseekPS1(int fd);
262 extern int mcman_FNC8ca4(int port, int slot, MC_FHANDLE *fh);
263 extern int mcman_PS1pagetest(int port, int slot, int page);
264 extern int mcman_unformat1(int port, int slot);
265 extern int mcman_cachePS1dirs(int port, int slot);
266 extern int mcman_fillPS1backuparea(int port, int slot, int block);
267 extern void mcman_initcache(void);
268 extern int mcman_clearcache(int port, int slot);
269 extern McCacheEntry *mcman_getcacheentry(int port, int slot, int cluster);
270 extern void mcman_freecluster(int port, int slot, int cluster);
271 extern int mcman_getFATindex(int port, int slot, int num);
272 extern McCacheEntry *mcman_get1stcacheEntp(void);
273 extern void mcman_addcacheentry(McCacheEntry *mce);
274 extern int mcman_flushcacheentry(McCacheEntry *mce);
275 extern int mcman_readdirentryPS1(int port, int slot, int cluster, McFsEntryPS1 **pfse);
276 extern int mcman_readclusterPS1(int port, int slot, int cluster, McCacheEntry **pmce);
277 extern int mcman_replaceBackupBlock(int port, int slot, int block);
278 extern int mcman_fillbackupblock1(int port, int slot, int block, void **pagedata, void *eccdata);
279 extern int mcman_clearsuperblock(int port, int slot);
280 extern int mcman_ioerrcode(int errcode);
281 extern int mcman_modloadcb(const char *filename, int *port, int *slot); // used as callback by modload
282 extern void mcman_unit2card(u32 unit);
283 extern int mcman_initdev(void);
284 extern void mcman_deinitdev(void);
285 
286 #if defined(BUILDING_VMCMAN)
287 extern int mcman_iomanx_backing_mount(int port, int slot, const char *filename);
288 extern int mcman_iomanx_backing_umount(int port, int slot);
289 extern int mcman_iomanx_backing_getcardspec(int port, int slot, s16 *pagesize, u16 *blocksize, int *cardsize, u8 *flags);
290 extern int mcman_iomanx_backing_erase(int port, int slot, int page);
291 extern int mcman_iomanx_backing_write(int port, int slot, int page, void *pagebuf, void *eccbuf);
292 extern int mcman_iomanx_backing_read(int port, int slot, int page, void *pagebuf, void *eccbuf);
293 #endif
294 
295 typedef struct { // size = 384
296  char magic[28]; // Superblock magic, on PS2 MC : "Sony PS2 Memory Card Format "
297  u8 version[12]; // Version number of the format used, 1.2 indicates full support for bad_block_list
298  s16 pagesize; // size in bytes of a memory card page
299  u16 pages_per_cluster; // number of pages in a cluster
300  u16 blocksize; // number of pages in an erase block
301  u16 unused; // unused
302  u32 clusters_per_card; // total size in clusters of the memory card
303  u32 alloc_offset; // Cluster offset of the first allocatable cluster. Cluster values in the FAT and directory entries are relative to this. This is the cluster immediately after the FAT
304  u32 alloc_end; // The cluster after the highest allocatable cluster. Relative to alloc_offset. Not used
305  u32 rootdir_cluster; // First cluster of the root directory. Relative to alloc_offset. Must be zero
306  u32 backup_block1; // Erase block used as a backup area during programming. Normally the the last block on the card, it may have a different value if that block was found to be bad
307  u32 backup_block2; // This block should be erased to all ones. Normally the the second last block on the card
308  u8 unused2[8];
309  u32 ifc_list[32]; // List of indirect FAT clusters. On a standard 8M card there's only one indirect FAT cluster
310  int bad_block_list[32]; // List of erase blocks that have errors and shouldn't be used
311  u8 cardtype; // Memory card type. Must be 2, indicating that this is a PS2 memory card
312  u8 cardflags; // Physical characteristics of the memory card
313  u16 unused3;
314  u32 cluster_size;
315  u32 FATentries_per_cluster;
316  u32 clusters_per_block;
317  int cardform;
318  u32 rootdir_cluster2;
319  u32 unknown1;
320  u32 unknown2;
321  u32 max_allocatable_clusters;
322  u32 unknown3;
323  u32 unknown4;
324  int unknown5;
325 } MCDevInfo;
326 
328  u32 word[1056/sizeof(u32)];
329  u8 byte[1056/sizeof(u8)];
330  char magic[1056/sizeof(char)];
331 };
332 
334  u32 word[128/sizeof(u32)];
335  u16 half[128/sizeof(u16)];
336  u8 byte[128/sizeof(u8)];
337 };
338 
339 // Defined in main.c
340 
341 extern char SUPERBLOCK_MAGIC[];
342 extern char SUPERBLOCK_VERSION[];
343 
344 extern int mcman_wr_port;
345 extern int mcman_wr_slot;
346 extern int mcman_wr_block;
347 extern int mcman_wr_flag3;
348 extern int mcman_curdircluster;
349 
350 extern union mcman_pagebuf mcman_pagebuf;
352 
353 #ifndef BUILDING_XFROMMAN
354 extern int timer_ID;
355 #endif
356 extern int PS1CardFlag;
357 
358 extern McFsEntry mcman_dircache[MAX_CACHEDIRENTRY];
359 
360 extern MC_FHANDLE mcman_fdhandles[MAX_FDHANDLES];
361 extern MCDevInfo mcman_devinfos[4][MCMAN_MAXSLOT];
362 
363 extern u8 mcman_eccdata[512]; // size for 32 ecc
364 
365 // Defined in mcsio2.c
366 extern u8 mcman_sio2outbufs_PS1PDA[0x90];
367 
368 #ifdef BUILDING_DONGLEMAN
369 extern int sema_hakama_id;
371 #define HAKAMA_SIGNALSEMA() //SignalSema(sema_hakama_id)
372 #define HAKAMA_WAITSEMA() //WaitSema(sema_hakama_id)
373 #else
374 #define HAKAMA_SIGNALSEMA() //while(0) {} /* SignalSema wrapper for an additional semaphore used by arcade MCMAN */
375 #define HAKAMA_WAITSEMA() //while(0) {} /* WaitSema wrapper for an additional semaphore used by arcade MCMAN */
376 #endif
377 
378 #endif // __MCMAN_INTERNAL_H__
iomanX.h
_MCCacheDir
Definition: mcman-internal.h:93
sior.h
xsio2man.h
McFsEntryPS1
Definition: libmc-common.h:34
thbase.h
sysclib.h
s_info
Definition: xprintf.c:78
mcman_pagebuf
Definition: mcman-internal.h:327
loadcore.h
timrman.h
sio2man.h
_sceMcTblGetDir
Definition: libmc.h:138
cdvdman.h
fls.h
_MCCacheEntry
Definition: libmc-common.h:69
thsemap.h
time.h
stdio.h
_McFatCluster
Definition: mcman-internal.h:113
ioman.h
rsio2man.h
McFatCache
Definition: mcman-internal.h:119
sio2_transfer_data_t
Definition: sio2man.h:33
MC_FHANDLE
Definition: mcman-internal.h:125
mcman_PS1PDApagebuf
Definition: mcman-internal.h:333
_sceMcStDateTime
Definition: libmc-common.h:22
intrman.h
MCDevInfo
Definition: mcman-internal.h:295
McFsEntry
Definition: libmc-common.h:54
modload.h
errno.h
secrman.h
version
unsigned int version
Definition: fileXio.h:5