From 7300b6c68d30244218b53e1e249370f0845d8f35 Mon Sep 17 00:00:00 2001 From: uyjulian Date: Wed, 11 Aug 2021 02:13:42 -0500 Subject: [PATCH] Add dev9 external flash rom driver --- iop/memorycard/Makefile | 2 +- iop/memorycard/mcman/include/mcman.h | 3 + iop/memorycard/mcman/src/exports.tab | 62 +++++++++++ iop/memorycard/mcman/src/imports.lst | 12 ++ iop/memorycard/mcman/src/irx_imports.h | 3 + iop/memorycard/mcman/src/main.c | 42 +++++++ iop/memorycard/mcman/src/mcdev.c | 16 +++ iop/memorycard/mcman/src/mcman-internal.h | 12 ++ iop/memorycard/mcman/src/mcsio2.c | 123 ++++++++++++++++++++- iop/memorycard/mcman/src/sio2man_imports.h | 2 + iop/memorycard/xfromman/Makefile | 18 +++ 11 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 iop/memorycard/xfromman/Makefile diff --git a/iop/memorycard/Makefile b/iop/memorycard/Makefile index 14a14b3f9e7..bcce721059d 100644 --- a/iop/memorycard/Makefile +++ b/iop/memorycard/Makefile @@ -6,7 +6,7 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -SUBDIRS = mcman mcserv +SUBDIRS = mcman mcserv xfromman include $(PS2SDKSRC)/Defs.make include $(PS2SDKSRC)/Rules.make diff --git a/iop/memorycard/mcman/include/mcman.h b/iop/memorycard/mcman/include/mcman.h index 58937fc22e4..a9a302311a3 100644 --- a/iop/memorycard/mcman/include/mcman.h +++ b/iop/memorycard/mcman/include/mcman.h @@ -75,6 +75,9 @@ int McReadCluster(int port, int slot, int cluster, McCacheEntry **pmce); int McFlushCache(int port, int slot); int McSetDirEntryState(int port, int slot, int cluster, int fsindex, int flags); +#define xfromman_IMPORTS_start DECLARE_IMPORT_TABLE(xfromman, 2, 3) +#define xfromman_IMPORTS_end END_IMPORT_TABLE + #define mcman_IMPORTS_start DECLARE_IMPORT_TABLE(mcman, 1, 1) #define mcman_IMPORTS_end END_IMPORT_TABLE diff --git a/iop/memorycard/mcman/src/exports.tab b/iop/memorycard/mcman/src/exports.tab index 406eafb9505..07c8bf134f9 100644 --- a/iop/memorycard/mcman/src/exports.tab +++ b/iop/memorycard/mcman/src/exports.tab @@ -1,3 +1,5 @@ + +#ifndef BUILDING_XFROMMAN DECLARE_EXPORT_TABLE(mcman, 1, 1) DECLARE_EXPORT(_start) DECLARE_EXPORT(_dummy) @@ -54,5 +56,65 @@ DECLARE_EXPORT_TABLE(mcman, 1, 1) DECLARE_EXPORT(_dummy) DECLARE_EXPORT(_dummy) END_EXPORT_TABLE +#endif + +#ifdef BUILDING_XFROMMAN +DECLARE_EXPORT_TABLE(xfromman, 2, 3) + DECLARE_EXPORT(_start) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_start) + DECLARE_EXPORT(McDetectCard) + DECLARE_EXPORT(McOpen) + DECLARE_EXPORT(McClose) + DECLARE_EXPORT(McRead) + DECLARE_EXPORT(McWrite) + DECLARE_EXPORT(McSeek) + DECLARE_EXPORT(McFormat) + DECLARE_EXPORT(McGetDir) + DECLARE_EXPORT(McDelete) + DECLARE_EXPORT(McFlush) + DECLARE_EXPORT(McChDir) + DECLARE_EXPORT(McSetFileInfo) + DECLARE_EXPORT(McEraseBlock2) + DECLARE_EXPORT(McReadPage) + DECLARE_EXPORT(McWritePage) + DECLARE_EXPORT(McDataChecksum) + DECLARE_EXPORT(McDetectCard2) + DECLARE_EXPORT(McGetFormat) + DECLARE_EXPORT(McGetEntSpace) + DECLARE_EXPORT(McReplaceBadBlock) + DECLARE_EXPORT(McCloseAll) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(McReadPS1PDACard) + DECLARE_EXPORT(McWritePS1PDACard) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(McUnformat) + DECLARE_EXPORT(McRetOnly) + DECLARE_EXPORT(McGetFreeClusters) + DECLARE_EXPORT(McGetMcType) + DECLARE_EXPORT(McSetPS1CardFlag) + DECLARE_EXPORT(_dummy) + DECLARE_EXPORT(McGetModuleInfo) + DECLARE_EXPORT(McGetCardSpec) + DECLARE_EXPORT(McGetFATentry) + DECLARE_EXPORT(McCheckBlock) + DECLARE_EXPORT(McSetFATentry) + DECLARE_EXPORT(McReadDirEntry) + DECLARE_EXPORT(Mc1stCacheEntSetWrFlagOff) + DECLARE_EXPORT(McCreateDirentry) + DECLARE_EXPORT(McReadCluster) + DECLARE_EXPORT(McFlushCache) + DECLARE_EXPORT(McSetDirEntryState) + DECLARE_EXPORT(_dummy) +END_EXPORT_TABLE +#endif void _dummy() {} diff --git a/iop/memorycard/mcman/src/imports.lst b/iop/memorycard/mcman/src/imports.lst index aa8fc9278ff..77d64476f18 100644 --- a/iop/memorycard/mcman/src/imports.lst +++ b/iop/memorycard/mcman/src/imports.lst @@ -57,16 +57,28 @@ I_AddDrv I_DelDrv ioman_IMPORTS_end +#ifndef BUILDING_XFROMMAN secrman_IMPORTS_start I_SecrSetMcCommandHandler I_SecrSetMcDevIDHandler I_SecrAuthCard secrman_IMPORTS_end +#endif cdvdman_IMPORTS_start I_sceCdRC cdvdman_IMPORTS_end +#ifdef BUILDING_XFROMMAN +fls_IMPORTS_start +I_flash_detect +I_flash_get_info +I_flash_page_erase +I_flash_page_read +I_flash_page_write +fls_IMPORTS_end +#endif + stdio_IMPORTS_start I_printf stdio_IMPORTS_end diff --git a/iop/memorycard/mcman/src/irx_imports.h b/iop/memorycard/mcman/src/irx_imports.h index 8c4f476a056..d90b540b633 100644 --- a/iop/memorycard/mcman/src/irx_imports.h +++ b/iop/memorycard/mcman/src/irx_imports.h @@ -18,6 +18,9 @@ /* Please keep these in alphabetical order! */ #include +#ifdef BUILDING_XFROMMAN +#include +#endif #include #include #include diff --git a/iop/memorycard/mcman/src/main.c b/iop/memorycard/mcman/src/main.c index 0faa2f1f4e5..72b6ef91806 100644 --- a/iop/memorycard/mcman/src/main.c +++ b/iop/memorycard/mcman/src/main.c @@ -37,7 +37,12 @@ int PS1CardFlag = 1; union mcman_pagebuf mcman_pagebuf; union mcman_PS1PDApagebuf mcman_PS1PDApagebuf; +#ifndef BUILDING_XFROMMAN extern struct irx_export_table _exp_mcman; +#endif +#ifdef BUILDING_XFROMMAN +extern struct irx_export_table _exp_xfromman; +#endif extern u8 mcman_sio2outbufs_PS1PDA[0x90]; static u8 mcman_cachebuf[MAX_CACHEENTRY * MCMAN_CLUSTERSIZE]; @@ -63,8 +68,10 @@ MCDevInfo mcman_devinfos[4][MCMAN_MAXSLOT]; u8 mcman_eccdata[512]; // size for 32 ecc +#ifndef BUILDING_XFROMMAN int (*mcman_sio2transfer)(int port, int slot, sio2_transfer_data_t *sio2data); int (*mc_detectcard)(int port, int slot); +#endif // mcman xor table // clang-format off @@ -146,9 +153,11 @@ int mcman_chrpos(char *str, int chr) //-------------------------------------------------------------- int _start(int argc, const char **argv) { +#ifndef BUILDING_XFROMMAN iop_library_t *libptr; register int i, sio2man_loaded; void **export_tab; +#endif #ifdef SIO_DEBUG sio_init(38400, 0, 0, 0, 0); @@ -157,6 +166,7 @@ int _start(int argc, const char **argv) DPRINTF("mcman: _start...\n"); #endif +#ifndef BUILDING_XFROMMAN // Get sio2man lib ptr sio2man_loaded = 0; libptr = GetLoadcoreInternalData()->let_next; @@ -231,12 +241,19 @@ int _start(int argc, const char **argv) export_tab[51] = (void *)McFlushCache; export_tab[52] = (void *)McSetDirEntryState; } +#endif #ifdef DEBUG DPRINTF("mcman: registering exports...\n"); #endif +#ifndef BUILDING_XFROMMAN if (RegisterLibraryEntries(&_exp_mcman) != 0) return MODULE_NO_RESIDENT_END; +#endif +#ifdef BUILDING_XFROMMAN + if (RegisterLibraryEntries(&_exp_xfromman) != 0) + return MODULE_NO_RESIDENT_END; +#endif CpuEnableIntr(); @@ -490,7 +507,12 @@ int McCloseAll(void) // Export #25 XMCMAN only //-------------------------------------------------------------- int McDetectCard(int port, int slot) // Export #5 { +#ifndef BUILDING_XFROMMAN return mc_detectcard(port, slot); +#endif +#ifdef BUILDING_XFROMMAN + return mcman_detectcard(port, slot); +#endif } //-------------------------------------------------------------- @@ -504,6 +526,7 @@ int mcman_detectcard(int port, int slot) #endif mcdi = (MCDevInfo *)&mcman_devinfos[port][slot]; +#ifndef BUILDING_XFROMMAN if ((mcdi->cardtype == sceMcTypeNoCard) || (mcdi->cardtype == sceMcTypePS2)) { r = mcman_probePS2Card2(port, slot); if (r < -9) { @@ -553,6 +576,14 @@ int mcman_detectcard(int port, int slot) return sceMcResSucceed; } } +#endif +#ifdef BUILDING_XFROMMAN + r = mcman_probePS2Card2(port, slot); + if (r >= -9) { + mcdi->cardtype = sceMcTypePS2; + return r; + } +#endif mcdi->cardtype = 0; mcdi->cardform = 0; @@ -574,6 +605,7 @@ int McDetectCard2(int port, int slot) // Export #21 XMCMAN only mcdi = (MCDevInfo *)&mcman_devinfos[port][slot]; +#ifndef BUILDING_XFROMMAN if ((mcdi->cardtype == sceMcTypeNoCard) || (mcdi->cardtype == sceMcTypePS2)) { r = mcman_probePS2Card(port, slot); if (r < -9) { @@ -623,6 +655,14 @@ int McDetectCard2(int port, int slot) // Export #21 XMCMAN only return sceMcResSucceed; } } +#endif +#ifdef BUILDING_XFROMMAN + r = mcman_probePS2Card(port, slot); + if (r >= -9) { + mcdi->cardtype = sceMcTypePS2; + return r; + } +#endif mcdi->cardtype = 0; mcdi->cardform = 0; @@ -2529,8 +2569,10 @@ int mcman_setPS1devinfos(int port, int slot) if (r < 0) return -14; +#ifndef BUILDING_XFROMMAN if (mcman_sio2outbufs_PS1PDA[1] != 0) return -15; +#endif if (mcman_PS1PDApagebuf.byte[0] != 0x4d) return sceMcResNoFormat; diff --git a/iop/memorycard/mcman/src/mcdev.c b/iop/memorycard/mcman/src/mcdev.c index 932af18f54a..844a1271b7b 100644 --- a/iop/memorycard/mcman/src/mcdev.c +++ b/iop/memorycard/mcman/src/mcdev.c @@ -58,10 +58,20 @@ void *mcman_mcops[17] = { // driver descriptor static iop_device_t mcman_mcdev = { +#ifndef BUILDING_XFROMMAN "mc", +#endif +#ifdef BUILDING_XFROMMAN + "xfrom", +#endif IOP_DT_FS, 1, +#ifndef BUILDING_XFROMMAN "Memory Card", +#endif +#ifdef BUILDING_XFROMMAN + "External flash rom", +#endif (struct _iop_device_ops *)&mcman_mcops }; @@ -158,8 +168,14 @@ int mcman_modloadcb(char *filename, int *port, int *slot) //-------------------------------------------------------------- void mcman_unit2card(u32 unit) { +#ifndef BUILDING_XFROMMAN mcman_mc_port = unit & 1; mcman_mc_slot = (unit >> 1) & (MCMAN_MAXSLOT - 1); +#endif +#ifdef BUILDING_XFROMMAN + mcman_mc_port = 0; + mcman_mc_slot = 0; +#endif // original mcman/xmcman code below is silly and I doubt it // can support more than 2 units anyway... diff --git a/iop/memorycard/mcman/src/mcman-internal.h b/iop/memorycard/mcman/src/mcman-internal.h index 867465188b3..c579a68d33b 100644 --- a/iop/memorycard/mcman/src/mcman-internal.h +++ b/iop/memorycard/mcman/src/mcman-internal.h @@ -24,6 +24,9 @@ #include #include #include +#ifdef BUILDING_XFROMMAN +#include +#endif #include "sio2man_imports.h" #ifdef SIO_DEBUG @@ -34,7 +37,12 @@ #define DPRINTF(args...) printf(args) #endif +#ifndef BUILDING_XFROMMAN #define MODNAME "mcman_cex" +#endif +#ifdef BUILDING_XFROMMAN +#define MODNAME "xfromman" +#endif #define MODVER 0x20b typedef struct _MCCacheDir { @@ -89,8 +97,10 @@ typedef struct { // size = 48 #define MAX_FDHANDLES 3 // internal functions prototypes +#ifndef BUILDING_XFROMMAN int mcsio2_transfer(int port, int slot, sio2_transfer_data_t *sio2data); int mcsio2_transfer2(int port, int slot, sio2_transfer_data_t *sio2data); +#endif void long_multiply(u32 v1, u32 v2, u32 *HI, u32 *LO); int mcman_chrpos(char *str, int chr); void mcman_wmemset(void *buf, int size, int value); @@ -104,7 +114,9 @@ int mcman_dread(int fd, io_dirent_t *dirent); int mcman_getstat(int port, int slot, char *filename, io_stat_t *stat); int mcman_getmcrtime(sceMcStDateTime *time); void mcman_initPS2com(void); +#ifndef BUILDING_XFROMMAN void sio2packet_add(int port, int slot, int cmd, u8 *buf); +#endif int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf); int mcman_readpage(int port, int slot, int page, void *buf, void *eccbuf); int mcman_cardchanged(int port, int slot); diff --git a/iop/memorycard/mcman/src/mcsio2.c b/iop/memorycard/mcman/src/mcsio2.c index f4f41db309d..502ef92c937 100644 --- a/iop/memorycard/mcman/src/mcsio2.c +++ b/iop/memorycard/mcman/src/mcsio2.c @@ -15,6 +15,11 @@ extern int timer_ID; extern MCDevInfo mcman_devinfos[4][MCMAN_MAXSLOT]; +#ifdef BUILDING_XFROMMAN +static flash_info_t dev9_flash_info; +#endif + +#ifndef BUILDING_XFROMMAN static sio2_transfer_data_t mcman_sio2packet; // buffer for mcman sio2 packet static u8 mcman_wdmabufs[0x0b * 0x90]; // buffer array for SIO2 DMA I/O (write) static u8 mcman_rdmabufs[0x0b * 0x90]; // not sure here for size, buffer array for SIO2 DMA I/O (read) @@ -278,10 +283,12 @@ int mcsio2_transfer2(int port, int slot, sio2_transfer_data_t *sio2data) return r; } +#endif //-------------------------------------------------------------- void mcman_initPS2com(void) { +#ifndef BUILDING_XFROMMAN mcman_wmemset((void *)&mcman_sio2packet, sizeof (mcman_sio2packet), 0); mcman_sio2packet.port_ctrl1[2] = 0xff020405; @@ -305,11 +312,17 @@ void mcman_initPS2com(void) #endif SecrSetMcDevIDHandler((void *)mcman_getcnum); +#endif +#ifdef BUILDING_XFROMMAN + flash_detect(); + flash_get_info(&dev9_flash_info); +#endif } //-------------------------------------------------------------- void mcman_initPS1PDAcom(void) { +#ifndef BUILDING_XFROMMAN memset((void *)&mcman_sio2packet_PS1PDA, 0, sizeof (mcman_sio2packet_PS1PDA)); mcman_sio2packet_PS1PDA.port_ctrl1[0] = 0xffc00505; @@ -324,6 +337,7 @@ void mcman_initPS1PDAcom(void) mcman_sio2packet_PS1PDA.in = (u8 *)&mcman_sio2inbufs_PS1PDA; mcman_sio2packet_PS1PDA.out = (u8 *)&mcman_sio2outbufs_PS1PDA; +#endif } //-------------------------------------------------------------- @@ -335,7 +349,12 @@ int secrman_mc_command(int port, int slot, sio2_transfer_data_t *sio2data) DPRINTF("mcman: secrman_mc_command port%d slot%d\n", port, slot); #endif +#ifndef BUILDING_XFROMMAN r = mcman_sio2transfer(port, slot, sio2data); +#endif +#ifdef BUILDING_XFROMMAN + r = 0; +#endif return r; } @@ -343,6 +362,7 @@ int secrman_mc_command(int port, int slot, sio2_transfer_data_t *sio2data) //-------------------------------------------------------------- int mcman_cardchanged(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int retries; u8 *p = mcman_sio2packet.out_dma.addr; @@ -372,6 +392,7 @@ int mcman_cardchanged(int port, int slot) #ifdef DEBUG DPRINTF("mcman: mcman_cardchanged sio2cmd succeeded\n"); +#endif #endif return sceMcResSucceed; @@ -382,19 +403,24 @@ int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf { register int retries, size, ecc_offset; int page; +#ifndef BUILDING_XFROMMAN u8 *p = mcman_sio2packet.out_dma.addr; +#endif void *p_ecc; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; page = block * mcdi->blocksize; +#ifndef BUILDING_XFROMMAN sio2packet_add(port, slot, 0xffffffff, NULL); sio2packet_add(port, slot, 0x02, (u8 *)&page); sio2packet_add(port, slot, 0x0d, NULL); sio2packet_add(port, slot, 0xfffffffe, NULL); +#endif retries = 0; do { +#ifndef BUILDING_XFROMMAN mcman_sio2transfer(port, slot, &mcman_sio2packet); if (((mcman_sio2packet.stat6c & 0xF000) != 0x1000) || (p[8] != 0x5a)) @@ -402,6 +428,11 @@ int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf if (p[0x93] == p[8]) break; +#endif +#ifdef BUILDING_XFROMMAN + if (!flash_page_erase(&dev9_flash_info, page)) + break; +#endif } while (++retries < 5); if (retries >= 5) @@ -429,6 +460,7 @@ int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf } } +#ifndef BUILDING_XFROMMAN sio2packet_add(port, slot, 0xffffffff, NULL); sio2packet_add(port, slot, 0x1, NULL); sio2packet_add(port, slot, 0xfffffffe, NULL); @@ -446,6 +478,7 @@ int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf if (p[3] == 0x66) return sceMcResFailReplace; +#endif return sceMcResNoFormat; } @@ -453,15 +486,27 @@ int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf //-------------------------------------------------------------- int McWritePage(int port, int slot, int page, void *pagebuf, void *eccbuf) // Export #19 { - register int index, count, retries; + register int retries; +#ifndef BUILDING_XFROMMAN + register int index, count; u8 *p_pagebuf = (u8 *)pagebuf; u8 *p = mcman_sio2packet.out_dma.addr; +#endif +#ifdef BUILDING_XFROMMAN + char page_buf[528]; + memcpy(page_buf, pagebuf, 512); + memcpy(page_buf + 512, eccbuf, 16); +#endif + +#ifndef BUILDING_XFROMMAN count = (mcman_devinfos[port][slot].pagesize + 127) >> 7; +#endif retries = 0; do { +#ifndef BUILDING_XFROMMAN if (retries > 0) mcman_cardchanged(port, slot); @@ -510,20 +555,31 @@ int McWritePage(int port, int slot, int page, void *pagebuf, void *eccbuf) // Ex if (((mcman_sio2packet.stat6c & 0xF000) != 0x1000) || (p[3] != 0x5a)) continue; +#endif +#ifdef BUILDING_XFROMMAN + if (flash_page_write(&dev9_flash_info, page, page_buf)) + continue; +#endif return sceMcResSucceed; } while (++retries < 5); +#ifndef BUILDING_XFROMMAN if (p[3] == 0x66) return sceMcResFailReplace; return sceMcResNoFormat; +#endif +#ifdef BUILDING_XFROMMAN + return sceMcResFailReplace; +#endif } //-------------------------------------------------------------- int mcman_readpage(int port, int slot, int page, void *buf, void *eccbuf) { +#ifndef BUILDING_XFROMMAN register int index, count, retries, r, i; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; u8 *pbuf = (u8 *)buf; @@ -590,13 +646,31 @@ int mcman_readpage(int port, int slot, int page, void *buf, void *eccbuf) if (retries < 5) return sceMcResSucceed; +#endif +#ifdef BUILDING_XFROMMAN + // No retry logic here. + char page_buf[528]; + if (!flash_page_read(&dev9_flash_info, page, 1, page_buf)) + { + if (buf) + { + memcpy(buf, page_buf, 512); + } + if (eccbuf) + { + memcpy(eccbuf, page_buf + 512, 16); + } + return sceMcResSucceed; + } +#endif return sceMcResChangedCard; } //-------------------------------------------------------------- int McGetCardSpec(int port, int slot, s16 *pagesize, u16 *blocksize, int *cardsize, u8 *flags) { +#ifndef BUILDING_XFROMMAN register int retries, r; u8 *p = mcman_sio2packet.out_dma.addr; @@ -628,6 +702,17 @@ int McGetCardSpec(int port, int slot, s16 *pagesize, u16 *blocksize, int *cardsi *blocksize = (p[6] << 8) + p[5]; *cardsize = (p[8] << 8) + p[7] + (p[9] << 16) + (p[10] << 24); *flags = p[2]; +#endif +#ifdef BUILDING_XFROMMAN + flash_get_info(&dev9_flash_info); + *pagesize = dev9_flash_info.page_bytes; + *blocksize = dev9_flash_info.block_pages; + *cardsize = dev9_flash_info.blocks * dev9_flash_info.block_pages; + *flags = 43; + if ( *pagesize == 512 ) + *flags = 42; + *pagesize = 512; +#endif #ifdef DEBUG DPRINTF("mcman: McGetCardSpec sio2cmd pagesize=%d blocksize=%u cardsize=%d flags%x\n", *pagesize, *blocksize, *cardsize, *flags); @@ -639,6 +724,7 @@ int McGetCardSpec(int port, int slot, s16 *pagesize, u16 *blocksize, int *cardsi //-------------------------------------------------------------- int mcman_resetauth(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int retries; #ifdef DEBUG @@ -669,6 +755,7 @@ int mcman_resetauth(int port, int slot) #ifdef DEBUG DPRINTF("mcman: mcman_resetauth sio2cmd succeeded\n"); +#endif #endif return sceMcResSucceed; @@ -677,6 +764,7 @@ int mcman_resetauth(int port, int slot) //-------------------------------------------------------------- int mcman_probePS2Card2(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int retries, r; u8 *p = mcman_sio2packet.out_dma.addr; @@ -722,6 +810,17 @@ int mcman_probePS2Card2(int port, int slot) #ifdef DEBUG DPRINTF("mcman: mcman_probePS2Card2 sio2cmd failed (mc detection failed)\n"); #endif +#endif +#ifdef BUILDING_XFROMMAN + if (!McGetFormat(port, slot)) + { + mcman_probePS2Card(port, slot); + } + if (McGetFormat(port, slot) > 0) + return sceMcResSucceed; + if (McGetFormat(port, slot) < 0) + return sceMcResNoFormat; +#endif return sceMcResFailDetect2; } @@ -729,9 +828,12 @@ int mcman_probePS2Card2(int port, int slot) //-------------------------------------------------------------- int mcman_probePS2Card(int port, int slot) //2 { - register int retries, r; + register int r; register MCDevInfo *mcdi; +#ifndef BUILDING_XFROMMAN + register int retries; u8 *p = mcman_sio2packet.out_dma.addr; +#endif #ifdef DEBUG DPRINTF("mcman: mcman_probePS2Card sio2cmd port%d slot%d\n", port, slot); @@ -749,6 +851,7 @@ int mcman_probePS2Card(int port, int slot) //2 } } +#ifndef BUILDING_XFROMMAN if (mcman_resetauth(port, slot) != sceMcResSucceed) { #ifdef DEBUG DPRINTF("mcman: mcman_probePS2Card sio2cmd failed (auth reset failed)\n"); @@ -783,9 +886,11 @@ int mcman_probePS2Card(int port, int slot) //2 #endif return sceMcResFailDetect; } +#endif mcman_clearcache(port, slot); +#ifndef BUILDING_XFROMMAN sio2packet_add(port, slot, 0xffffffff, NULL); sio2packet_add(port, slot, 0x08, NULL); sio2packet_add(port, slot, 0xfffffffe, NULL); @@ -808,6 +913,7 @@ int mcman_probePS2Card(int port, int slot) //2 return sceMcResFailDetect2; } +#endif r = mcman_setdevinfos(port, slot); if (r == 0) { @@ -836,6 +942,7 @@ int mcman_probePS2Card(int port, int slot) //2 //-------------------------------------------------------------- int mcman_probePS1Card2(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int retries; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; @@ -885,6 +992,7 @@ int mcman_probePS1Card2(int port, int slot) else if (mcman_sio2outbufs_PS1PDA[1] != 8) { return -14; } +#endif return -13; } @@ -892,6 +1000,7 @@ int mcman_probePS1Card2(int port, int slot) //-------------------------------------------------------------- int mcman_probePS1Card(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int i, r, retries; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; u32 *p; @@ -958,11 +1067,16 @@ int mcman_probePS1Card(int port, int slot) mcdi->cardform = r; return r; +#endif +#ifdef BUILDING_XFROMMAN + return sceMcResSucceed; +#endif } //-------------------------------------------------------------- int mcman_probePDACard(int port, int slot) { +#ifndef BUILDING_XFROMMAN register int retries; #ifdef DEBUG @@ -989,6 +1103,7 @@ int mcman_probePDACard(int port, int slot) if (retries >= 5) return -11; +#endif return sceMcResSucceed; } @@ -996,6 +1111,7 @@ int mcman_probePDACard(int port, int slot) //-------------------------------------------------------------- int McWritePS1PDACard(int port, int slot, int page, void *buf) // Export #30 { +#ifndef BUILDING_XFROMMAN register int i, retries; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; u8 *p; @@ -1054,6 +1170,7 @@ int McWritePS1PDACard(int port, int slot, int page, void *buf) // Export #30 if ((mcman_sio2outbufs_PS1PDA[1] != 0) && (mcman_sio2outbufs_PS1PDA[1] != 8)) return sceMcResFullDevice; +#endif return sceMcResSucceed; } @@ -1061,6 +1178,7 @@ int McWritePS1PDACard(int port, int slot, int page, void *buf) // Export #30 //-------------------------------------------------------------- int McReadPS1PDACard(int port, int slot, int page, void *buf) // Export #29 { +#ifndef BUILDING_XFROMMAN register int i, retries; register MCDevInfo *mcdi = &mcman_devinfos[port][slot]; u8 *p; @@ -1122,6 +1240,7 @@ int McReadPS1PDACard(int port, int slot, int page, void *buf) // Export #29 if ((mcman_sio2outbufs_PS1PDA[1] != 0) && (mcman_sio2outbufs_PS1PDA[1] != 8)) return sceMcResDeniedPermit; +#endif return sceMcResSucceed; } diff --git a/iop/memorycard/mcman/src/sio2man_imports.h b/iop/memorycard/mcman/src/sio2man_imports.h index 75423b2887b..3d83fa29024 100644 --- a/iop/memorycard/mcman/src/sio2man_imports.h +++ b/iop/memorycard/mcman/src/sio2man_imports.h @@ -14,6 +14,7 @@ #else #define SIO2MAN_EXPORTS_EXTERN #endif +#ifndef BUILDING_XFROMMAN // sio2man exports /* 24 */ SIO2MAN_EXPORTS_EXTERN void (*psio2_mc_transfer_init)(void); /* 25 */ SIO2MAN_EXPORTS_EXTERN int (*psio2_transfer)(sio2_transfer_data_t *sio2data); @@ -21,5 +22,6 @@ // xsio2man exports /* 26 */ SIO2MAN_EXPORTS_EXTERN void (*psio2_transfer_reset)(void); /* 55/57 */ SIO2MAN_EXPORTS_EXTERN int (*psio2_mtap_change_slot)(s32 *arg); +#endif #endif diff --git a/iop/memorycard/xfromman/Makefile b/iop/memorycard/xfromman/Makefile new file mode 100644 index 00000000000..4f6022ec8fb --- /dev/null +++ b/iop/memorycard/xfromman/Makefile @@ -0,0 +1,18 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004, ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. + +IOP_SRC_DIR = $(PS2SDKSRC)/iop/memorycard/mcman/src/ +IOP_INC_DIR = $(PS2SDKSRC)/iop/memorycard/mcman/include/ + +IOP_BIN ?= xfromman.irx + +IOP_CFLAGS += -DBUILDING_XFROMMAN + +IOP_INCS += -I$(PS2SDKSRC)/iop/dev9/extflash/include + +include $(PS2SDKSRC)/iop/memorycard/mcman/Makefile