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,':');
ILOG("bus %03d dev %03d\n",devBus, devAddr);
}
- while (cnt--){
+ while (cnt--) {
libusb_get_device_descriptor( list[cnt], &desc );
if (desc.idVendor != USB_ST_VID)
continue;
- if (devBus && devAddr)
- if ((libusb_get_bus_number(list[cnt])!=devBus) || (libusb_get_device_address(list[cnt])!=devAddr))
+ if (devBus && devAddr) {
+ if ((libusb_get_bus_number(list[cnt]) != devBus)
+ || (libusb_get_device_address(list[cnt]) != devAddr)) {
continue;
-
- if ( (desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID) ) {
- if ((serial != NULL)) {
- struct libusb_device_handle *handle;
-
- libusb_open(list[cnt], &handle);
- sl->serial_size = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char *)sl->serial, sizeof(sl->serial));
- libusb_close(handle);
- if (sl->serial_size < 0)
- continue;
- else if (memcmp(serial, &sl->serial, sl->serial_size) == 0)
- break;
- } else {
- break;
}
}
+ if ((desc.idProduct == USB_STLINK_32L_PID) || (desc.idProduct == USB_STLINK_NUCLEO_PID)) {
+ struct libusb_device_handle *handle;
+
+ libusb_open(list[cnt], &handle);
+ sl->serial_size = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber,
+ (unsigned char *)sl->serial, sizeof(sl->serial));
+ libusb_close(handle);
+
+ if ((serial == NULL) || (*serial == 0))
+ break;
+
+ if (sl->serial_size < 0)
+ continue;
+
+ if (memcmp(serial, &sl->serial, sl->serial_size) == 0)
+ break;
+
+ continue;
+ }
+
if (desc.idProduct == USB_STLINK_PID) {
slu->protocoll = 1;
break;
}
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;
}
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;