Changes in uspace/lib/usbdev/src/request.c [58563585:1cf26ab] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/request.c
r58563585 r1cf26ab 34 34 */ 35 35 #include <usb/dev/request.h> 36 #include <usb/request.h>37 #include <usb/usb.h>38 39 36 #include <errno.h> 40 #include <mem.h> 41 #include <stdlib.h> 42 #include <str.h> 37 #include <assert.h> 38 #include <usb/debug.h> 43 39 44 40 #define MAX_DATA_LENGTH ((size_t)(0xFFFF)) … … 50 46 * @see usb_pipe_control_write 51 47 * 52 * @param pipe 48 * @param pipe Pipe used for the communication. 53 49 * @param request_type Request type (standard/class/vendor). 54 * @param recipient Request recipient (e.g. device or endpoint). 55 * @param request Actual request (e.g. GET_DESCRIPTOR). 56 * @param value Value of @c wValue field of setup packet 57 * (must be in USB endianness). 58 * @param index Value of @c wIndex field of setup packet 59 * (must be in USB endianness). 60 * @param data Data to be sent during DATA stage 61 * (expected to be in USB endianness). 62 * @param data_size Size of the @p data buffer (in native endianness). 63 * 50 * @param recipient Request recipient (e.g. device or endpoint). 51 * @param request Actual request (e.g. GET_DESCRIPTOR). 52 * @param value Value of @c wValue field of setup packet 53 * (must be in USB endianness). 54 * @param index Value of @c wIndex field of setup packet 55 * (must be in USB endianness). 56 * @param data Data to be sent during DATA stage 57 * (expected to be in USB endianness). 58 * @param data_size Size of the @p data buffer (in native endianness). 64 59 * @return Error code. 65 60 * @retval EBADMEM @p pipe is NULL. 66 61 * @retval EBADMEM @p data is NULL and @p data_size is not zero. 67 62 * @retval ERANGE Data buffer too large. 68 *69 63 */ 70 64 int usb_control_request_set(usb_pipe_t *pipe, 71 65 usb_request_type_t request_type, usb_request_recipient_t recipient, 72 uint8_t request, uint16_t value, uint16_t index, 73 const void *data, size_t data_size) 66 uint8_t request, 67 uint16_t value, uint16_t index, 68 void *data, size_t data_size) 74 69 { 75 70 if (pipe == NULL) { … … 90 85 */ 91 86 92 const usb_device_request_setup_packet_t setup_packet = {93 .request_type = (request_type << 5) | recipient,94 .request = request,95 .value = value,96 .index = index,97 .length = (uint16_t) data_size,98 }; 99 100 return usb_pipe_control_write(pipe,101 &setup_packet, sizeof(setup_packet),data, data_size);102 } 103 104 /** Generic wrapper for GET requests using standard control request format. 105 * 106 * @see usb_pipe_control_read107 *108 * @param pipe Pipe used for the communication.109 * @param request_type Request type (standard/class/vendor).110 * @param recipient Request recipient (e.g. device or endpoint).111 * @param request Actual request (e.g. GET_DESCRIPTOR).112 * @param value Value of @c wValue field of setup packet113 * (must be in USB endianness).114 * @param index Value of @c wIndexfield of setup packet115 *(must be in USB endianness).116 * @param data Buffer where to store data accepted during117 * the DATA stage (they will come in USB endianness).118 * @param data_size Size of the @p data buffer119 * (in nativeendianness).120 * @param actual_data_size Actual size of transfered data121 *(in native endianness).122 *123 * @return Error code.124 * @retval EBADMEM @p pipe is NULL.125 * @retval EBADMEM @p data is NULL and @p data_size is not zero.126 * @retval ERANGE Data buffer too large.127 *128 */87 usb_device_request_setup_packet_t setup_packet; 88 setup_packet.request_type = (request_type << 5) | recipient; 89 setup_packet.request = request; 90 setup_packet.value = value; 91 setup_packet.index = index; 92 setup_packet.length = (uint16_t) data_size; 93 94 int rc = usb_pipe_control_write(pipe, 95 &setup_packet, sizeof(setup_packet), 96 data, data_size); 97 98 return rc; 99 } 100 101 /** Generic wrapper for GET requests using standard control request format. 102 * 103 * @see usb_pipe_control_read 104 * 105 * @param pipe Pipe used for the communication. 106 * @param request_type Request type (standard/class/vendor). 107 * @param recipient Request recipient (e.g. device or endpoint). 108 * @param request Actual request (e.g. GET_DESCRIPTOR). 109 * @param value Value of @c wValue field of setup packet 110 * (must be in USB endianness). 111 * @param index Value of @c wIndex field of setup packet 112 * (must be in USB endianness). 113 * @param data Buffer where to store data accepted during the DATA stage. 114 * (they will come in USB endianness). 115 * @param data_size Size of the @p data buffer 116 * (in native endianness). 117 * @param actual_data_size Actual size of transfered data 118 * (in native endianness). 119 * @return Error code. 120 * @retval EBADMEM @p pipe is NULL. 121 * @retval EBADMEM @p data is NULL and @p data_size is not zero. 122 * @retval ERANGE Data buffer too large. 123 */ 129 124 int usb_control_request_get(usb_pipe_t *pipe, 130 125 usb_request_type_t request_type, usb_request_recipient_t recipient, 131 uint8_t request, uint16_t value, uint16_t index, 126 uint8_t request, 127 uint16_t value, uint16_t index, 132 128 void *data, size_t data_size, size_t *actual_data_size) 133 129 { … … 213 209 { 214 210 if (request_type == USB_REQUEST_TYPE_STANDARD) { 215 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0)) { 211 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 212 && (index != 0)) { 216 213 return EINVAL; 217 214 } 218 215 } 219 216 220 return usb_control_request_set(pipe, 221 request_type, recipient, USB_DEVREQ_CLEAR_FEATURE, 222 uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0); 217 int rc = usb_control_request_set(pipe, request_type, recipient, 218 USB_DEVREQ_CLEAR_FEATURE, 219 uint16_host2usb(feature_selector), uint16_host2usb(index), 220 NULL, 0); 221 222 return rc; 223 223 } 224 224 … … 237 237 { 238 238 if (request_type == USB_REQUEST_TYPE_STANDARD) { 239 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0)) { 239 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 240 && (index != 0)) { 240 241 return EINVAL; 241 242 } 242 243 } 243 244 244 return usb_control_request_set(pipe, 245 request_type, recipient, USB_DEVREQ_SET_FEATURE, 246 uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0); 245 int rc = usb_control_request_set(pipe, request_type, recipient, 246 USB_DEVREQ_SET_FEATURE, 247 uint16_host2usb(feature_selector), uint16_host2usb(index), 248 NULL, 0); 249 250 return rc; 247 251 } 248 252 … … 273 277 } 274 278 275 /*276 * The wValue field specifies the descriptor type in the high byte277 * and the descriptor index in the low byte. USB 1.1 spec p. 189278 */279 279 const uint16_t wValue = descriptor_index | (descriptor_type << 8); 280 280 … … 313 313 * Get only first byte to retrieve descriptor length. 314 314 */ 315 uint8_t tmp_buffer ;315 uint8_t tmp_buffer[1]; 316 316 size_t bytes_transfered; 317 317 rc = usb_request_get_descriptor(pipe, request_type, recipient, 318 318 descriptor_type, descriptor_index, language, 319 &tmp_buffer, sizeof(tmp_buffer), &bytes_transfered);319 &tmp_buffer, 1, &bytes_transfered); 320 320 if (rc != EOK) { 321 321 return rc; 322 322 } 323 323 if (bytes_transfered != 1) { 324 return ELIMIT; 325 } 326 327 const size_t size = tmp_buffer; 324 /* FIXME: some better error code? */ 325 return ESTALL; 326 } 327 328 size_t size = tmp_buffer[0]; 328 329 if (size == 0) { 329 return ELIMIT; 330 /* FIXME: some better error code? */ 331 return ESTALL; 330 332 } 331 333 … … 347 349 if (bytes_transfered != size) { 348 350 free(buffer); 349 return ELIMIT; 351 /* FIXME: some better error code? */ 352 return ESTALL; 350 353 } 351 354 … … 375 378 int rc = usb_request_get_descriptor(pipe, 376 379 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 377 USB_DESCTYPE_DEVICE, 0, 0, &descriptor_tmp, sizeof(descriptor_tmp), 380 USB_DESCTYPE_DEVICE, 0, 0, 381 &descriptor_tmp, sizeof(descriptor_tmp), 378 382 &actually_transferred); 379 383 … … 417 421 size_t actually_transferred = 0; 418 422 usb_standard_configuration_descriptor_t descriptor_tmp; 419 constint rc = usb_request_get_descriptor(pipe,423 int rc = usb_request_get_descriptor(pipe, 420 424 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 421 425 USB_DESCTYPE_CONFIGURATION, index, 0, … … 475 479 int usb_request_get_full_configuration_descriptor_alloc( 476 480 usb_pipe_t *pipe, int index, 477 constvoid **descriptor_ptr, size_t *descriptor_size)481 void **descriptor_ptr, size_t *descriptor_size) 478 482 { 479 483 int rc; … … 542 546 usb_request_type_t request_type, usb_request_recipient_t recipient, 543 547 uint8_t descriptor_type, uint8_t descriptor_index, 544 uint16_t language, const void *buffer, size_t size) 548 uint16_t language, 549 void *buffer, size_t size) 545 550 { 546 551 if (buffer == NULL) { … … 555 560 556 561 return usb_control_request_set(pipe, 557 request_type, recipient, USB_DEVREQ_SET_DESCRIPTOR, 558 wValue, language, buffer, size); 562 request_type, recipient, 563 USB_DEVREQ_SET_DESCRIPTOR, 564 wValue, language, 565 buffer, size); 559 566 } 560 567 … … 571 578 size_t actual_size; 572 579 573 constint rc = usb_control_request_get(pipe,580 int rc = usb_control_request_get(pipe, 574 581 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 575 USB_DEVREQ_GET_CONFIGURATION, 0, 0, &value, 1, &actual_size); 582 USB_DEVREQ_GET_CONFIGURATION, 583 0, 0, 584 &value, 1, &actual_size); 576 585 577 586 if (rc != EOK) { … … 598 607 uint8_t configuration_value) 599 608 { 600 constuint16_t config_value609 uint16_t config_value 601 610 = uint16_host2usb((uint16_t) configuration_value); 602 611 … … 620 629 size_t actual_size; 621 630 622 constint rc = usb_control_request_get(pipe,631 int rc = usb_control_request_get(pipe, 623 632 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE, 624 633 USB_DEVREQ_GET_INTERFACE, 625 634 0, uint16_host2usb((uint16_t) interface_index), 626 &value, sizeof(value), &actual_size);635 &value, 1, &actual_size); 627 636 628 637 if (rc != EOK) { … … 669 678 l18_win_locales_t **languages_ptr, size_t *languages_count) 670 679 { 671 if (languages_ptr == NULL || languages_count == NULL) { 680 int rc; 681 682 if (languages_ptr == NULL) { 683 return EBADMEM; 684 } 685 if (languages_count == NULL) { 672 686 return EBADMEM; 673 687 } … … 675 689 uint8_t *string_descriptor = NULL; 676 690 size_t string_descriptor_size = 0; 677 const intrc = usb_request_get_descriptor_alloc(pipe,691 rc = usb_request_get_descriptor_alloc(pipe, 678 692 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 679 693 USB_DESCTYPE_STRING, 0, 0, … … 696 710 } 697 711 698 constsize_t langs_count = string_descriptor_size / 2;699 l18_win_locales_t *langs =700 calloc(langs_count, sizeof(l18_win_locales_t));712 size_t langs_count = string_descriptor_size / 2; 713 l18_win_locales_t *langs 714 = malloc(sizeof(l18_win_locales_t) * langs_count); 701 715 if (langs == NULL) { 702 716 free(string_descriptor); … … 704 718 } 705 719 706 for (size_t i = 0; i < langs_count; i++) { 720 size_t i; 721 for (i = 0; i < langs_count; i++) { 707 722 /* Language code from the descriptor is in USB endianness. */ 708 723 /* FIXME: is this really correct? */ 709 const uint16_t lang_code = 710 (string_descriptor[2 + 2 * i + 1] << 8) 724 uint16_t lang_code = (string_descriptor[2 + 2 * i + 1] << 8) 711 725 + string_descriptor[2 + 2 * i]; 712 726 langs[i] = uint16_usb2host(lang_code); … … 747 761 } 748 762 /* Language is actually two byte value. */ 749 if (lang > L18N_WIN_LOCALE_MAX) {763 if (lang > 0xFFFF) { 750 764 return ERANGE; 751 765 } … … 781 795 } 782 796 783 constsize_t string_char_count = string_size / 2;797 size_t string_char_count = string_size / 2; 784 798 string_chars = malloc(sizeof(wchar_t) * (string_char_count + 1)); 785 799 if (string_chars == NULL) { … … 793 807 * do not have them). 794 808 */ 795 for (size_t i = 0; i < string_char_count; i++) { 796 const uint16_t uni_char = (string[2 + 2 * i + 1] << 8) 809 size_t i; 810 for (i = 0; i < string_char_count; i++) { 811 uint16_t uni_char = (string[2 + 2 * i + 1] << 8) 797 812 + string[2 + 2 * i]; 798 813 string_chars[i] = uni_char; … … 812 827 813 828 leave: 814 free(string); 815 free(string_chars); 829 if (string != NULL) { 830 free(string); 831 } 832 if (string_chars != NULL) { 833 free(string_chars); 834 } 816 835 817 836 return rc; … … 828 847 return usb_request_clear_feature(pipe, 829 848 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_ENDPOINT, 830 uint16_host2usb(USB_FEATURE_ ENDPOINT_HALT),849 uint16_host2usb(USB_FEATURE_SELECTOR_ENDPOINT_HALT), 831 850 uint16_host2usb(ep_index)); 832 851 }
Note:
See TracChangeset
for help on using the changeset viewer.