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
26 #define CTL_DATA_BUS 0x55 /* refers to data bus controller */
27 #define CTL_ADDR_BUS 0xAA /* .. address bus .. */
39 u8 addrb2; /* most significant */
65 static void prepare_cmd(dev_cmd_t *dev_cmd, u8 cmd)
67 memset(dev_cmd, 0, sizeof(*dev_cmd));
69 memcpy(dev_cmd->magic, "USBC", 4);
70 dev_cmd->magic2 = 0x67; /* "MySCSICommand" */
71 dev_cmd->mx_cmd = cmd;
74 static int write_cmd(struct usb_dev_handle *dev, dev_cmd_t *cmd)
76 int ret = usb_bulk_write(dev, 0x03, (char *)cmd, sizeof(*cmd), 2000);
78 fprintf(stderr, "failed to write:\n");
79 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
80 } else if (ret != sizeof(*cmd))
81 printf("write_cmd: wrote only %d of %d bytes\n", ret, sizeof(*cmd));
86 static int read_response(struct usb_dev_handle *dev, void *buff, int size)
88 int ret = usb_bulk_read(dev, 0x82, buff, size, 2000);
90 fprintf(stderr, "failed to read:\n");
91 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
92 } else if (ret != size)
93 printf("read_response: read only %d of %d bytes\n", ret, size);
98 static usb_dev_handle *get_device(void)
100 struct usb_dev_handle *handle;
101 struct usb_device *dev;
105 ret = usb_find_busses();
107 fprintf(stderr, "Can't find USB busses\n");
111 ret = usb_find_devices();
113 fprintf(stderr, "Can't find USB devices\n");
117 bus = usb_get_busses();
118 for (; bus; bus = bus->next)
120 for (dev = bus->devices; dev; dev = dev->next)
122 for (i = 0; i < array_size(g_devices); i++)
124 if (dev->descriptor.idVendor == g_devices[i].vendor &&
125 dev->descriptor.idProduct == g_devices[i].product)
131 fprintf(stderr, "device not found.\n");
135 printf("found %s.\n", g_devices[i].name);
137 handle = usb_open(dev);
138 if (handle == NULL) {
139 fprintf(stderr, "failed to open device:\n");
140 fprintf(stderr, "%s\n", usb_strerror());
144 ret = usb_set_configuration(handle, 1);
146 fprintf(stderr, "couldn't set configuration for /*/bus/usb/%s/%s:\n",
147 bus->dirname, dev->filename);
148 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
152 ret = usb_claim_interface(handle, 0);
154 fprintf(stderr, "couldn't claim /*/bus/usb/%s/%s:\n",
155 bus->dirname, dev->filename);
156 fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
163 static int read_info(struct usb_dev_handle *device, u8 ctl_id)
169 prepare_cmd(&cmd, CMD_ATM_READY);
170 cmd.dev_info.which_device = ctl_id;
172 ret = write_cmd(device, &cmd);
176 ret = read_response(device, &info, sizeof(info));
180 printf("firmware version: %X.%X.%X%c\n", info.firmware_ver[0],
181 info.firmware_ver[1], info.firmware_ver[2], info.firmware_ver[3]);
182 printf("bootloader version: %X.%X.%X%c\n", info.bootloader_ver[0],
183 info.bootloader_ver[1], info.bootloader_ver[2], info.bootloader_ver[3]);
184 info.names[sizeof(info.names) - 1] = 0;
185 printf("device name: %s\n", info.names);
190 static void release_device(struct usb_dev_handle *device)
192 usb_release_interface(device, 0);
196 int main(int argc, char *argv[])
198 struct usb_dev_handle *device;
203 device = get_device();
207 printf("data bus controller:\n");
208 ret = read_info(device, CTL_DATA_BUS);
212 printf("address bus controller:\n");
213 ret = read_info(device, CTL_ADDR_BUS);
219 release_device(device);