X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstlink-usb.c;h=98654129eccdca57b5a20ebaca2b5d525f48d873;hb=refs%2Fheads%2Fdebian;hp=f3f41e37a9bcdfa196adaa1a555d9f39cdcb7762;hpb=6fe3a02c18ccfc8d5d9b15b6de1ac01f40fdaf33;p=fw%2Fstlink diff --git a/src/stlink-usb.c b/src/stlink-usb.c index f3f41e3..9865412 100644 --- a/src/stlink-usb.c +++ b/src/stlink-usb.c @@ -743,6 +743,10 @@ stlink_t *stlink_open_usb(enum ugly_loglevel verbose, bool reset, char serial[16 int devBus =0; int devAddr=0; + /* @TODO: Reading a environment variable in a usb open function is not very nice, this + should be refactored and moved into the CLI tools, and instead of giving USB_BUS:USB_ADDR a real stlink + serial string should be passed to this function. Probably people are using this but this is very odd because + as programmer can change to multiple busses and it is better to detect them based on serial. */ char *device = getenv("STLINK_DEVICE"); if (device) { char *c = strchr(device,':'); @@ -776,10 +780,12 @@ stlink_t *stlink_open_usb(enum ugly_loglevel verbose, bool reset, char serial[16 (unsigned char *)sl->serial, sizeof(sl->serial)); libusb_close(handle); - if (sl->serial_size < 0) - continue; - if (serial == NULL) + if ((serial == NULL) || (*serial == 0)) break; + + if (sl->serial_size < 0) + continue; + if (memcmp(serial, &sl->serial, sl->serial_size) == 0) break; @@ -830,7 +836,7 @@ stlink_t *stlink_open_usb(enum ugly_loglevel verbose, bool reset, char serial[16 } if (libusb_claim_interface(slu->usb_handle, 0)) { - WLOG("libusb_claim_interface() failed\n"); + WLOG("Stlink usb device found, but unable to claim (probably already in use?)\n"); goto on_libusb_error; } @@ -938,7 +944,11 @@ static size_t stlink_probe_usb_devs(libusb_device **devs, stlink_t **sldevs[]) { WLOG("failed to get libusb device descriptor\n"); break; } - libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial)); + + ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)&serial, sizeof(serial)); + if (ret < 0) + *serial = NULL; + libusb_close(handle); stlink_t *sl = NULL;