X-Git-Url: http://git.linex4red.de/pub/pl2303-ft232-gpio.git/blobdiff_plain/5d1beba18b908012a40fa82bc61697c1a38e8239..refs/heads/master:/usb.c diff --git a/usb.c b/usb.c index 92ebde9..ad9a09c 100644 --- a/usb.c +++ b/usb.c @@ -1,97 +1,79 @@ - #include #include #include #include -#include #include -static int did_usb_init = 0; - -static int usb_get_string_ascii(usb_dev_handle *dev, int index, int langid, char *buf, int buflen) -{ - char buffer[256]; - int rval, i; - - if((rval = usb_control_msg(dev, - USB_ENDPOINT_IN, - USB_REQ_GET_DESCRIPTOR, - (USB_DT_STRING << 8) + index, - langid, buffer, sizeof(buffer), - 1000)) < 0) - return rval; - if(buffer[1] != USB_DT_STRING) - return 0; - if((unsigned char)buffer[0] < rval) - rval = (unsigned char)buffer[0]; - rval /= 2; - /* lossy conversion to ISO Latin1 */ - for(i=1; i buflen) /* destination buffer overflow */ - break; - buf[i-1] = buffer[2 * i]; - if(buffer[2 * i + 1] != 0) /* outside of ISO Latin1 range */ - buf[i-1] = '?'; - } - buf[i-1] = 0; - return i-1; -} -int usb_match_string(usb_dev_handle *handle, int index, char* string) +static int ncusb_match_string(libusb_device_handle *dev, int index, const char* string) { - char tmp[256]; + unsigned char tmp[256]; + libusb_get_string_descriptor_ascii(dev, index, tmp, 256); if (string == NULL) return 1; /* NULL matches anything */ - usb_get_string_ascii(handle, index, 0x409, tmp, 256); - return (strcmp(string,tmp)==0); + return (strcmp(string, (char*) tmp)==0); } -usb_dev_handle *usb_check_device(struct usb_device *dev, - char *vendor_name, - char *product_name, - char *serial) + +struct libusb_device_handle *ncusb_find_and_open(struct libusb_context *ctx, + int vendor, int product, + const char *vendor_name, + const char *product_name, + const char *serial) { - usb_dev_handle *handle = usb_open(dev); - if(!handle) { - fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror()); + libusb_device_handle *found = NULL; + libusb_device **list; + ssize_t cnt = libusb_get_device_list(ctx, &list); + ssize_t i = 0; + + if (cnt < 0){ return NULL; } - if ( - usb_match_string(handle, dev->descriptor.iManufacturer, vendor_name) && - usb_match_string(handle, dev->descriptor.iProduct, product_name) && - usb_match_string(handle, dev->descriptor.iSerialNumber, serial) - ) { - return handle; + + for(i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + struct libusb_device_descriptor desc; + libusb_device_handle *handle; + + if ( libusb_get_device_descriptor( device, &desc ) ) + continue; + + if ( desc.idVendor == vendor && desc.idProduct == product ) { + if ( libusb_open(device, &handle) ) + continue; + + if (ncusb_match_string(handle, desc.iManufacturer, vendor_name) && + ncusb_match_string(handle, desc.iProduct, product_name) && + ncusb_match_string(handle, desc.iSerialNumber, serial) ) + { + found = handle; + } + } + + if (found) + break; + } - usb_close(handle); - return NULL; - + libusb_free_device_list(list, 1); + + return found; } -usb_dev_handle *nc_usb_open(int vendor, int product, char *vendor_name, char *product_name, char *serial) + +void check_handle(libusb_device_handle **h, int vid, int pid, const char* manuf, const char* product, const char* serial) { - struct usb_bus *bus; - struct usb_device *dev; - usb_dev_handle *handle = NULL; - - if(!did_usb_init++) - usb_init(); - - usb_find_busses(); - usb_find_devices(); - - for(bus=usb_get_busses(); bus; bus=bus->next) { - for(dev=bus->devices; dev; dev=dev->next) { - if(dev->descriptor.idVendor == vendor && - dev->descriptor.idProduct == product) { - handle = usb_check_device(dev, vendor_name, product_name, serial); - if (handle) - return handle; - } - } + static libusb_context *ctx=NULL; + + if (*h) + return; + if (!ctx) + libusb_init(&ctx); + libusb_set_debug(ctx, LIBUSB_LOG_LEVEL_WARNING); + *h = ncusb_find_and_open(ctx, vid, pid, manuf, product, serial); + if (!(*h)) { + fprintf(stderr, "No USB device %04x:%04x found ;(\n", vid, pid); + exit(1); } - return NULL; } -