devh = hmcfgusb_find(ID_VENDOR, ID_PRODUCT_BL);
if (!devh) {
fprintf(stderr, "Can't find/open hmcfgusb!\n");
+ libusb_exit(NULL);
return NULL;
}
bootloader = 1;
dev = malloc(sizeof(struct hmcfgusb_dev));
if (!dev) {
perror("Can't allocate memory for hmcfgusb_dev");
+ libusb_close(devh);
+ libusb_exit(NULL);
return NULL;
}
if (!cb_data) {
perror("Can't allocate memory for hmcfgusb_cb_data");
free(dev);
+ libusb_close(devh);
+ libusb_exit(NULL);
return NULL;
}
fprintf(stderr, "Can't prepare async device io!\n");
free(dev);
free(cb_data);
+ libusb_close(devh);
+ libusb_exit(NULL);
return NULL;
}
fprintf(stderr, "Can't get FDset from libusb!\n");
free(dev);
free(cb_data);
+ libusb_close(devh);
+ libusb_exit(NULL);
return NULL;
}
perror("Can't allocate memory for poll-fds");
free(dev);
free(cb_data);
+ libusb_close(devh);
+ libusb_exit(NULL);
return NULL;
}
return;
}
+void hmcfgusb_leave_bootloader(struct hmcfgusb_dev *dev)
+{
+ uint8_t out[ASYNC_SIZE];
+
+ if (!dev->bootloader) {
+ fprintf(stderr, "request for leaving bootloader mode, but device already in normal mode!\n");
+ return;
+ }
+
+ memset(out, 0, sizeof(out));
+ out[0] = 'K';
+ hmcfgusb_send(dev, out, sizeof(out), 1);
+
+ return;
+}
+
void hmcfgusb_close(struct hmcfgusb_dev *dev)
{
int err;