]> git.zerfleddert.de Git - hmcfgusb/blobdiff - hmcfgusb.c
bump version to 0.091-git
[hmcfgusb] / hmcfgusb.c
index 8261f1302ee13bcf250240625d664c2e4c167b9c..01a50b773f88e0f4cb3892dcb91d86de2e637979 100644 (file)
@@ -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;
Impressum, Datenschutz