void dump_device_info(struct libusb20_device *pdev, uint8_t show_ifdrv) { char buf[128]; uint8_t n; unsigned int usage; usage = libusb20_dev_get_power_usage(pdev); printf("%s, cfg=%u md=%s spd=%s pwr=%s (%umA)\n", libusb20_dev_get_desc(pdev), libusb20_dev_get_config_index(pdev), dump_mode(libusb20_dev_get_mode(pdev)), dump_speed(libusb20_dev_get_speed(pdev)), dump_power_mode(libusb20_dev_get_power_mode(pdev)), usage); if (!show_ifdrv) return; for (n = 0; n != 255; n++) { if (libusb20_dev_get_iface_desc(pdev, n, buf, sizeof(buf))) break; if (buf[0] == 0) continue; printf("ugen%u.%u.%u: %s\n", libusb20_dev_get_bus_number(pdev), libusb20_dev_get_address(pdev), n, buf); } }
int libusb_get_active_config_descriptor(libusb_device *dev, struct libusb_config_descriptor **config) { struct libusb20_device *pdev; uint8_t config_index; pdev = dev->os_priv; config_index = libusb20_dev_get_config_index(pdev); return (libusb_get_config_descriptor(dev, config_index, config)); }
void dump_config(struct libusb20_device *pdev, uint8_t all_cfg) { struct LIBUSB20_CONFIG_DESC_DECODED *cdesc; struct LIBUSB20_DEVICE_DESC_DECODED *ddesc; struct libusb20_config *pcfg = NULL; uint8_t cfg_index; uint8_t cfg_index_end; uint8_t x; uint8_t y; ddesc = libusb20_dev_get_device_desc(pdev); if (all_cfg) { cfg_index = 0; cfg_index_end = ddesc->bNumConfigurations; } else { cfg_index = libusb20_dev_get_config_index(pdev); cfg_index_end = cfg_index + 1; } for (; cfg_index != cfg_index_end; cfg_index++) { pcfg = libusb20_dev_alloc_config(pdev, cfg_index); if (!pcfg) { continue; } printf("\n Configuration index %u\n\n", cfg_index); cdesc = &(pcfg->desc); LIBUSB20_CONFIG_DESC(DUMP1, cdesc); dump_extra(&(pcfg->extra), " " " "); for (x = 0; x != pcfg->num_interface; x++) { printf("\n Interface %u\n", x); dump_iface(pdev, pcfg->interface + x); printf("\n"); for (y = 0; y != (pcfg->interface + x)->num_altsetting; y++) { printf("\n Interface %u Alt %u\n", x, y + 1); dump_iface(pdev, (pcfg->interface + x)->altsetting + y); printf("\n"); } } printf("\n"); free(pcfg); } return; }
void usb_set_alt_interface_test(uint16_t vid, uint16_t pid) { struct libusb20_device *pdev; struct libusb20_config *config; int iter; int error; int errcnt; int n; int m; pdev = find_usb_device(vid, pid); if (pdev == NULL) { printf("USB device not found\n"); return; } printf("Starting set alternate setting test " "for VID=0x%04x PID=0x%04x\n", vid, pid); config = libusb20_dev_alloc_config(pdev, libusb20_dev_get_config_index(pdev)); if (config == NULL) { printf("Could not get configuration descriptor\n"); libusb20_dev_free(pdev); return; } iter = 0; errcnt = 0; for (n = 0; n != config->num_interface; n++) { /* detach kernel driver */ libusb20_dev_detach_kernel_driver(pdev, n); error = libusb20_dev_open(pdev, 0); if (error) printf("ERROR could not open device\n"); /* Try the alternate settings */ for (m = 0; m != config->interface[n].num_altsetting; m++) { iter++; if (libusb20_dev_set_alt_index(pdev, n, m + 1)) { printf("ERROR on interface %d alt %d\n", n, m + 1); errcnt++; } } /* Restore to default */ iter++; if (libusb20_dev_set_alt_index(pdev, n, 0)) { printf("ERROR on interface %d alt %d\n", n, 0); errcnt++; } libusb20_dev_close(pdev); } libusb20_dev_free(pdev); printf("\n" "Test summary\n" "============\n" "Interfaces tested: %d\n" "Errors: %d\n", iter, errcnt); }