int libusb_get_string_descriptor_ascii(libusb_device_handle *pdev, uint8_t desc_index, unsigned char *data, int length) { if (pdev == NULL || data == NULL || length < 1) return (LIBUSB_ERROR_INVALID_PARAM); if (length > 65535) length = 65535; /* put some default data into the destination buffer */ data[0] = 0; if (libusb20_dev_req_string_simple_sync(pdev, desc_index, data, length) == 0) return (strlen(data)); return (LIBUSB_ERROR_OTHER); }
int usb_get_string_simple(usb_dev_handle * dev, int strindex, char *buf, size_t buflen) { int err; if (dev == NULL) return (-1); if (buflen > 65535) buflen = 65535; err = libusb20_dev_req_string_simple_sync((void *)dev, strindex, buf, buflen); if (err) return (-1); return (strlen(buf)); }
void dump_string_by_index(struct libusb20_device *pdev, uint8_t str_index) { char *pbuf; uint8_t n; uint8_t len; pbuf = malloc(256); if (pbuf == NULL) err(1, "out of memory"); if (str_index == 0) { /* language table */ if (libusb20_dev_req_string_sync(pdev, str_index, 0, pbuf, 256)) { printf("STRING_0x%02x = <read error>\n", str_index); } else { printf("STRING_0x%02x = ", str_index); len = (uint8_t)pbuf[0]; for (n = 0; n != len; n++) { printf("0x%02x%s", (uint8_t)pbuf[n], (n != (len-1)) ? ", " : ""); } printf("\n"); } } else { /* ordinary string */ if (libusb20_dev_req_string_simple_sync(pdev, str_index, pbuf, 256)) { printf("STRING_0x%02x = <read error>\n", str_index); } else { printf("STRING_0x%02x = <%s>\n", str_index, pbuf); } } free(pbuf); }
void usb_get_string_desc_test(uint16_t vid, uint16_t pid) { struct libusb20_device *pdev; uint32_t x; uint32_t y; uint32_t valid; uint8_t *buf; int error; pdev = find_usb_device(vid, pid); if (pdev == NULL) { printf("USB device not found\n"); return; } error = libusb20_dev_open(pdev, 0); if (error) { printf("Could not open USB device\n"); libusb20_dev_free(pdev); return; } buf = malloc(256); if (buf == NULL) { printf("Cannot allocate memory\n"); libusb20_dev_free(pdev); return; } valid = 0; printf("Starting string descriptor test for " "VID=0x%04x PID=0x%04x\n", vid, pid); for (x = 0; x != 256; x++) { if (libusb20_dev_check_connected(pdev) != 0) { printf("Device disconnected\n"); break; } printf("%d .. ", (int)x); fflush(stdout); error = libusb20_dev_req_string_simple_sync(pdev, x, buf, 255); if (error == 0) { printf("\nINDEX=%d, STRING='%s' (Default language)\n", (int)x, buf); fflush(stdout); } else { continue; } valid = 0; for (y = 0; y != 65536; y++) { if (libusb20_dev_check_connected(pdev) != 0) { printf("Device disconnected\n"); break; } error = libusb20_dev_req_string_sync(pdev, x, y, buf, 256); if (error == 0) valid++; } printf("String at INDEX=%d responds to %d " "languages\n", (int)x, (int)valid); } printf("\nDone\n"); free(buf); libusb20_dev_free(pdev); }
static void dump_field(struct libusb20_device *pdev, const char *plevel, const char *field, uint32_t value) { uint8_t temp_string[256]; printf("%s%s = 0x%04x ", plevel, field, value); if (strlen(plevel) == 8) { /* Endpoint Descriptor */ if (strcmp(field, "bEndpointAddress") == 0) { if (value & 0x80) printf(" <IN>\n"); else printf(" <OUT>\n"); return; } if (strcmp(field, "bmAttributes") == 0) { switch (value & 0x03) { case 0: printf(" <CONTROL>\n"); break; case 1: switch (value & 0x0C) { case 0x00: printf(" <ISOCHRONOUS>\n"); break; case 0x04: printf(" <ASYNC-ISOCHRONOUS>\n"); break; case 0x08: printf(" <ADAPT-ISOCHRONOUS>\n"); break; default: printf(" <SYNC-ISOCHRONOUS>\n"); break; } break; case 2: printf(" <BULK>\n"); break; default: printf(" <INTERRUPT>\n"); break; } return; } } if ((field[0] == 'i') && (field[1] != 'd')) { /* Indirect String Descriptor */ if (value == 0) { printf(" <no string>\n"); return; } if (libusb20_dev_req_string_simple_sync(pdev, value, temp_string, sizeof(temp_string))) { printf(" <retrieving string failed>\n"); return; } printf(" <%s>\n", temp_string); return; } /* No additional information */ printf("\n"); }