6 typedef unsigned char u8;
7 typedef unsigned short u16;
8 typedef unsigned int u32;
9 #define array_size(x) (sizeof(x) / sizeof(x[0]))
12 unsigned short vendor;
13 unsigned short product;
16 { 0x03eb, 0x202a, "16MX+U Game Device" },
17 { 0x03eb, 0x202b, "32MX+U Game Device" },
18 { 0x03eb, 0x202c, "16MX+US Game Device" },
19 { 0x03eb, 0x202d, "32MX+UF Game Device" },
22 /*****************************************************************************/
24 #define CMD_ATM_READY 0x22
25 #define CMD_SEC_GET_NAME 'G' /* read filename */
28 #define CTL_DATA_BUS 0x55
29 #define CTL_ADDR_BUS 0xAA
31 #define FILENAME_ROM0 0
32 #define FILENAME_ROM1 1
33 #define FILENAME_RAM 2
45 u8 addrb2; /* most significant */
71 static void prepare_cmd(dev_cmd_t *dev_cmd, u8 cmd)
73 memset(dev_cmd, 0, sizeof(*dev_cmd));
75 memcpy(dev_cmd->magic, "USBC", 4);
76 dev_cmd->magic2 = 0x67; /* MySCSICommand, EXCOMMAND */
77 dev_cmd->mx_cmd = cmd;
80 static int write_cmd(struct usb_dev_handle *dev, dev_cmd_t *cmd)
82 int ret = usb_bulk_write(dev, 0x03, (char *)cmd, sizeof(*cmd), 2000);
84 fprintf(stderr, "failed to write:\n");
85 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
86 } else if (ret != sizeof(*cmd))
87 printf("write_cmd: wrote only %d of %d bytes\n", ret, sizeof(*cmd));
92 static int read_response(struct usb_dev_handle *dev, void *buff, int size)
94 int ret = usb_bulk_read(dev, 0x82, buff, size, 2000);
96 fprintf(stderr, "failed to read:\n");
97 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
98 } else if (ret != size)
99 printf("read_response: read only %d of %d bytes\n", ret, size);
104 static int read_info(struct usb_dev_handle *device, u8 ctl_id)
110 prepare_cmd(&cmd, CMD_ATM_READY);
111 cmd.dev_info.which_device = ctl_id;
112 memset(&info, 0, sizeof(info));
114 ret = write_cmd(device, &cmd);
118 ret = read_response(device, &info, sizeof(info));
122 printf(" firmware version: %X.%X.%X%c\n", info.firmware_ver[0],
123 info.firmware_ver[1], info.firmware_ver[2], info.firmware_ver[3]);
124 printf(" bootloader version: %X.%X.%X%c\n", info.bootloader_ver[0],
125 info.bootloader_ver[1], info.bootloader_ver[2], info.bootloader_ver[3]);
126 info.names[sizeof(info.names) - 1] = 0;
127 printf(" device name: %s\n", info.names);
132 static int get_filename(struct usb_dev_handle *dev, char *dst, int len, u8 which)
138 prepare_cmd(&cmd, CMD_SEC_GET_NAME);
139 cmd.filename.which = which;
140 memset(buff, 0, sizeof(buff));
142 ret = write_cmd(dev, &cmd);
146 ret = read_response(dev, buff, 64);
150 strncpy(dst, buff, len);
156 static usb_dev_handle *get_device(void)
158 struct usb_dev_handle *handle;
159 struct usb_device *dev;
163 ret = usb_find_busses();
165 fprintf(stderr, "Can't find USB busses\n");
169 ret = usb_find_devices();
171 fprintf(stderr, "Can't find USB devices\n");
175 bus = usb_get_busses();
176 for (; bus; bus = bus->next)
178 for (dev = bus->devices; dev; dev = dev->next)
180 for (i = 0; i < array_size(g_devices); i++)
182 if (dev->descriptor.idVendor == g_devices[i].vendor &&
183 dev->descriptor.idProduct == g_devices[i].product)
189 fprintf(stderr, "device not found.\n");
193 printf("found %s.\n", g_devices[i].name);
195 handle = usb_open(dev);
196 if (handle == NULL) {
197 fprintf(stderr, "failed to open device:\n");
198 fprintf(stderr, "%s\n", usb_strerror());
202 ret = usb_set_configuration(handle, 1);
204 fprintf(stderr, "couldn't set configuration for /*/bus/usb/%s/%s:\n",
205 bus->dirname, dev->filename);
206 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
210 ret = usb_claim_interface(handle, 0);
212 fprintf(stderr, "couldn't claim /*/bus/usb/%s/%s:\n",
213 bus->dirname, dev->filename);
214 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
221 static void release_device(struct usb_dev_handle *device)
223 usb_release_interface(device, 0);
227 int main(int argc, char *argv[])
229 struct usb_dev_handle *device;
235 device = get_device();
239 printf("data bus controller:\n");
240 ret = read_info(device, CTL_DATA_BUS);
244 printf("address bus controller:\n");
245 ret = read_info(device, CTL_ADDR_BUS);
249 ret = get_filename(device, fname, sizeof(fname), FILENAME_ROM0);
252 printf("ROM filename: %s\n", fname);
254 ret = get_filename(device, fname, sizeof(fname), FILENAME_RAM);
257 printf("SRAM filename: %s\n", fname);
262 release_device(device);