From d5028a12ca539638a6ae5d923e7dba0e4f30a45a Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Mon, 11 Jan 2016 08:41:58 +0100 Subject: all: Switch to libusb-1.0 libusb 0.1 is deprecated. This updates 0xFFFF to use the newer libusb 1.0 API instead. --- src/usb-device.c | 144 ++++++++++++++++++++++--------------------------------- 1 file changed, 57 insertions(+), 87 deletions(-) (limited to 'src/usb-device.c') diff --git a/src/usb-device.c b/src/usb-device.c index a4b1f8b..9f5c18d 100644 --- a/src/usb-device.c +++ b/src/usb-device.c @@ -25,11 +25,7 @@ #include #include -#include - -#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP -#include -#endif +#include #include "global.h" #include "device.h" @@ -77,38 +73,31 @@ static void usb_flash_device_info_print(const struct usb_flash_device * dev) { } -static void usb_reattach_kernel_driver(usb_dev_handle * udev, int interface) { - -#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP - struct { - int ifno; - int ioctl_code; - void * data; - } command = { - .ifno = interface, - .ioctl_code = _IO('U', 23), - .data = NULL, - }; +static void usb_reattach_kernel_driver(libusb_device_handle * udev, int interface) { - if ( interface < 0 ) - return; - - usb_release_interface(udev, interface); - ioctl(*((int *)udev), _IOWR('U', 18, command), &command); -#endif + PRINTF_LINE("Reattach kernel driver to USB interface..."); + PRINTF_END(); + libusb_release_interface(udev, interface); + libusb_attach_kernel_driver(udev, interface); } -static void usb_descriptor_info_print(usb_dev_handle * udev, struct usb_device * dev, char * product, size_t size) { +static void usb_descriptor_info_print(libusb_device_handle * udev, struct libusb_device * dev, char * product, size_t size) { + struct libusb_device_descriptor desc; char buf[1024]; char buf2[1024]; unsigned int x; int ret; int i; + if ( libusb_get_device_descriptor(dev, &desc) < 0 ) { + PRINTF_LINE("libusb_get_device_descriptor() failed"); + PRINTF_END(); + return; + } memset(buf, 0, sizeof(buf)); - usb_get_string_simple(udev, dev->descriptor.iProduct, buf, sizeof(buf)); + libusb_get_string_descriptor_ascii(udev, desc.iProduct, (unsigned char *)buf, sizeof(buf)); PRINTF_LINE("USB device product string: %s", buf[0] ? buf : "(not detected)"); PRINTF_END(); @@ -117,7 +106,7 @@ static void usb_descriptor_info_print(usb_dev_handle * udev, struct usb_device * memset(buf, 0, sizeof(buf)); memset(buf2, 0, sizeof(buf2)); - ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, buf, sizeof(buf)); + ret = libusb_get_string_descriptor_ascii(udev, desc.iSerialNumber, (unsigned char *)buf, sizeof(buf)); if ( ! isalnum(buf[0]) ) buf[0] = 0; for ( i = 0; i < ret; i+=2 ) { @@ -136,15 +125,23 @@ static void usb_descriptor_info_print(usb_dev_handle * udev, struct usb_device * } -static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { +static struct usb_device_info * usb_device_is_valid(struct libusb_device * dev) { - int i; + int err, i; char product[1024]; + libusb_device_handle * udev; struct usb_device_info * ret = NULL; + struct libusb_device_descriptor desc; + + if ( libusb_get_device_descriptor(dev, &desc) < 0 ) { + PRINTF_LINE("libusb_get_device_descriptor failed"); + PRINTF_END(); + return NULL; + } for ( i = 0; usb_devices[i].vendor; ++i ) { - if ( dev->descriptor.idVendor == usb_devices[i].vendor && dev->descriptor.idProduct == usb_devices[i].product ) { + if ( desc.idVendor == usb_devices[i].vendor && desc.idProduct == usb_devices[i].product ) { printf("\b\b "); PRINTF_END(); @@ -153,9 +150,10 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { PRINTF_END(); PRINTF_LINE("Opening USB..."); - usb_dev_handle * udev = usb_open(dev); - if ( ! udev ) { - PRINTF_ERROR("usb_open failed"); + + err = libusb_open(dev, &udev); + if ( err < 0 ) { + PRINTF_ERROR("libusb_open failed"); fprintf(stderr, "\n"); return NULL; } @@ -164,17 +162,15 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { if ( usb_devices[i].interface >= 0 ) { -#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP PRINTF_LINE("Detaching kernel from USB interface..."); - usb_detach_kernel_driver_np(udev, usb_devices[i].interface); -#endif + libusb_detach_kernel_driver(udev, usb_devices[i].interface); PRINTF_LINE("Claiming USB interface..."); - if ( usb_claim_interface(udev, usb_devices[i].interface) < 0 ) { - PRINTF_ERROR("usb_claim_interface failed"); + if ( libusb_claim_interface(udev, usb_devices[i].interface) < 0 ) { + PRINTF_ERROR("libusb_claim_interface failed"); fprintf(stderr, "\n"); usb_reattach_kernel_driver(udev, usb_devices[i].interface); - usb_close(udev); + libusb_close(udev); return NULL; } @@ -182,22 +178,22 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { if ( usb_devices[i].alternate >= 0 ) { PRINTF_LINE("Setting alternate USB interface..."); - if ( usb_set_altinterface(udev, usb_devices[i].alternate) < 0 ) { - PRINTF_ERROR("usb_claim_interface failed"); + if ( libusb_set_interface_alt_setting(udev, usb_devices[i].interface, usb_devices[i].alternate) < 0 ) { + PRINTF_ERROR("libusb_claim_interface failed"); fprintf(stderr, "\n"); usb_reattach_kernel_driver(udev, usb_devices[i].interface); - usb_close(udev); + libusb_close(udev); return NULL; } } if ( usb_devices[i].configuration >= 0 ) { PRINTF_LINE("Setting USB configuration..."); - if ( usb_set_configuration(udev, usb_devices[i].configuration) < 0 ) { - PRINTF_ERROR("usb_set_configuration failed"); + if ( libusb_set_configuration(udev, usb_devices[i].configuration) < 0 ) { + PRINTF_ERROR("libusb_set_configuration failed"); fprintf(stderr, "\n"); usb_reattach_kernel_driver(udev, usb_devices[i].interface); - usb_close(udev); + libusb_close(udev); return NULL; } } @@ -206,7 +202,7 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { if ( ! ret ) { ALLOC_ERROR(); usb_reattach_kernel_driver(udev, usb_devices[i].interface); - usb_close(udev); + libusb_close(udev); return NULL; } @@ -232,7 +228,7 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { ERROR("Device mishmash"); fprintf(stderr, "\n"); usb_reattach_kernel_driver(udev, usb_devices[i].interface); - usb_close(udev); + libusb_close(udev); free(ret); return NULL; } @@ -249,28 +245,6 @@ static struct usb_device_info * usb_device_is_valid(struct usb_device * dev) { } -static struct usb_device_info * usb_search_device(struct usb_device * dev, int level) { - - int i; - struct usb_device_info * ret = NULL; - - if ( ! dev ) - return NULL; - - ret = usb_device_is_valid(dev); - if ( ret ) - return ret; - - for ( i = 0; i < dev->num_children; i++ ) { - ret = usb_search_device(dev->children[i], level + 1); - if ( ret ) - break; - } - - return ret; - -} - static volatile sig_atomic_t signal_quit; static void signal_handler(int signum) { @@ -282,14 +256,18 @@ static void signal_handler(int signum) { struct usb_device_info * usb_open_and_wait_for_device(void) { - struct usb_bus * bus; + libusb_device **devs; + libusb_device **dev; struct usb_device_info * ret = NULL; int i = 0; void (*prev)(int); static char progress[] = {'/','-','\\', '|'}; - usb_init(); - usb_find_busses(); + if ( libusb_init(NULL) < 0 ) { + PRINTF_LINE("libusb_init failed"); + PRINTF_END(); + return NULL; + } PRINTF_BACK(); printf("\n"); @@ -302,24 +280,16 @@ struct usb_device_info * usb_open_and_wait_for_device(void) { PRINTF_LINE("Waiting for USB device... %c", progress[++i%sizeof(progress)]); - usb_find_devices(); - - for ( bus = usb_get_busses(); bus; bus = bus->next ) { - - if ( bus->root_dev ) - ret = usb_search_device(bus->root_dev, 0); - else { - struct usb_device *dev; - for ( dev = bus->devices; dev; dev = dev->next ) { - ret = usb_search_device(dev, 0); - if ( ret ) - break; - } - } + if ( libusb_get_device_list(NULL, &devs) < 0 ) { + PRINTF_LINE("Listing USB devices failed"); + PRINTF_END(); + break; + } + for ( dev = devs; *dev != NULL; ++dev ) { + ret = usb_device_is_valid(*dev); if ( ret ) break; - } if ( ret ) @@ -345,7 +315,7 @@ struct usb_device_info * usb_open_and_wait_for_device(void) { void usb_close_device(struct usb_device_info * dev) { usb_reattach_kernel_driver(dev->udev, dev->flash_device->interface); - usb_close(dev->udev); + libusb_close(dev->udev); free(dev); } -- cgit v1.2.3