diff --git a/fel.c b/fel.c index 029210d..96c3076 100644 --- a/fel.c +++ b/fel.c @@ -1194,7 +1194,6 @@ int main(int argc, char **argv) argv += 1; } - feldev_init(); handle = feldev_open(busnum, devnum, AW_USB_VENDOR_ID, AW_USB_PRODUCT_ID); while (argc > 1 ) { diff --git a/fel_lib.c b/fel_lib.c index 0d46205..befcaf7 100644 --- a/fel_lib.c +++ b/fel_lib.c @@ -33,6 +33,7 @@ #define USB_TIMEOUT 10000 /* 10 seconds */ +static bool fel_lib_initialized = false; /* This is out 'private' data type that will be part of a "FEL device" handle */ struct _felusb_handle { @@ -315,6 +316,8 @@ void feldev_release(feldev_handle *dev) feldev_handle *feldev_open(int busnum, int devnum, uint16_t vendor_id, uint16_t product_id) { + if (!fel_lib_initialized) /* if not already done: auto-initialize */ + feldev_init(); feldev_handle *result = calloc(1, sizeof(feldev_handle)); if (!result) { fprintf(stderr, "FAILED to allocate feldev_handle memory.\n"); @@ -404,11 +407,12 @@ void feldev_init(void) int rc = libusb_init(NULL); if (rc != 0) usb_error(rc, "libusb_init()", 1); + fel_lib_initialized = true; } void feldev_done(feldev_handle *dev) { feldev_close(dev); free(dev); - libusb_exit(NULL); + if (fel_lib_initialized) libusb_exit(NULL); }