Changeset b4b534ac in mainline for uspace/lib/usbdev/src/request.c
- Timestamp:
- 2016-07-22T08:24:47Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f76d2c2
- Parents:
- 5b18137 (diff), 8351f9a4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/request.c
r5b18137 rb4b534ac 34 34 */ 35 35 #include <usb/dev/request.h> 36 #include <usb/request.h> 37 #include <usb/usb.h> 38 36 39 #include <errno.h> 37 #include <assert.h> 38 #include <usb/debug.h> 40 #include <mem.h> 41 #include <stdlib.h> 42 #include <str.h> 39 43 40 44 #define MAX_DATA_LENGTH ((size_t)(0xFFFF)) … … 51 55 * @param request Actual request (e.g. GET_DESCRIPTOR). 52 56 * @param value Value of @c wValue field of setup packet 53 * 57 * (must be in USB endianness). 54 58 * @param index Value of @c wIndex field of setup packet 55 * 59 * (must be in USB endianness). 56 60 * @param data Data to be sent during DATA stage 57 * 61 * (expected to be in USB endianness). 58 62 * @param data_size Size of the @p data buffer (in native endianness). 59 63 * @return Error code. … … 64 68 int usb_control_request_set(usb_pipe_t *pipe, 65 69 usb_request_type_t request_type, usb_request_recipient_t recipient, 66 uint8_t request, 67 uint16_t value, uint16_t index, 68 void *data, size_t data_size) 70 uint8_t request, uint16_t value, uint16_t index, 71 const void *data, size_t data_size) 69 72 { 70 73 if (pipe == NULL) { … … 85 88 */ 86 89 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; 90 const usb_device_request_setup_packet_t setup_packet = { 91 .request_type = (request_type << 5) | recipient, 92 .request = request, 93 .value = value, 94 .index = index, 95 .length = (uint16_t) data_size, 96 }; 97 98 return usb_pipe_control_write(pipe, 99 &setup_packet, sizeof(setup_packet), data, data_size); 99 100 } 100 101 … … 108 109 * @param request Actual request (e.g. GET_DESCRIPTOR). 109 110 * @param value Value of @c wValue field of setup packet 110 * 111 * (must be in USB endianness). 111 112 * @param index Value of @c wIndex field of setup packet 112 113 * (must be in USB endianness). … … 114 115 * (they will come in USB endianness). 115 116 * @param data_size Size of the @p data buffer 116 * 117 * (in native endianness). 117 118 * @param actual_data_size Actual size of transfered data 118 * 119 * (in native endianness). 119 120 * @return Error code. 120 121 * @retval EBADMEM @p pipe is NULL. … … 124 125 int usb_control_request_get(usb_pipe_t *pipe, 125 126 usb_request_type_t request_type, usb_request_recipient_t recipient, 126 uint8_t request, 127 uint16_t value, uint16_t index, 127 uint8_t request, uint16_t value, uint16_t index, 128 128 void *data, size_t data_size, size_t *actual_data_size) 129 129 { … … 209 209 { 210 210 if (request_type == USB_REQUEST_TYPE_STANDARD) { 211 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 212 && (index != 0)){211 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0)) 212 { 213 213 return EINVAL; 214 214 } 215 215 } 216 216 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; 217 return usb_control_request_set(pipe, 218 request_type, recipient, USB_DEVREQ_CLEAR_FEATURE, 219 uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0); 223 220 } 224 221 … … 237 234 { 238 235 if (request_type == USB_REQUEST_TYPE_STANDARD) { 239 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 240 && (index != 0)){236 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0)) 237 { 241 238 return EINVAL; 242 239 } 243 240 } 244 241 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; 242 return usb_control_request_set(pipe, 243 request_type, recipient, USB_DEVREQ_SET_FEATURE, 244 uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0); 251 245 } 252 246 … … 277 271 } 278 272 273 /* The wValue field specifies the descriptor type in the high byte 274 * and the descriptor index in the low byte. USB 1.1 spec p. 189 275 */ 279 276 const uint16_t wValue = descriptor_index | (descriptor_type << 8); 280 277 … … 313 310 * Get only first byte to retrieve descriptor length. 314 311 */ 315 uint8_t tmp_buffer [1];312 uint8_t tmp_buffer; 316 313 size_t bytes_transfered; 317 314 rc = usb_request_get_descriptor(pipe, request_type, recipient, 318 315 descriptor_type, descriptor_index, language, 319 &tmp_buffer, 1, &bytes_transfered);316 &tmp_buffer, sizeof(tmp_buffer), &bytes_transfered); 320 317 if (rc != EOK) { 321 318 return rc; 322 319 } 323 320 if (bytes_transfered != 1) { 324 /* FIXME: some better error code? */ 325 return ESTALL; 326 } 327 328 size_t size = tmp_buffer[0]; 321 return ELIMIT; 322 } 323 324 const size_t size = tmp_buffer; 329 325 if (size == 0) { 330 /* FIXME: some better error code? */ 331 return ESTALL; 326 return ELIMIT; 332 327 } 333 328 … … 349 344 if (bytes_transfered != size) { 350 345 free(buffer); 351 /* FIXME: some better error code? */ 352 return ESTALL; 346 return ELIMIT; 353 347 } 354 348 … … 378 372 int rc = usb_request_get_descriptor(pipe, 379 373 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 380 USB_DESCTYPE_DEVICE, 0, 0, 381 &descriptor_tmp, sizeof(descriptor_tmp), 374 USB_DESCTYPE_DEVICE, 0, 0, &descriptor_tmp, sizeof(descriptor_tmp), 382 375 &actually_transferred); 383 376 … … 421 414 size_t actually_transferred = 0; 422 415 usb_standard_configuration_descriptor_t descriptor_tmp; 423 int rc = usb_request_get_descriptor(pipe,416 const int rc = usb_request_get_descriptor(pipe, 424 417 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 425 418 USB_DESCTYPE_CONFIGURATION, index, 0, … … 479 472 int usb_request_get_full_configuration_descriptor_alloc( 480 473 usb_pipe_t *pipe, int index, 481 void **descriptor_ptr, size_t *descriptor_size)474 const void **descriptor_ptr, size_t *descriptor_size) 482 475 { 483 476 int rc; … … 546 539 usb_request_type_t request_type, usb_request_recipient_t recipient, 547 540 uint8_t descriptor_type, uint8_t descriptor_index, 548 uint16_t language, 549 void *buffer, size_t size) 541 uint16_t language, const void *buffer, size_t size) 550 542 { 551 543 if (buffer == NULL) { … … 560 552 561 553 return usb_control_request_set(pipe, 562 request_type, recipient, 563 USB_DEVREQ_SET_DESCRIPTOR, 564 wValue, language, 565 buffer, size); 554 request_type, recipient, USB_DEVREQ_SET_DESCRIPTOR, 555 wValue, language, buffer, size); 566 556 } 567 557 … … 578 568 size_t actual_size; 579 569 580 int rc = usb_control_request_get(pipe,570 const int rc = usb_control_request_get(pipe, 581 571 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 582 USB_DEVREQ_GET_CONFIGURATION, 583 0, 0, 584 &value, 1, &actual_size); 572 USB_DEVREQ_GET_CONFIGURATION, 0, 0, &value, 1, &actual_size); 585 573 586 574 if (rc != EOK) { … … 607 595 uint8_t configuration_value) 608 596 { 609 uint16_t config_value597 const uint16_t config_value 610 598 = uint16_host2usb((uint16_t) configuration_value); 611 599 … … 629 617 size_t actual_size; 630 618 631 int rc = usb_control_request_get(pipe,619 const int rc = usb_control_request_get(pipe, 632 620 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE, 633 621 USB_DEVREQ_GET_INTERFACE, 634 622 0, uint16_host2usb((uint16_t) interface_index), 635 &value, 1, &actual_size);623 &value, sizeof(value), &actual_size); 636 624 637 625 if (rc != EOK) { … … 678 666 l18_win_locales_t **languages_ptr, size_t *languages_count) 679 667 { 680 int rc; 681 682 if (languages_ptr == NULL) { 683 return EBADMEM; 684 } 685 if (languages_count == NULL) { 668 if (languages_ptr == NULL || languages_count == NULL) { 686 669 return EBADMEM; 687 670 } … … 689 672 uint8_t *string_descriptor = NULL; 690 673 size_t string_descriptor_size = 0; 691 rc = usb_request_get_descriptor_alloc(pipe,674 const int rc = usb_request_get_descriptor_alloc(pipe, 692 675 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 693 676 USB_DESCTYPE_STRING, 0, 0, … … 710 693 } 711 694 712 size_t langs_count = string_descriptor_size / 2;713 l18_win_locales_t *langs 714 = malloc(sizeof(l18_win_locales_t) * langs_count);695 const size_t langs_count = string_descriptor_size / 2; 696 l18_win_locales_t *langs = 697 calloc(langs_count, sizeof(l18_win_locales_t)); 715 698 if (langs == NULL) { 716 699 free(string_descriptor); … … 718 701 } 719 702 720 size_t i; 721 for (i = 0; i < langs_count; i++) { 703 for (size_t i = 0; i < langs_count; i++) { 722 704 /* Language code from the descriptor is in USB endianness. */ 723 705 /* FIXME: is this really correct? */ 724 uint16_t lang_code = (string_descriptor[2 + 2 * i + 1] << 8) 706 const uint16_t lang_code = 707 (string_descriptor[2 + 2 * i + 1] << 8) 725 708 + string_descriptor[2 + 2 * i]; 726 709 langs[i] = uint16_usb2host(lang_code); … … 761 744 } 762 745 /* Language is actually two byte value. */ 763 if (lang > 0xFFFF) {746 if (lang > L18N_WIN_LOCALE_MAX) { 764 747 return ERANGE; 765 748 } … … 795 778 } 796 779 797 size_t string_char_count = string_size / 2;780 const size_t string_char_count = string_size / 2; 798 781 string_chars = malloc(sizeof(wchar_t) * (string_char_count + 1)); 799 782 if (string_chars == NULL) { … … 807 790 * do not have them). 808 791 */ 809 size_t i; 810 for (i = 0; i < string_char_count; i++) { 811 uint16_t uni_char = (string[2 + 2 * i + 1] << 8) 792 for (size_t i = 0; i < string_char_count; i++) { 793 const uint16_t uni_char = (string[2 + 2 * i + 1] << 8) 812 794 + string[2 + 2 * i]; 813 795 string_chars[i] = uni_char; … … 827 809 828 810 leave: 829 if (string != NULL) { 830 free(string); 831 } 832 if (string_chars != NULL) { 833 free(string_chars); 834 } 811 free(string); 812 free(string_chars); 835 813 836 814 return rc; … … 847 825 return usb_request_clear_feature(pipe, 848 826 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_ENDPOINT, 849 uint16_host2usb(USB_FEATURE_ SELECTOR_ENDPOINT_HALT),827 uint16_host2usb(USB_FEATURE_ENDPOINT_HALT), 850 828 uint16_host2usb(ep_index)); 851 829 }
Note:
See TracChangeset
for help on using the changeset viewer.