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); } }
static void exec_host_modem_test(struct modem *p, uint16_t vid, uint16_t pid) { struct libusb20_device *pdev; uint8_t ntest = 0; uint8_t x; uint8_t in_ep; uint8_t out_ep; uint8_t iface; int error; pdev = find_usb_device(vid, pid); if (pdev == NULL) { printf("USB device not found\n"); return; } if (p->use_vendor_specific) find_usb_endpoints(pdev, 255, 255, 255, 0, &iface, &in_ep, &out_ep, 0); else find_usb_endpoints(pdev, 2, 2, 1, 0, &iface, &in_ep, &out_ep, 1); if ((in_ep == 0) || (out_ep == 0)) { printf("Could not find USB endpoints\n"); libusb20_dev_free(pdev); return; } printf("Attaching to: %s @ iface %d\n", libusb20_dev_get_desc(pdev), iface); if (libusb20_dev_open(pdev, 2)) { printf("Could not open USB device\n"); libusb20_dev_free(pdev); return; } if (libusb20_dev_detach_kernel_driver(pdev, iface)) { printf("WARNING: Could not detach kernel driver\n"); } p->xfer_in = libusb20_tr_get_pointer(pdev, 0); error = libusb20_tr_open(p->xfer_in, 65536 / 4, 1, in_ep); if (error) { printf("Could not open USB endpoint %d\n", in_ep); libusb20_dev_free(pdev); return; } p->xfer_out = libusb20_tr_get_pointer(pdev, 1); error = libusb20_tr_open(p->xfer_out, 65536 / 4, 1, out_ep); if (error) { printf("Could not open USB endpoint %d\n", out_ep); libusb20_dev_free(pdev); return; } p->usb_dev = pdev; p->usb_iface = iface; p->errors = 0; if (p->control_ep_test) ntest += 7; if (p->data_stress_test) ntest += 1; if (ntest == 0) { printf("No tests selected\n"); } else { if (p->control_ep_test) { for (x = 1; x != 8; x++) { usb_modem_control_ep_test(p, (p->duration + ntest - 1) / ntest, x); } } if (p->data_stress_test) { usb_modem_data_stress_test(p, (p->duration + ntest - 1) / ntest); } } printf("\nDone\n"); libusb20_dev_free(pdev); }
int main(int argc, char **argv) { unsigned int vid = UINT_MAX, pid = UINT_MAX; /* impossible VID:PID */ int c; /* * Initialize setup struct. This step is required, and initializes * internal fields in the struct. * * All the "public" fields are named exactly the way as the USB * standard describes them, namely: * * setup.bmRequestType: bitmask, bit 7 is direction * bits 6/5 is request type * (standard, class, vendor) * bits 4..0 is recipient * (device, interface, endpoint, * other) * setup.bRequest: the request itself (see get_req() for standard * requests, or specific value) * setup.wValue: a 16-bit value * setup.wIndex: another 16-bit value * setup.wLength: length of associated data transfer, direction * depends on bit 7 of bmRequestType */ LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP, &setup); while ((c = getopt(argc, argv, "i:p:v:")) != -1) switch (c) { case 'i': intr_ep = strtol(optarg, NULL, 0); break; case 'p': pid = strtol(optarg, NULL, 0); break; case 'v': vid = strtol(optarg, NULL, 0); break; default: usage(); break; } argc -= optind; argv += optind; if (vid != UINT_MAX || pid != UINT_MAX) { if (intr_ep != 0 && (intr_ep & 0x80) == 0) { fprintf(stderr, "Interrupt endpoint must be of type IN\n"); usage(); } if (argc > 0) { do_request = true; int rv = parse_req(argc, argv); if (rv < 0) return EX_USAGE; argc = rv; if (argc > 0) { for (out_len = 0; argc > 0 && out_len < BUFLEN; out_len++, argc--) { unsigned n = strtoul(argv[out_len], 0, 0); if (n > 255) fprintf(stderr, "Warning: data #%d 0x%0x > 0xff, truncating\n", out_len, n); out_buf[out_len] = (uint8_t)n; } out_len++; if (argc > 0) fprintf(stderr, "Data count exceeds maximum of %d, ignoring %d elements\n", BUFLEN, optind); } } } struct libusb20_backend *be; struct libusb20_device *dev; if ((be = libusb20_be_alloc_default()) == NULL) { perror("libusb20_be_alloc()"); return 1; } dev = NULL; while ((dev = libusb20_be_device_foreach(be, dev)) != NULL) { struct LIBUSB20_DEVICE_DESC_DECODED *ddp = libusb20_dev_get_device_desc(dev); printf("Found device %s (VID:PID = 0x%04x:0x%04x)\n", libusb20_dev_get_desc(dev), ddp->idVendor, ddp->idProduct); if (ddp->idVendor == vid && ddp->idProduct == pid) doit(dev); } libusb20_be_free(be); return 0; }
int main(int argc, char **argv) { unsigned int vid = UINT_MAX, pid = UINT_MAX; /* impossible VID:PID */ int c; while ((c = getopt(argc, argv, "i:o:p:v:")) != -1) switch (c) { case 'i': in_ep = strtol(optarg, NULL, 0); break; case 'o': out_ep = strtol(optarg, NULL, 0); break; case 'p': pid = strtol(optarg, NULL, 0); break; case 'v': vid = strtol(optarg, NULL, 0); break; default: usage(); break; } argc -= optind; argv += optind; if (vid != UINT_MAX || pid != UINT_MAX) { if (in_ep == 0 || out_ep == 0) { usage(); } if ((in_ep & 0x80) == 0) { fprintf(stderr, "IN_EP must have bit 7 set\n"); return (EX_USAGE); } if (argc > 0) { for (out_len = 0; argc > 0 && out_len < BUFLEN; out_len++, argc--) { unsigned n = strtoul(argv[out_len], 0, 0); if (n > 255) fprintf(stderr, "Warning: data #%d 0x%0x > 0xff, truncating\n", out_len, n); out_buf[out_len] = (uint8_t)n; } out_len++; if (argc > 0) fprintf(stderr, "Data count exceeds maximum of %d, ignoring %d elements\n", BUFLEN, optind); } } struct libusb20_backend *be; struct libusb20_device *dev; if ((be = libusb20_be_alloc_default()) == NULL) { perror("libusb20_be_alloc()"); return 1; } dev = NULL; while ((dev = libusb20_be_device_foreach(be, dev)) != NULL) { struct LIBUSB20_DEVICE_DESC_DECODED *ddp = libusb20_dev_get_device_desc(dev); printf("Found device %s (VID:PID = 0x%04x:0x%04x)\n", libusb20_dev_get_desc(dev), ddp->idVendor, ddp->idProduct); if (ddp->idVendor == vid && ddp->idProduct == pid) doit(dev); } libusb20_be_free(be); return 0; }