From 88ded79caa4c388739de140d709ccba6397ddd14 Mon Sep 17 00:00:00 2001 From: Chris Dickens Date: Mon, 13 Jan 2020 12:23:02 -0800 Subject: examples: testlibusb: Formatting, whitespace and functional cleanup Make the coding style and whitespace consistent with the rest of the library source code. In the print_device() function, the 'level' argument is unnecessary, so remove it and the associated space padding. Switch to use printf() directly instead of formatting the description into a single buffer. This not only simplifies the code but avoids truncating the description for devices with larger descriptor strings. Make the output formatting consistent by lining up all the printed values and using the same notation for all hexadecimal values. Inspired by PR #452, enable printing all available BOS device capability descriptors, not just the first one. Closes #452 Signed-off-by: Chris Dickens --- examples/testlibusb.c | 179 +++++++++++++++++++++++--------------------------- libusb/version_nano.h | 2 +- 2 files changed, 84 insertions(+), 97 deletions(-) diff --git a/examples/testlibusb.c b/examples/testlibusb.c index 6501a12..3eb0fc6 100755 --- a/examples/testlibusb.c +++ b/examples/testlibusb.c @@ -30,9 +30,9 @@ int verbose = 0; static void print_endpoint_comp(const struct libusb_ss_endpoint_companion_descriptor *ep_comp) { printf(" USB 3.0 Endpoint Companion:\n"); - printf(" bMaxBurst: %d\n", ep_comp->bMaxBurst); - printf(" bmAttributes: 0x%02x\n", ep_comp->bmAttributes); - printf(" wBytesPerInterval: %d\n", ep_comp->wBytesPerInterval); + printf(" bMaxBurst: %u\n", ep_comp->bMaxBurst); + printf(" bmAttributes: %02xh\n", ep_comp->bmAttributes); + printf(" wBytesPerInterval: %u\n", ep_comp->wBytesPerInterval); } static void print_endpoint(const struct libusb_endpoint_descriptor *endpoint) @@ -40,21 +40,20 @@ static void print_endpoint(const struct libusb_endpoint_descriptor *endpoint) int i, ret; printf(" Endpoint:\n"); - printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); - printf(" bmAttributes: %02xh\n", endpoint->bmAttributes); - printf(" wMaxPacketSize: %d\n", endpoint->wMaxPacketSize); - printf(" bInterval: %d\n", endpoint->bInterval); - printf(" bRefresh: %d\n", endpoint->bRefresh); - printf(" bSynchAddress: %d\n", endpoint->bSynchAddress); + printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); + printf(" bmAttributes: %02xh\n", endpoint->bmAttributes); + printf(" wMaxPacketSize: %u\n", endpoint->wMaxPacketSize); + printf(" bInterval: %u\n", endpoint->bInterval); + printf(" bRefresh: %u\n", endpoint->bRefresh); + printf(" bSynchAddress: %u\n", endpoint->bSynchAddress); for (i = 0; i < endpoint->extra_length;) { if (LIBUSB_DT_SS_ENDPOINT_COMPANION == endpoint->extra[i + 1]) { struct libusb_ss_endpoint_companion_descriptor *ep_comp; ret = libusb_get_ss_endpoint_companion_descriptor(NULL, endpoint, &ep_comp); - if (LIBUSB_SUCCESS != ret) { + if (LIBUSB_SUCCESS != ret) continue; - } print_endpoint_comp(ep_comp); @@ -70,13 +69,13 @@ static void print_altsetting(const struct libusb_interface_descriptor *interface uint8_t i; printf(" Interface:\n"); - printf(" bInterfaceNumber: %d\n", interface->bInterfaceNumber); - printf(" bAlternateSetting: %d\n", interface->bAlternateSetting); - printf(" bNumEndpoints: %d\n", interface->bNumEndpoints); - printf(" bInterfaceClass: %d\n", interface->bInterfaceClass); - printf(" bInterfaceSubClass: %d\n", interface->bInterfaceSubClass); - printf(" bInterfaceProtocol: %d\n", interface->bInterfaceProtocol); - printf(" iInterface: %d\n", interface->iInterface); + printf(" bInterfaceNumber: %u\n", interface->bInterfaceNumber); + printf(" bAlternateSetting: %u\n", interface->bAlternateSetting); + printf(" bNumEndpoints: %u\n", interface->bNumEndpoints); + printf(" bInterfaceClass: %u\n", interface->bInterfaceClass); + printf(" bInterfaceSubClass: %u\n", interface->bInterfaceSubClass); + printf(" bInterfaceProtocol: %u\n", interface->bInterfaceProtocol); + printf(" iInterface: %u\n", interface->iInterface); for (i = 0; i < interface->bNumEndpoints; i++) print_endpoint(&interface->endpoint[i]); @@ -85,58 +84,58 @@ static void print_altsetting(const struct libusb_interface_descriptor *interface static void print_2_0_ext_cap(struct libusb_usb_2_0_extension_descriptor *usb_2_0_ext_cap) { printf(" USB 2.0 Extension Capabilities:\n"); - printf(" bDevCapabilityType: %d\n", usb_2_0_ext_cap->bDevCapabilityType); - printf(" bmAttributes: 0x%x\n", usb_2_0_ext_cap->bmAttributes); + printf(" bDevCapabilityType: %u\n", usb_2_0_ext_cap->bDevCapabilityType); + printf(" bmAttributes: %08xh\n", usb_2_0_ext_cap->bmAttributes); } static void print_ss_usb_cap(struct libusb_ss_usb_device_capability_descriptor *ss_usb_cap) { printf(" USB 3.0 Capabilities:\n"); - printf(" bDevCapabilityType: %d\n", ss_usb_cap->bDevCapabilityType); - printf(" bmAttributes: 0x%x\n", ss_usb_cap->bmAttributes); - printf(" wSpeedSupported: 0x%x\n", ss_usb_cap->wSpeedSupported); - printf(" bFunctionalitySupport: %d\n", ss_usb_cap->bFunctionalitySupport); - printf(" bU1devExitLat: %d\n", ss_usb_cap->bU1DevExitLat); - printf(" bU2devExitLat: %d\n", ss_usb_cap->bU2DevExitLat); + printf(" bDevCapabilityType: %u\n", ss_usb_cap->bDevCapabilityType); + printf(" bmAttributes: %02xh\n", ss_usb_cap->bmAttributes); + printf(" wSpeedSupported: %u\n", ss_usb_cap->wSpeedSupported); + printf(" bFunctionalitySupport: %u\n", ss_usb_cap->bFunctionalitySupport); + printf(" bU1devExitLat: %u\n", ss_usb_cap->bU1DevExitLat); + printf(" bU2devExitLat: %u\n", ss_usb_cap->bU2DevExitLat); } static void print_bos(libusb_device_handle *handle) { struct libusb_bos_descriptor *bos; + uint8_t i; int ret; ret = libusb_get_bos_descriptor(handle, &bos); - if (0 > ret) { + if (ret < 0) return; - } printf(" Binary Object Store (BOS):\n"); - printf(" wTotalLength: %d\n", bos->wTotalLength); - printf(" bNumDeviceCaps: %d\n", bos->bNumDeviceCaps); + printf(" wTotalLength: %u\n", bos->wTotalLength); + printf(" bNumDeviceCaps: %u\n", bos->bNumDeviceCaps); - if(bos->dev_capability[0]->bDevCapabilityType == LIBUSB_BT_USB_2_0_EXTENSION) { + for (i = 0; i < bos->bNumDeviceCaps; i++) { + struct libusb_bos_dev_capability_descriptor *dev_cap = bos->dev_capability[i]; - struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension; - ret = libusb_get_usb_2_0_extension_descriptor(NULL, bos->dev_capability[0],&usb_2_0_extension); - if (0 > ret) { - return; - } + if (dev_cap->bDevCapabilityType == LIBUSB_BT_USB_2_0_EXTENSION) { + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension; - print_2_0_ext_cap(usb_2_0_extension); - libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension); - } + ret = libusb_get_usb_2_0_extension_descriptor(NULL, dev_cap, &usb_2_0_extension); + if (ret < 0) + return; - if(bos->dev_capability[0]->bDevCapabilityType == LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { + print_2_0_ext_cap(usb_2_0_extension); + libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension); + } else if (dev_cap->bDevCapabilityType == LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { + struct libusb_ss_usb_device_capability_descriptor *ss_dev_cap; - struct libusb_ss_usb_device_capability_descriptor *dev_cap; - ret = libusb_get_ss_usb_device_capability_descriptor(NULL, bos->dev_capability[0],&dev_cap); - if (0 > ret) { - return; - } + ret = libusb_get_ss_usb_device_capability_descriptor(NULL, dev_cap, &ss_dev_cap); + if (ret < 0) + return; - print_ss_usb_cap(dev_cap); - libusb_free_ss_usb_device_capability_descriptor(dev_cap); - } + print_ss_usb_cap(ss_dev_cap); + libusb_free_ss_usb_device_capability_descriptor(ss_dev_cap); + } + } libusb_free_bos_descriptor(bos); } @@ -154,22 +153,21 @@ static void print_configuration(struct libusb_config_descriptor *config) uint8_t i; printf(" Configuration:\n"); - printf(" wTotalLength: %d\n", config->wTotalLength); - printf(" bNumInterfaces: %d\n", config->bNumInterfaces); - printf(" bConfigurationValue: %d\n", config->bConfigurationValue); - printf(" iConfiguration: %d\n", config->iConfiguration); - printf(" bmAttributes: %02xh\n", config->bmAttributes); - printf(" MaxPower: %d\n", config->MaxPower); + printf(" wTotalLength: %u\n", config->wTotalLength); + printf(" bNumInterfaces: %u\n", config->bNumInterfaces); + printf(" bConfigurationValue: %u\n", config->bConfigurationValue); + printf(" iConfiguration: %u\n", config->iConfiguration); + printf(" bmAttributes: %02xh\n", config->bmAttributes); + printf(" MaxPower: %u\n", config->MaxPower); for (i = 0; i < config->bNumInterfaces; i++) print_interface(&config->interface[i]); } -static int print_device(libusb_device *dev, int level) +static void print_device(libusb_device *dev) { struct libusb_device_descriptor desc; libusb_device_handle *handle = NULL; - char description[260]; char string[256]; int ret; uint8_t i; @@ -177,56 +175,49 @@ static int print_device(libusb_device *dev, int level) ret = libusb_get_device_descriptor(dev, &desc); if (ret < 0) { fprintf(stderr, "failed to get device descriptor"); - return -1; + return; } + printf("Dev (bus %u, device %u): ", + libusb_get_bus_number(dev), libusb_get_device_address(dev)); + ret = libusb_open(dev, &handle); if (LIBUSB_SUCCESS == ret) { - if (desc.iManufacturer) { + if (desc.iManufacturer) ret = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, string, sizeof(string)); - if (ret > 0) - snprintf(description, sizeof(description), "%s - ", string); - else - snprintf(description, sizeof(description), "%04X - ", - desc.idVendor); - } else - snprintf(description, sizeof(description), "%04X - ", - desc.idVendor); + ret = LIBUSB_ERROR_NOT_FOUND; - if (desc.iProduct) { + if (ret > 0) + printf("%s - ", string); + else + printf("%04X - ", desc.idVendor); + + if (desc.iProduct) ret = libusb_get_string_descriptor_ascii(handle, desc.iProduct, string, sizeof(string)); - if (ret > 0) - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%s", string); - else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", desc.idProduct); - } else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", desc.idProduct); - } - else { - snprintf(description, sizeof(description), "%04X - %04X", - desc.idVendor, desc.idProduct); - } + ret = LIBUSB_ERROR_NOT_FOUND; - printf("%.*sDev (bus %d, device %d): %s\n", level * 2, " ", - libusb_get_bus_number(dev), libusb_get_device_address(dev), description); + if (ret > 0) + printf("%s\n", string); + else + printf("%04X\n", desc.idProduct); - if (handle && verbose) { - if (desc.iSerialNumber) { + if (desc.iSerialNumber && verbose) ret = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, string, sizeof(string)); - if (ret > 0) - printf("%.*s - Serial Number: %s\n", level * 2, - " ", string); - } + else + ret = LIBUSB_ERROR_NOT_FOUND; + + if (ret > 0) + printf(" Serial Number: %s\n", string); + } else { + printf("%04X - %04X\n", desc.idVendor, desc.idProduct); } if (verbose) { for (i = 0; i < desc.bNumConfigurations; i++) { struct libusb_config_descriptor *config; + ret = libusb_get_config_descriptor(dev, i, &config); if (LIBUSB_SUCCESS != ret) { printf(" Couldn't retrieve descriptors\n"); @@ -238,15 +229,12 @@ static int print_device(libusb_device *dev, int level) libusb_free_config_descriptor(config); } - if (handle && desc.bcdUSB >= 0x0201) { + if (handle && desc.bcdUSB >= 0x0201) print_bos(handle); - } } if (handle) libusb_close(handle); - - return 0; } int main(int argc, char *argv[]) @@ -266,9 +254,8 @@ int main(int argc, char *argv[]) if (cnt < 0) return (int)cnt; - for (i = 0; devs[i]; ++i) { - print_device(devs[i], 0); - } + for (i = 0; devs[i]; i++) + print_device(devs[i]); libusb_free_device_list(devs, 1); diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 8e487b0..26ee5e6 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 11421 +#define LIBUSB_NANO 11422 -- cgit v1.2.1