X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/62f25bae3cf25b35ecac593129e07f1b600dbe1a..17fd65391636a1e3e4bad18c53b75c31ec49f282:/hmcfgusb.c diff --git a/hmcfgusb.c b/hmcfgusb.c index 8261f13..01a50b7 100644 --- a/hmcfgusb.c +++ b/hmcfgusb.c @@ -311,6 +311,7 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) 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; @@ -319,6 +320,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) dev = malloc(sizeof(struct hmcfgusb_dev)); if (!dev) { perror("Can't allocate memory for hmcfgusb_dev"); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -331,6 +334,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) if (!cb_data) { perror("Can't allocate memory for hmcfgusb_cb_data"); free(dev); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -345,6 +350,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) fprintf(stderr, "Can't prepare async device io!\n"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -353,6 +360,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) fprintf(stderr, "Can't get FDset from libusb!\n"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -365,6 +374,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) perror("Can't allocate memory for poll-fds"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -497,6 +508,22 @@ void hmcfgusb_enter_bootloader(struct hmcfgusb_dev *dev) 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;