1 /* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ 2 /* 3 * USB descriptor handling functions for libusb 4 * Copyright 2007 Daniel Drake <dsd (at) gentoo.org> 5 * Copyright 2001 Johannes Erdfelt <johannes (at) erdfelt.com> 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #include <config.h> 23 24 #include <errno.h> 25 #include <stdint.h> 26 #include <stdlib.h> 27 #include <string.h> 28 29 #include "libusbi.h" 30 31 #define DESC_HEADER_LENGTH 2 32 #define DEVICE_DESC_LENGTH 18 33 #define CONFIG_DESC_LENGTH 9 34 #define INTERFACE_DESC_LENGTH 9 35 #define ENDPOINT_DESC_LENGTH 7 36 #define ENDPOINT_AUDIO_DESC_LENGTH 9 37 38 /** @defgroup libusb_desc USB descriptors 39 * This page details how to examine the various standard USB descriptors 40 * for detected devices 41 */ 42 43 /* set host_endian if the w values are already in host endian format, 44 * as opposed to bus endian. */ 45 int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, 46 void *dest, int host_endian) 47 { 48 const unsigned char *sp = source; 49 unsigned char *dp = dest; 50 uint16_t w; 51 const char *cp; 52 uint32_t d; 53 54 for (cp = descriptor; *cp; cp++) { 55 switch (*cp) { 56 case 'b': /* 8-bit byte */ 57 *dp++ = *sp++; 58 break; 59 case 'w': /* 16-bit word, convert from little endian to CPU */ 60 dp += ((uintptr_t)dp & 1); /* Align to word boundary */ 61 62 if (host_endian) { 63 memcpy(dp, sp, 2); 64 } else { 65 w = (sp[1] << 8) | sp[0]; 66 *((uint16_t *)dp) = w; 67 } 68 sp += 2; 69 dp += 2; 70 break; 71 case 'd': /* 32-bit word, convert from little endian to CPU */ 72 dp += ((uintptr_t)dp & 1); /* Align to word boundary */ 73 74 if (host_endian) { 75 memcpy(dp, sp, 4); 76 } else { 77 d = (sp[3] << 24) | (sp[2] << 16) | 78 (sp[1] << 8) | sp[0]; 79 *((uint32_t *)dp) = d; 80 } 81 sp += 4; 82 dp += 4; 83 break; 84 case 'u': /* 16 byte UUID */ 85 memcpy(dp, sp, 16); 86 sp += 16; 87 dp += 16; 88 break; 89 } 90 } 91 92 return (int) (sp - source); 93 } 94 95 static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint) 96 { 97 free((void *) endpoint->extra); 98 } 99 100 static int parse_endpoint(struct libusb_context *ctx, 101 struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer, 102 int size, int host_endian) 103 { 104 struct usb_descriptor_header header; 105 unsigned char *extra; 106 unsigned char *begin; 107 int parsed = 0; 108 int len; 109 110 if (size < DESC_HEADER_LENGTH) { 111 usbi_err(ctx, "short endpoint descriptor read %d/%d", 112 size, DESC_HEADER_LENGTH); 113 return LIBUSB_ERROR_IO; 114 } 115 116 usbi_parse_descriptor(buffer, "bb", &header, 0); 117 if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) { 118 usbi_err(ctx, "unexpected descriptor %x (expected %x)", 119 header.bDescriptorType, LIBUSB_DT_ENDPOINT); 120 return parsed; 121 } 122 if (header.bLength > size) { 123 usbi_warn(ctx, "short endpoint descriptor read %d/%d", 124 size, header.bLength); 125 return parsed; 126 } 127 if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH) 128 usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian); 129 else if (header.bLength >= ENDPOINT_DESC_LENGTH) 130 usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian); 131 else { 132 usbi_err(ctx, "invalid endpoint bLength (%d)", header.bLength); 133 return LIBUSB_ERROR_IO; 134 } 135 136 buffer += header.bLength; 137 size -= header.bLength; 138 parsed += header.bLength; 139 140 /* Skip over the rest of the Class Specific or Vendor Specific */ 141 /* descriptors */ 142 begin = buffer; 143 while (size >= DESC_HEADER_LENGTH) { 144 usbi_parse_descriptor(buffer, "bb", &header, 0); 145 if (header.bLength < DESC_HEADER_LENGTH) { 146 usbi_err(ctx, "invalid extra ep desc len (%d)", 147 header.bLength); 148 return LIBUSB_ERROR_IO; 149 } else if (header.bLength > size) { 150 usbi_warn(ctx, "short extra ep desc read %d/%d", 151 size, header.bLength); 152 return parsed; 153 } 154 155 /* If we find another "proper" descriptor then we're done */ 156 if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || 157 (header.bDescriptorType == LIBUSB_DT_INTERFACE) || 158 (header.bDescriptorType == LIBUSB_DT_CONFIG) || 159 (header.bDescriptorType == LIBUSB_DT_DEVICE)) 160 break; 161 162 usbi_dbg("skipping descriptor %x", header.bDescriptorType); 163 buffer += header.bLength; 164 size -= header.bLength; 165 parsed += header.bLength; 166 } 167 168 /* Copy any unknown descriptors into a storage area for drivers */ 169 /* to later parse */ 170 len = (int)(buffer - begin); 171 if (!len) { 172 endpoint->extra = NULL; 173 endpoint->extra_length = 0; 174 return parsed; 175 } 176 177 extra = malloc(len); 178 endpoint->extra = extra; 179 if (!extra) { 180 endpoint->extra_length = 0; 181 return LIBUSB_ERROR_NO_MEM; 182 } 183 184 memcpy(extra, begin, len); 185 endpoint->extra_length = len; 186 187 return parsed; 188 } 189 190 static void clear_interface(struct libusb_interface *usb_interface) 191 { 192 int i; 193 int j; 194 195 if (usb_interface->altsetting) { 196 for (i = 0; i < usb_interface->num_altsetting; i++) { 197 struct libusb_interface_descriptor *ifp = 198 (struct libusb_interface_descriptor *) 199 usb_interface->altsetting + i; 200 free((void *) ifp->extra); 201 if (ifp->endpoint) { 202 for (j = 0; j < ifp->bNumEndpoints; j++) 203 clear_endpoint((struct libusb_endpoint_descriptor *) 204 ifp->endpoint + j); 205 } 206 free((void *) ifp->endpoint); 207 } 208 } 209 free((void *) usb_interface->altsetting); 210 usb_interface->altsetting = NULL; 211 } 212 213 static int parse_interface(libusb_context *ctx, 214 struct libusb_interface *usb_interface, unsigned char *buffer, int size, 215 int host_endian) 216 { 217 int i; 218 int len; 219 int r; 220 int parsed = 0; 221 int interface_number = -1; 222 struct usb_descriptor_header header; 223 struct libusb_interface_descriptor *ifp; 224 unsigned char *begin; 225 226 usb_interface->num_altsetting = 0; 227 228 while (size >= INTERFACE_DESC_LENGTH) { 229 struct libusb_interface_descriptor *altsetting = 230 (struct libusb_interface_descriptor *) usb_interface->altsetting; 231 altsetting = usbi_reallocf(altsetting, 232 sizeof(struct libusb_interface_descriptor) * 233 (usb_interface->num_altsetting + 1)); 234 if (!altsetting) { 235 r = LIBUSB_ERROR_NO_MEM; 236 goto err; 237 } 238 usb_interface->altsetting = altsetting; 239 240 ifp = altsetting + usb_interface->num_altsetting; 241 usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0); 242 if (ifp->bDescriptorType != LIBUSB_DT_INTERFACE) { 243 usbi_err(ctx, "unexpected descriptor %x (expected %x)", 244 ifp->bDescriptorType, LIBUSB_DT_INTERFACE); 245 return parsed; 246 } 247 if (ifp->bLength < INTERFACE_DESC_LENGTH) { 248 usbi_err(ctx, "invalid interface bLength (%d)", 249 ifp->bLength); 250 r = LIBUSB_ERROR_IO; 251 goto err; 252 } 253 if (ifp->bLength > size) { 254 usbi_warn(ctx, "short intf descriptor read %d/%d", 255 size, ifp->bLength); 256 return parsed; 257 } 258 if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { 259 usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints); 260 r = LIBUSB_ERROR_IO; 261 goto err; 262 } 263 264 usb_interface->num_altsetting++; 265 ifp->extra = NULL; 266 ifp->extra_length = 0; 267 ifp->endpoint = NULL; 268 269 if (interface_number == -1) 270 interface_number = ifp->bInterfaceNumber; 271 272 /* Skip over the interface */ 273 buffer += ifp->bLength; 274 parsed += ifp->bLength; 275 size -= ifp->bLength; 276 277 begin = buffer; 278 279 /* Skip over any interface, class or vendor descriptors */ 280 while (size >= DESC_HEADER_LENGTH) { 281 usbi_parse_descriptor(buffer, "bb", &header, 0); 282 if (header.bLength < DESC_HEADER_LENGTH) { 283 usbi_err(ctx, 284 "invalid extra intf desc len (%d)", 285 header.bLength); 286 r = LIBUSB_ERROR_IO; 287 goto err; 288 } else if (header.bLength > size) { 289 usbi_warn(ctx, 290 "short extra intf desc read %d/%d", 291 size, header.bLength); 292 return parsed; 293 } 294 295 /* If we find another "proper" descriptor then we're done */ 296 if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) || 297 (header.bDescriptorType == LIBUSB_DT_ENDPOINT) || 298 (header.bDescriptorType == LIBUSB_DT_CONFIG) || 299 (header.bDescriptorType == LIBUSB_DT_DEVICE)) 300 break; 301 302 buffer += header.bLength; 303 parsed += header.bLength; 304 size -= header.bLength; 305 } 306 307 /* Copy any unknown descriptors into a storage area for */ 308 /* drivers to later parse */ 309 len = (int)(buffer - begin); 310 if (len) { 311 ifp->extra = malloc(len); 312 if (!ifp->extra) { 313 r = LIBUSB_ERROR_NO_MEM; 314 goto err; 315 } 316 memcpy((unsigned char *) ifp->extra, begin, len); 317 ifp->extra_length = len; 318 } 319 320 if (ifp->bNumEndpoints > 0) { 321 struct libusb_endpoint_descriptor *endpoint; 322 endpoint = calloc(ifp->bNumEndpoints, sizeof(struct libusb_endpoint_descriptor)); 323 ifp->endpoint = endpoint; 324 if (!endpoint) { 325 r = LIBUSB_ERROR_NO_MEM; 326 goto err; 327 } 328 329 for (i = 0; i < ifp->bNumEndpoints; i++) { 330 r = parse_endpoint(ctx, endpoint + i, buffer, size, 331 host_endian); 332 if (r < 0) 333 goto err; 334 if (r == 0) { 335 ifp->bNumEndpoints = (uint8_t)i; 336 break;; 337 } 338 339 buffer += r; 340 parsed += r; 341 size -= r; 342 } 343 } 344 345 /* We check to see if it's an alternate to this one */ 346 ifp = (struct libusb_interface_descriptor *) buffer; 347 if (size < LIBUSB_DT_INTERFACE_SIZE || 348 ifp->bDescriptorType != LIBUSB_DT_INTERFACE || 349 ifp->bInterfaceNumber != interface_number) 350 return parsed; 351 } 352 353 return parsed; 354 err: 355 clear_interface(usb_interface); 356 return r; 357 } 358 359 static void clear_configuration(struct libusb_config_descriptor *config) 360 { 361 int i; 362 if (config->interface) { 363 for (i = 0; i < config->bNumInterfaces; i++) 364 clear_interface((struct libusb_interface *) 365 config->interface + i); 366 } 367 free((void *) config->interface); 368 free((void *) config->extra); 369 } 370 371 static int parse_configuration(struct libusb_context *ctx, 372 struct libusb_config_descriptor *config, unsigned char *buffer, 373 int size, int host_endian) 374 { 375 int i; 376 int r; 377 struct usb_descriptor_header header; 378 struct libusb_interface *usb_interface; 379 380 if (size < LIBUSB_DT_CONFIG_SIZE) { 381 usbi_err(ctx, "short config descriptor read %d/%d", 382 size, LIBUSB_DT_CONFIG_SIZE); 383 return LIBUSB_ERROR_IO; 384 } 385 386 usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian); 387 if (config->bDescriptorType != LIBUSB_DT_CONFIG) { 388 usbi_err(ctx, "unexpected descriptor %x (expected %x)", 389 config->bDescriptorType, LIBUSB_DT_CONFIG); 390 return LIBUSB_ERROR_IO; 391 } 392 if (config->bLength < LIBUSB_DT_CONFIG_SIZE) { 393 usbi_err(ctx, "invalid config bLength (%d)", config->bLength); 394 return LIBUSB_ERROR_IO; 395 } 396 if (config->bLength > size) { 397 usbi_err(ctx, "short config descriptor read %d/%d", 398 size, config->bLength); 399 return LIBUSB_ERROR_IO; 400 } 401 if (config->bNumInterfaces > USB_MAXINTERFACES) { 402 usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces); 403 return LIBUSB_ERROR_IO; 404 } 405 406 usb_interface = calloc(config->bNumInterfaces, sizeof(struct libusb_interface)); 407 config->interface = usb_interface; 408 if (!usb_interface) 409 return LIBUSB_ERROR_NO_MEM; 410 411 buffer += config->bLength; 412 size -= config->bLength; 413 414 config->extra = NULL; 415 config->extra_length = 0; 416 417 for (i = 0; i < config->bNumInterfaces; i++) { 418 int len; 419 unsigned char *begin; 420 421 /* Skip over the rest of the Class Specific or Vendor */ 422 /* Specific descriptors */ 423 begin = buffer; 424 while (size >= DESC_HEADER_LENGTH) { 425 usbi_parse_descriptor(buffer, "bb", &header, 0); 426 427 if (header.bLength < DESC_HEADER_LENGTH) { 428 usbi_err(ctx, 429 "invalid extra config desc len (%d)", 430 header.bLength); 431 r = LIBUSB_ERROR_IO; 432 goto err; 433 } else if (header.bLength > size) { 434 usbi_warn(ctx, 435 "short extra config desc read %d/%d", 436 size, header.bLength); 437 config->bNumInterfaces = (uint8_t)i; 438 return size; 439 } 440 441 /* If we find another "proper" descriptor then we're done */ 442 if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || 443 (header.bDescriptorType == LIBUSB_DT_INTERFACE) || 444 (header.bDescriptorType == LIBUSB_DT_CONFIG) || 445 (header.bDescriptorType == LIBUSB_DT_DEVICE)) 446 break; 447 448 usbi_dbg("skipping descriptor 0x%x", header.bDescriptorType); 449 buffer += header.bLength; 450 size -= header.bLength; 451 } 452 453 /* Copy any unknown descriptors into a storage area for */ 454 /* drivers to later parse */ 455 len = (int)(buffer - begin); 456 if (len) { 457 /* FIXME: We should realloc and append here */ 458 if (!config->extra_length) { 459 config->extra = malloc(len); 460 if (!config->extra) { 461 r = LIBUSB_ERROR_NO_MEM; 462 goto err; 463 } 464 465 memcpy((unsigned char *) config->extra, begin, len); 466 config->extra_length = len; 467 } 468 } 469 470 r = parse_interface(ctx, usb_interface + i, buffer, size, host_endian); 471 if (r < 0) 472 goto err; 473 if (r == 0) { 474 config->bNumInterfaces = (uint8_t)i; 475 break; 476 } 477 478 buffer += r; 479 size -= r; 480 } 481 482 return size; 483 484 err: 485 clear_configuration(config); 486 return r; 487 } 488 489 static int raw_desc_to_config(struct libusb_context *ctx, 490 unsigned char *buf, int size, int host_endian, 491 struct libusb_config_descriptor **config) 492 { 493 struct libusb_config_descriptor *_config = malloc(sizeof(*_config)); 494 int r; 495 496 if (!_config) 497 return LIBUSB_ERROR_NO_MEM; 498 499 r = parse_configuration(ctx, _config, buf, size, host_endian); 500 if (r < 0) { 501 usbi_err(ctx, "parse_configuration failed with error %d", r); 502 free(_config); 503 return r; 504 } else if (r > 0) { 505 usbi_warn(ctx, "still %d bytes of descriptor data left", r); 506 } 507 508 *config = _config; 509 return LIBUSB_SUCCESS; 510 } 511 512 int usbi_device_cache_descriptor(libusb_device *dev) 513 { 514 int r, host_endian = 0; 515 516 r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, 517 &host_endian); 518 if (r < 0) 519 return r; 520 521 if (!host_endian) { 522 dev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB); 523 dev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor); 524 dev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct); 525 dev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice); 526 } 527 528 return LIBUSB_SUCCESS; 529 } 530 531 /** \ingroup libusb_desc 532 * Get the USB device descriptor for a given device. 533 * 534 * This is a non-blocking function; the device descriptor is cached in memory. 535 * 536 * Note since libusb-1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, this 537 * function always succeeds. 538 * 539 * \param dev the device 540 * \param desc output location for the descriptor data 541 * \returns 0 on success or a LIBUSB_ERROR code on failure 542 */ 543 int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev, 544 struct libusb_device_descriptor *desc) 545 { 546 usbi_dbg(""); 547 memcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor, 548 sizeof (dev->device_descriptor)); 549 return 0; 550 } 551 552 /** \ingroup libusb_desc 553 * Get the USB configuration descriptor for the currently active configuration. 554 * This is a non-blocking function which does not involve any requests being 555 * sent to the device. 556 * 557 * \param dev a device 558 * \param config output location for the USB configuration descriptor. Only 559 * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() 560 * after use. 561 * \returns 0 on success 562 * \returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state 563 * \returns another LIBUSB_ERROR code on error 564 * \see libusb_get_config_descriptor 565 */ 566 int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, 567 struct libusb_config_descriptor **config) 568 { 569 struct libusb_config_descriptor _config; 570 unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; 571 unsigned char *buf = NULL; 572 int host_endian = 0; 573 int r; 574 575 r = usbi_backend->get_active_config_descriptor(dev, tmp, 576 LIBUSB_DT_CONFIG_SIZE, &host_endian); 577 if (r < 0) 578 return r; 579 if (r < LIBUSB_DT_CONFIG_SIZE) { 580 usbi_err(dev->ctx, "short config descriptor read %d/%d", 581 r, LIBUSB_DT_CONFIG_SIZE); 582 return LIBUSB_ERROR_IO; 583 } 584 585 usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); 586 buf = malloc(_config.wTotalLength); 587 if (!buf) 588 return LIBUSB_ERROR_NO_MEM; 589 590 r = usbi_backend->get_active_config_descriptor(dev, buf, 591 _config.wTotalLength, &host_endian); 592 if (r >= 0) 593 r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); 594 595 free(buf); 596 return r; 597 } 598 599 /** \ingroup libusb_desc 600 * Get a USB configuration descriptor based on its index. 601 * This is a non-blocking function which does not involve any requests being 602 * sent to the device. 603 * 604 * \param dev a device 605 * \param config_index the index of the configuration you wish to retrieve 606 * \param config output location for the USB configuration descriptor. Only 607 * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() 608 * after use. 609 * \returns 0 on success 610 * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist 611 * \returns another LIBUSB_ERROR code on error 612 * \see libusb_get_active_config_descriptor() 613 * \see libusb_get_config_descriptor_by_value() 614 */ 615 int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, 616 uint8_t config_index, struct libusb_config_descriptor **config) 617 { 618 struct libusb_config_descriptor _config; 619 unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; 620 unsigned char *buf = NULL; 621 int host_endian = 0; 622 int r; 623 624 usbi_dbg("index %d", config_index); 625 if (config_index >= dev->num_configurations) 626 return LIBUSB_ERROR_NOT_FOUND; 627 628 r = usbi_backend->get_config_descriptor(dev, config_index, tmp, 629 LIBUSB_DT_CONFIG_SIZE, &host_endian); 630 if (r < 0) 631 return r; 632 if (r < LIBUSB_DT_CONFIG_SIZE) { 633 usbi_err(dev->ctx, "short config descriptor read %d/%d", 634 r, LIBUSB_DT_CONFIG_SIZE); 635 return LIBUSB_ERROR_IO; 636 } 637 638 usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); 639 buf = malloc(_config.wTotalLength); 640 if (!buf) 641 return LIBUSB_ERROR_NO_MEM; 642 643 r = usbi_backend->get_config_descriptor(dev, config_index, buf, 644 _config.wTotalLength, &host_endian); 645 if (r >= 0) 646 r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); 647 648 free(buf); 649 return r; 650 } 651 652 /* iterate through all configurations, returning the index of the configuration 653 * matching a specific bConfigurationValue in the idx output parameter, or -1 654 * if the config was not found. 655 * returns 0 on success or a LIBUSB_ERROR code 656 */ 657 int usbi_get_config_index_by_value(struct libusb_device *dev, 658 uint8_t bConfigurationValue, int *idx) 659 { 660 uint8_t i; 661 662 usbi_dbg("value %d", bConfigurationValue); 663 for (i = 0; i < dev->num_configurations; i++) { 664 unsigned char tmp[6]; 665 int host_endian; 666 int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), 667 &host_endian); 668 if (r < 0) { 669 *idx = -1; 670 return r; 671 } 672 if (tmp[5] == bConfigurationValue) { 673 *idx = i; 674 return 0; 675 } 676 } 677 678 *idx = -1; 679 return 0; 680 } 681 682 /** \ingroup libusb_desc 683 * Get a USB configuration descriptor with a specific bConfigurationValue. 684 * This is a non-blocking function which does not involve any requests being 685 * sent to the device. 686 * 687 * \param dev a device 688 * \param bConfigurationValue the bConfigurationValue of the configuration you 689 * wish to retrieve 690 * \param config output location for the USB configuration descriptor. Only 691 * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() 692 * after use. 693 * \returns 0 on success 694 * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist 695 * \returns another LIBUSB_ERROR code on error 696 * \see libusb_get_active_config_descriptor() 697 * \see libusb_get_config_descriptor() 698 */ 699 int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, 700 uint8_t bConfigurationValue, struct libusb_config_descriptor **config) 701 { 702 int r, idx, host_endian; 703 unsigned char *buf = NULL; 704 705 if (usbi_backend->get_config_descriptor_by_value) { 706 r = usbi_backend->get_config_descriptor_by_value(dev, 707 bConfigurationValue, &buf, &host_endian); 708 if (r < 0) 709 return r; 710 return raw_desc_to_config(dev->ctx, buf, r, host_endian, config); 711 } 712 713 r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx); 714 if (r < 0) 715 return r; 716 else if (idx == -1) 717 return LIBUSB_ERROR_NOT_FOUND; 718 else 719 return libusb_get_config_descriptor(dev, (uint8_t) idx, config); 720 } 721 722 /** \ingroup libusb_desc 723 * Free a configuration descriptor obtained from 724 * libusb_get_active_config_descriptor() or libusb_get_config_descriptor(). 725 * It is safe to call this function with a NULL config parameter, in which 726 * case the function simply returns. 727 * 728 * \param config the configuration descriptor to free 729 */ 730 void API_EXPORTED libusb_free_config_descriptor( 731 struct libusb_config_descriptor *config) 732 { 733 if (!config) 734 return; 735 736 clear_configuration(config); 737 free(config); 738 } 739 740 /** \ingroup libusb_desc 741 * Get an endpoints superspeed endpoint companion descriptor (if any) 742 * 743 * \param ctx the context to operate on, or NULL for the default context 744 * \param endpoint endpoint descriptor from which to get the superspeed 745 * endpoint companion descriptor 746 * \param ep_comp output location for the superspeed endpoint companion 747 * descriptor. Only valid if 0 was returned. Must be freed with 748 * libusb_free_ss_endpoint_companion_descriptor() after use. 749 * \returns 0 on success 750 * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist 751 * \returns another LIBUSB_ERROR code on error 752 */ 753 int API_EXPORTED libusb_get_ss_endpoint_companion_descriptor( 754 struct libusb_context *ctx, 755 const struct libusb_endpoint_descriptor *endpoint, 756 struct libusb_ss_endpoint_companion_descriptor **ep_comp) 757 { 758 struct usb_descriptor_header header; 759 int size = endpoint->extra_length; 760 const unsigned char *buffer = endpoint->extra; 761 762 *ep_comp = NULL; 763 764 while (size >= DESC_HEADER_LENGTH) { 765 usbi_parse_descriptor(buffer, "bb", &header, 0); 766 if (header.bLength < 2 || header.bLength > size) { 767 usbi_err(ctx, "invalid descriptor length %d", 768 header.bLength); 769 return LIBUSB_ERROR_IO; 770 } 771 if (header.bDescriptorType != LIBUSB_DT_SS_ENDPOINT_COMPANION) { 772 buffer += header.bLength; 773 size -= header.bLength; 774 continue; 775 } 776 if (header.bLength < LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE) { 777 usbi_err(ctx, "invalid ss-ep-comp-desc length %d", 778 header.bLength); 779 return LIBUSB_ERROR_IO; 780 } 781 *ep_comp = malloc(sizeof(**ep_comp)); 782 if (*ep_comp == NULL) 783 return LIBUSB_ERROR_NO_MEM; 784 usbi_parse_descriptor(buffer, "bbbbw", *ep_comp, 0); 785 return LIBUSB_SUCCESS; 786 } 787 return LIBUSB_ERROR_NOT_FOUND; 788 } 789 790 /** \ingroup libusb_desc 791 * Free a superspeed endpoint companion descriptor obtained from 792 * libusb_get_ss_endpoint_companion_descriptor(). 793 * It is safe to call this function with a NULL ep_comp parameter, in which 794 * case the function simply returns. 795 * 796 * \param ep_comp the superspeed endpoint companion descriptor to free 797 */ 798 void API_EXPORTED libusb_free_ss_endpoint_companion_descriptor( 799 struct libusb_ss_endpoint_companion_descriptor *ep_comp) 800 { 801 free(ep_comp); 802 } 803 804 static int parse_bos(struct libusb_context *ctx, 805 struct libusb_bos_descriptor **bos, 806 unsigned char *buffer, int size, int host_endian) 807 { 808 struct libusb_bos_descriptor bos_header, *_bos; 809 struct libusb_bos_dev_capability_descriptor dev_cap; 810 int i; 811 812 if (size < LIBUSB_DT_BOS_SIZE) { 813 usbi_err(ctx, "short bos descriptor read %d/%d", 814 size, LIBUSB_DT_BOS_SIZE); 815 return LIBUSB_ERROR_IO; 816 } 817 818 usbi_parse_descriptor(buffer, "bbwb", &bos_header, host_endian); 819 if (bos_header.bDescriptorType != LIBUSB_DT_BOS) { 820 usbi_err(ctx, "unexpected descriptor %x (expected %x)", 821 bos_header.bDescriptorType, LIBUSB_DT_BOS); 822 return LIBUSB_ERROR_IO; 823 } 824 if (bos_header.bLength < LIBUSB_DT_BOS_SIZE) { 825 usbi_err(ctx, "invalid bos bLength (%d)", bos_header.bLength); 826 return LIBUSB_ERROR_IO; 827 } 828 if (bos_header.bLength > size) { 829 usbi_err(ctx, "short bos descriptor read %d/%d", 830 size, bos_header.bLength); 831 return LIBUSB_ERROR_IO; 832 } 833 834 _bos = calloc (1, 835 sizeof(*_bos) + bos_header.bNumDeviceCaps * sizeof(void *)); 836 if (!_bos) 837 return LIBUSB_ERROR_NO_MEM; 838 839 usbi_parse_descriptor(buffer, "bbwb", _bos, host_endian); 840 buffer += bos_header.bLength; 841 size -= bos_header.bLength; 842 843 /* Get the device capability descriptors */ 844 for (i = 0; i < bos_header.bNumDeviceCaps; i++) { 845 if (size < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { 846 usbi_warn(ctx, "short dev-cap descriptor read %d/%d", 847 size, LIBUSB_DT_DEVICE_CAPABILITY_SIZE); 848 break; 849 } 850 usbi_parse_descriptor(buffer, "bbb", &dev_cap, host_endian); 851 if (dev_cap.bDescriptorType != LIBUSB_DT_DEVICE_CAPABILITY) { 852 usbi_warn(ctx, "unexpected descriptor %x (expected %x)", 853 dev_cap.bDescriptorType, LIBUSB_DT_DEVICE_CAPABILITY); 854 break; 855 } 856 if (dev_cap.bLength < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { 857 usbi_err(ctx, "invalid dev-cap bLength (%d)", 858 dev_cap.bLength); 859 libusb_free_bos_descriptor(_bos); 860 return LIBUSB_ERROR_IO; 861 } 862 if (dev_cap.bLength > size) { 863 usbi_warn(ctx, "short dev-cap descriptor read %d/%d", 864 size, dev_cap.bLength); 865 break; 866 } 867 868 _bos->dev_capability[i] = malloc(dev_cap.bLength); 869 if (!_bos->dev_capability[i]) { 870 libusb_free_bos_descriptor(_bos); 871 return LIBUSB_ERROR_NO_MEM; 872 } 873 memcpy(_bos->dev_capability[i], buffer, dev_cap.bLength); 874 buffer += dev_cap.bLength; 875 size -= dev_cap.bLength; 876 } 877 _bos->bNumDeviceCaps = (uint8_t)i; 878 *bos = _bos; 879 880 return LIBUSB_SUCCESS; 881 } 882 883 /** \ingroup libusb_desc 884 * Get a Binary Object Store (BOS) descriptor 885 * This is a BLOCKING function, which will send requests to the device. 886 * 887 * \param dev_handle the handle of an open libusb device 888 * \param bos output location for the BOS descriptor. Only valid if 0 was returned. 889 * Must be freed with \ref libusb_free_bos_descriptor() after use. 890 * \returns 0 on success 891 * \returns LIBUSB_ERROR_NOT_FOUND if the device doesn't have a BOS descriptor 892 * \returns another LIBUSB_ERROR code on error 893 */ 894 int API_EXPORTED libusb_get_bos_descriptor(libusb_device_handle *dev_handle, 895 struct libusb_bos_descriptor **bos) 896 { 897 struct libusb_bos_descriptor _bos; 898 uint8_t bos_header[LIBUSB_DT_BOS_SIZE] = {0}; 899 unsigned char *bos_data = NULL; 900 const int host_endian = 0; 901 int r; 902 903 /* Read the BOS. This generates 2 requests on the bus, 904 * one for the header, and one for the full BOS */ 905 r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_header, 906 LIBUSB_DT_BOS_SIZE); 907 if (r < 0) { 908 if (r != LIBUSB_ERROR_PIPE) 909 usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); 910 return r; 911 } 912 if (r < LIBUSB_DT_BOS_SIZE) { 913 usbi_err(HANDLE_CTX(dev_handle), "short BOS read %d/%d", 914 r, LIBUSB_DT_BOS_SIZE); 915 return LIBUSB_ERROR_IO; 916 } 917 918 usbi_parse_descriptor(bos_header, "bbwb", &_bos, host_endian); 919 usbi_dbg("found BOS descriptor: size %d bytes, %d capabilities", 920 _bos.wTotalLength, _bos.bNumDeviceCaps); 921 bos_data = calloc(_bos.wTotalLength, 1); 922 if (bos_data == NULL) 923 return LIBUSB_ERROR_NO_MEM; 924 925 r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_data, 926 _bos.wTotalLength); 927 if (r >= 0) 928 r = parse_bos(HANDLE_CTX(dev_handle), bos, bos_data, r, host_endian); 929 else 930 usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); 931 932 free(bos_data); 933 return r; 934 } 935 936 /** \ingroup libusb_desc 937 * Free a BOS descriptor obtained from libusb_get_bos_descriptor(). 938 * It is safe to call this function with a NULL bos parameter, in which 939 * case the function simply returns. 940 * 941 * \param bos the BOS descriptor to free 942 */ 943 void API_EXPORTED libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos) 944 { 945 int i; 946 947 if (!bos) 948 return; 949 950 for (i = 0; i < bos->bNumDeviceCaps; i++) 951 free(bos->dev_capability[i]); 952 free(bos); 953 } 954 955 /** \ingroup libusb_desc 956 * Get an USB 2.0 Extension descriptor 957 * 958 * \param ctx the context to operate on, or NULL for the default context 959 * \param dev_cap Device Capability descriptor with a bDevCapabilityType of 960 * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION 961 * LIBUSB_BT_USB_2_0_EXTENSION 962 * \param usb_2_0_extension output location for the USB 2.0 Extension 963 * descriptor. Only valid if 0 was returned. Must be freed with 964 * libusb_free_usb_2_0_extension_descriptor() after use. 965 * \returns 0 on success 966 * \returns a LIBUSB_ERROR code on error 967 */ 968 int API_EXPORTED libusb_get_usb_2_0_extension_descriptor( 969 struct libusb_context *ctx, 970 struct libusb_bos_dev_capability_descriptor *dev_cap, 971 struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension) 972 { 973 struct libusb_usb_2_0_extension_descriptor *_usb_2_0_extension; 974 const int host_endian = 0; 975 976 if (dev_cap->bDevCapabilityType != LIBUSB_BT_USB_2_0_EXTENSION) { 977 usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", 978 dev_cap->bDevCapabilityType, 979 LIBUSB_BT_USB_2_0_EXTENSION); 980 return LIBUSB_ERROR_INVALID_PARAM; 981 } 982 if (dev_cap->bLength < LIBUSB_BT_USB_2_0_EXTENSION_SIZE) { 983 usbi_err(ctx, "short dev-cap descriptor read %d/%d", 984 dev_cap->bLength, LIBUSB_BT_USB_2_0_EXTENSION_SIZE); 985 return LIBUSB_ERROR_IO; 986 } 987 988 _usb_2_0_extension = malloc(sizeof(*_usb_2_0_extension)); 989 if (!_usb_2_0_extension) 990 return LIBUSB_ERROR_NO_MEM; 991 992 usbi_parse_descriptor((unsigned char *)dev_cap, "bbbd", 993 _usb_2_0_extension, host_endian); 994 995 *usb_2_0_extension = _usb_2_0_extension; 996 return LIBUSB_SUCCESS; 997 } 998 999 /** \ingroup libusb_desc 1000 * Free a USB 2.0 Extension descriptor obtained from 1001 * libusb_get_usb_2_0_extension_descriptor(). 1002 * It is safe to call this function with a NULL usb_2_0_extension parameter, 1003 * in which case the function simply returns. 1004 * 1005 * \param usb_2_0_extension the USB 2.0 Extension descriptor to free 1006 */ 1007 void API_EXPORTED libusb_free_usb_2_0_extension_descriptor( 1008 struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension) 1009 { 1010 free(usb_2_0_extension); 1011 } 1012 1013 /** \ingroup libusb_desc 1014 * Get a SuperSpeed USB Device Capability descriptor 1015 * 1016 * \param ctx the context to operate on, or NULL for the default context 1017 * \param dev_cap Device Capability descriptor with a bDevCapabilityType of 1018 * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY 1019 * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY 1020 * \param ss_usb_device_cap output location for the SuperSpeed USB Device 1021 * Capability descriptor. Only valid if 0 was returned. Must be freed with 1022 * libusb_free_ss_usb_device_capability_descriptor() after use. 1023 * \returns 0 on success 1024 * \returns a LIBUSB_ERROR code on error 1025 */ 1026 int API_EXPORTED libusb_get_ss_usb_device_capability_descriptor( 1027 struct libusb_context *ctx, 1028 struct libusb_bos_dev_capability_descriptor *dev_cap, 1029 struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap) 1030 { 1031 struct libusb_ss_usb_device_capability_descriptor *_ss_usb_device_cap; 1032 const int host_endian = 0; 1033 1034 if (dev_cap->bDevCapabilityType != LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { 1035 usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", 1036 dev_cap->bDevCapabilityType, 1037 LIBUSB_BT_SS_USB_DEVICE_CAPABILITY); 1038 return LIBUSB_ERROR_INVALID_PARAM; 1039 } 1040 if (dev_cap->bLength < LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) { 1041 usbi_err(ctx, "short dev-cap descriptor read %d/%d", 1042 dev_cap->bLength, LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE); 1043 return LIBUSB_ERROR_IO; 1044 } 1045 1046 _ss_usb_device_cap = malloc(sizeof(*_ss_usb_device_cap)); 1047 if (!_ss_usb_device_cap) 1048 return LIBUSB_ERROR_NO_MEM; 1049 1050 usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbwbbw", 1051 _ss_usb_device_cap, host_endian); 1052 1053 *ss_usb_device_cap = _ss_usb_device_cap; 1054 return LIBUSB_SUCCESS; 1055 } 1056 1057 /** \ingroup libusb_desc 1058 * Free a SuperSpeed USB Device Capability descriptor obtained from 1059 * libusb_get_ss_usb_device_capability_descriptor(). 1060 * It is safe to call this function with a NULL ss_usb_device_cap 1061 * parameter, in which case the function simply returns. 1062 * 1063 * \param ss_usb_device_cap the USB 2.0 Extension descriptor to free 1064 */ 1065 void API_EXPORTED libusb_free_ss_usb_device_capability_descriptor( 1066 struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap) 1067 { 1068 free(ss_usb_device_cap); 1069 } 1070 1071 /** \ingroup libusb_desc 1072 * Get a Container ID descriptor 1073 * 1074 * \param ctx the context to operate on, or NULL for the default context 1075 * \param dev_cap Device Capability descriptor with a bDevCapabilityType of 1076 * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID 1077 * LIBUSB_BT_CONTAINER_ID 1078 * \param container_id output location for the Container ID descriptor. 1079 * Only valid if 0 was returned. Must be freed with 1080 * libusb_free_container_id_descriptor() after use. 1081 * \returns 0 on success 1082 * \returns a LIBUSB_ERROR code on error 1083 */ 1084 int API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx, 1085 struct libusb_bos_dev_capability_descriptor *dev_cap, 1086 struct libusb_container_id_descriptor **container_id) 1087 { 1088 struct libusb_container_id_descriptor *_container_id; 1089 const int host_endian = 0; 1090 1091 if (dev_cap->bDevCapabilityType != LIBUSB_BT_CONTAINER_ID) { 1092 usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", 1093 dev_cap->bDevCapabilityType, 1094 LIBUSB_BT_CONTAINER_ID); 1095 return LIBUSB_ERROR_INVALID_PARAM; 1096 } 1097 if (dev_cap->bLength < LIBUSB_BT_CONTAINER_ID_SIZE) { 1098 usbi_err(ctx, "short dev-cap descriptor read %d/%d", 1099 dev_cap->bLength, LIBUSB_BT_CONTAINER_ID_SIZE); 1100 return LIBUSB_ERROR_IO; 1101 } 1102 1103 _container_id = malloc(sizeof(*_container_id)); 1104 if (!_container_id) 1105 return LIBUSB_ERROR_NO_MEM; 1106 1107 usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbu", 1108 _container_id, host_endian); 1109 1110 *container_id = _container_id; 1111 return LIBUSB_SUCCESS; 1112 } 1113 1114 /** \ingroup libusb_desc 1115 * Free a Container ID descriptor obtained from 1116 * libusb_get_container_id_descriptor(). 1117 * It is safe to call this function with a NULL container_id parameter, 1118 * in which case the function simply returns. 1119 * 1120 * \param container_id the USB 2.0 Extension descriptor to free 1121 */ 1122 void API_EXPORTED libusb_free_container_id_descriptor( 1123 struct libusb_container_id_descriptor *container_id) 1124 { 1125 free(container_id); 1126 } 1127 1128 /** \ingroup libusb_desc 1129 * Retrieve a string descriptor in C style ASCII. 1130 * 1131 * Wrapper around libusb_get_string_descriptor(). Uses the first language 1132 * supported by the device. 1133 * 1134 * \param dev_handle a device handle 1135 * \param desc_index the index of the descriptor to retrieve 1136 * \param data output buffer for ASCII string descriptor 1137 * \param length size of data buffer 1138 * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure 1139 */ 1140 int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, 1141 uint8_t desc_index, unsigned char *data, int length) 1142 { 1143 unsigned char tbuf[255]; /* Some devices choke on size > 255 */ 1144 int r, si, di; 1145 uint16_t langid; 1146 1147 /* Asking for the zero'th index is special - it returns a string 1148 * descriptor that contains all the language IDs supported by the 1149 * device. Typically there aren't many - often only one. Language 1150 * IDs are 16 bit numbers, and they start at the third byte in the 1151 * descriptor. There's also no point in trying to read descriptor 0 1152 * with this function. See USB 2.0 specification section 9.6.7 for 1153 * more information. 1154 */ 1155 1156 if (desc_index == 0) 1157 return LIBUSB_ERROR_INVALID_PARAM; 1158 1159 r = libusb_get_string_descriptor(dev_handle, 0, 0, tbuf, sizeof(tbuf)); 1160 if (r < 0) 1161 return r; 1162 1163 if (r < 4) 1164 return LIBUSB_ERROR_IO; 1165 1166 langid = tbuf[2] | (tbuf[3] << 8); 1167 1168 r = libusb_get_string_descriptor(dev_handle, desc_index, langid, tbuf, 1169 sizeof(tbuf)); 1170 if (r < 0) 1171 return r; 1172 1173 if (tbuf[1] != LIBUSB_DT_STRING) 1174 return LIBUSB_ERROR_IO; 1175 1176 if (tbuf[0] > r) 1177 return LIBUSB_ERROR_IO; 1178 1179 for (di = 0, si = 2; si < tbuf[0]; si += 2) { 1180 if (di >= (length - 1)) 1181 break; 1182 1183 if ((tbuf[si] & 0x80) || (tbuf[si + 1])) /* non-ASCII */ 1184 data[di++] = '?'; 1185 else 1186 data[di++] = tbuf[si]; 1187 } 1188 1189 data[di] = 0; 1190 return di; 1191 } 1192