+} dev_cmd_t;
+
+typedef struct {
+ u8 firmware_ver[4];
+ u8 bootloader_ver[4];
+ char names[56];
+} dev_info_t;
+
+static void prepare_cmd(dev_cmd_t *dev_cmd, u8 cmd)
+{
+ memset(dev_cmd, 0, sizeof(*dev_cmd));
+
+ memcpy(dev_cmd->magic, "USBC", 4);
+ dev_cmd->magic2 = 0x67; /* "MySCSICommand" */
+ dev_cmd->mx_cmd = cmd;
+}
+
+static int write_cmd(struct usb_dev_handle *dev, dev_cmd_t *cmd)
+{
+ int ret = usb_bulk_write(dev, 0x03, (char *)cmd, sizeof(*cmd), 2000);
+ if (ret < 0) {
+ fprintf(stderr, "failed to write:\n");
+ fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
+ } else if (ret != sizeof(*cmd))
+ printf("write_cmd: wrote only %d of %d bytes\n", ret, sizeof(*cmd));
+
+ return ret;
+}
+
+static int read_response(struct usb_dev_handle *dev, void *buff, int size)
+{
+ int ret = usb_bulk_read(dev, 0x82, buff, size, 2000);
+ if (ret < 0) {
+ fprintf(stderr, "failed to read:\n");
+ fprintf(stderr, "%s (%d)\n", usb_strerror(), ret);
+ } else if (ret != size)
+ printf("read_response: read only %d of %d bytes\n", ret, size);