sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
mmceman.c
1#include <intrman.h>
2#include <stdio.h>
3#include <string.h>
4#include <sysclib.h>
5
6#include "ioplib.h"
7#include "irx_imports.h"
8
9#include "sio2man_hook.h"
10#include "mmce_sio2.h"
11#include "mmce_cmds.h"
12#include "mmce_fs.h"
13
14#include "module_debug.h"
15
16#define MAJOR 2
17#define MINOR 1
18
19const char *mmce_product_ids[] = {"Unknown", "SD2PSX", "MemCard PRO2", "PicoMemcard+", "PicoMemcardZero"};
20
21IRX_ID("mmceman", MAJOR, MINOR);
22
23static void mmce_init(int port)
24{
25 int res = -1;
26 int id = 0;
27
28 mmce_sio2_set_port(port);
29
30 for (int i = 0; i < 6; i++) {
31 res = mmce_cmd_ping();
32 if (res != -1) {
33 DPRINTF("Found card in port %i\n", port);
34
35 id = (res & 0xFF00) >> 8;
36 if (id < 5) {
37 DPRINTF("Product ID: %i (%s)\n", id, mmce_product_ids[id]);
38 } else {
39 DPRINTF("Unknown Product ID: %i\n", id);
40 }
41
42 DPRINTF("Revision ID: %i\n", (res & 0xFF));
43 DPRINTF("Protocol Version: %i\n", (res & 0xFF0000) >> 16);
44
45 DPRINTF("Resetting MMCE FS...");
46 res = mmce_cmd_reset();
47 if (res != 0)
48 DPRINTF("Failed: %i\n", res);
49 else
50 DPRINTF("Okay\n");
51
52 break;
53 }
54 }
55}
56
57int __start(int argc, char *argv[])
58{
59 int rv;
60
61 printf("Multipurpose Memory Card Emulator Manager (MMCEMAN) v%d.%d by the MMCE team\n", MAJOR, MINOR);
62
63 //Install hooks
64 rv = mmce_sio2_init();
65 if (rv != 0) {
66 DPRINTF("%s: mmce_sio2_init failed, rv %i\n", __func__, rv);
67 return MODULE_NO_RESIDENT_END;
68 }
69
70 //Try to init MMCE's on both ports
71 mmce_init(2);
72 mmce_init(3);
73
74 //Attach filesystem to iomanX
75 mmce_fs_register();
76
77 iop_library_t * lib_modload = ioplib_getByName("modload");
78 if (lib_modload != NULL) {
79 DPRINTF("modload 0x%x detected\n", lib_modload->version);
80 if (lib_modload->version > 0x102) //IOP is running a MODLOAD version which supports unloading IRX Modules
81 return MODULE_REMOVABLE_END; // and we do support getting unloaded...
82 } else {
83 DPRINTF("modload not detected! this is serious!\n");
84 }
85
86 return MODULE_RESIDENT_END;
87}
88
89int __stop(int argc, char *argv[])
90{
91 DPRINTF("Unloading module\n");
92
93 mmce_fs_unregister();
94 mmce_sio2_deinit();
95
96 return MODULE_NO_RESIDENT_END;
97}
98
99int _start(int argc, char *argv[])
100{
101 if (argc >= 0)
102 return __start(argc, argv);
103 else
104 return __stop(-argc, argv);
105}
iop_library_t * ioplib_getByName(const char *name)
get library object of any IRX Module
Definition ioplib.c:17