Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/src/request.c

    r1cf26ab r4ee5272  
    3434 */
    3535#include <usb/dev/request.h>
     36#include <usb/request.h>
     37#include <usb/usb.h>
     38
    3639#include <errno.h>
    37 #include <assert.h>
    38 #include <usb/debug.h>
     40#include <mem.h>
     41#include <stdlib.h>
     42#include <str.h>
    3943
    4044#define MAX_DATA_LENGTH ((size_t)(0xFFFF))
    41 
    42 static_assert(sizeof(usb_device_request_setup_packet_t) == 8);
    4345
    4446/** Generic wrapper for SET requests using standard control request format.
     
    5153 * @param request Actual request (e.g. GET_DESCRIPTOR).
    5254 * @param value Value of @c wValue field of setup packet
    53  *      (must be in USB endianness).
     55 *      (must be in USB endianness).
    5456 * @param index Value of @c wIndex field of setup packet
    55  *      (must be in USB endianness).
     57 *      (must be in USB endianness).
    5658 * @param data Data to be sent during DATA stage
    57  *      (expected to be in USB endianness).
     59 *      (expected to be in USB endianness).
    5860 * @param data_size Size of the @p data buffer (in native endianness).
    5961 * @return Error code.
     
    6466int usb_control_request_set(usb_pipe_t *pipe,
    6567    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)
     68    uint8_t request, uint16_t value, uint16_t index,
     69    const void *data, size_t data_size)
    6970{
    7071        if (pipe == NULL) {
     
    8586         */
    8687
    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;
     88        const usb_device_request_setup_packet_t setup_packet = {
     89                .request_type = (request_type << 5) | recipient,
     90                .request = request,
     91                .value = value,
     92                .index = index,
     93                .length = (uint16_t) data_size,
     94        };
     95
     96        return usb_pipe_control_write(pipe,
     97            &setup_packet, sizeof(setup_packet), data, data_size);
    9998}
    10099
     
    108107  * @param request Actual request (e.g. GET_DESCRIPTOR).
    109108  * @param value Value of @c wValue field of setup packet
    110   *     (must be in USB endianness).
     109  *     (must be in USB endianness).
    111110  * @param index Value of @c wIndex field of setup packet
    112111  *     (must be in USB endianness).
     
    114113  *     (they will come in USB endianness).
    115114  * @param data_size Size of the @p data buffer
    116   *     (in native endianness).
     115  *     (in native endianness).
    117116  * @param actual_data_size Actual size of transfered data
    118   *        (in native endianness).
     117  *     (in native endianness).
    119118  * @return Error code.
    120119  * @retval EBADMEM @p pipe is NULL.
     
    124123int usb_control_request_get(usb_pipe_t *pipe,
    125124    usb_request_type_t request_type, usb_request_recipient_t recipient,
    126     uint8_t request,
    127     uint16_t value, uint16_t index,
     125    uint8_t request, uint16_t value, uint16_t index,
    128126    void *data, size_t data_size, size_t *actual_data_size)
    129127{
     
    209207{
    210208        if (request_type == USB_REQUEST_TYPE_STANDARD) {
    211                 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE)
    212                     && (index != 0)) {
     209                if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0))
     210                {
    213211                        return EINVAL;
    214212                }
    215213        }
    216214
    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;
     215        return usb_control_request_set(pipe,
     216            request_type, recipient, USB_DEVREQ_CLEAR_FEATURE,
     217            uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0);
    223218}
    224219
     
    237232{
    238233        if (request_type == USB_REQUEST_TYPE_STANDARD) {
    239                 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE)
    240                     && (index != 0)) {
     234                if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0))
     235                {
    241236                        return EINVAL;
    242237                }
    243238        }
    244239
    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;
     240        return usb_control_request_set(pipe,
     241            request_type, recipient, USB_DEVREQ_SET_FEATURE,
     242            uint16_host2usb(feature_selector), uint16_host2usb(index), NULL, 0);
    251243}
    252244
     
    277269        }
    278270
     271        /* The wValue field specifies the descriptor type in the high byte
     272         * and the descriptor index in the low byte. USB 1.1 spec p. 189
     273         */
    279274        const uint16_t wValue = descriptor_index | (descriptor_type << 8);
    280275
     
    313308         * Get only first byte to retrieve descriptor length.
    314309         */
    315         uint8_t tmp_buffer[1];
     310        uint8_t tmp_buffer;
    316311        size_t bytes_transfered;
    317312        rc = usb_request_get_descriptor(pipe, request_type, recipient,
    318313            descriptor_type, descriptor_index, language,
    319             &tmp_buffer, 1, &bytes_transfered);
     314            &tmp_buffer, sizeof(tmp_buffer), &bytes_transfered);
    320315        if (rc != EOK) {
    321316                return rc;
    322317        }
    323318        if (bytes_transfered != 1) {
    324                 /* FIXME: some better error code? */
    325                 return ESTALL;
    326         }
    327 
    328         size_t size = tmp_buffer[0];
     319                return ELIMIT;
     320        }
     321
     322        const size_t size = tmp_buffer;
    329323        if (size == 0) {
    330                 /* FIXME: some better error code? */
    331                 return ESTALL;
     324                return ELIMIT;
    332325        }
    333326
     
    349342        if (bytes_transfered != size) {
    350343                free(buffer);
    351                 /* FIXME: some better error code? */
    352                 return ESTALL;
     344                return ELIMIT;
    353345        }
    354346
     
    378370        int rc = usb_request_get_descriptor(pipe,
    379371            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    380             USB_DESCTYPE_DEVICE, 0, 0,
    381             &descriptor_tmp, sizeof(descriptor_tmp),
     372            USB_DESCTYPE_DEVICE, 0, 0, &descriptor_tmp, sizeof(descriptor_tmp),
    382373            &actually_transferred);
    383374
     
    421412        size_t actually_transferred = 0;
    422413        usb_standard_configuration_descriptor_t descriptor_tmp;
    423         int rc = usb_request_get_descriptor(pipe,
     414        const int rc = usb_request_get_descriptor(pipe,
    424415            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    425416            USB_DESCTYPE_CONFIGURATION, index, 0,
     
    479470int usb_request_get_full_configuration_descriptor_alloc(
    480471    usb_pipe_t *pipe, int index,
    481     void **descriptor_ptr, size_t *descriptor_size)
     472    const void **descriptor_ptr, size_t *descriptor_size)
    482473{
    483474        int rc;
     
    546537    usb_request_type_t request_type, usb_request_recipient_t recipient,
    547538    uint8_t descriptor_type, uint8_t descriptor_index,
    548     uint16_t language,
    549     void *buffer, size_t size)
     539    uint16_t language, const void *buffer, size_t size)
    550540{
    551541        if (buffer == NULL) {
     
    560550
    561551        return usb_control_request_set(pipe,
    562             request_type, recipient,
    563             USB_DEVREQ_SET_DESCRIPTOR,
    564             wValue, language,
    565             buffer, size);
     552            request_type, recipient, USB_DEVREQ_SET_DESCRIPTOR,
     553            wValue, language, buffer, size);
    566554}
    567555
     
    578566        size_t actual_size;
    579567
    580         int rc = usb_control_request_get(pipe,
     568        const int rc = usb_control_request_get(pipe,
    581569            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    582             USB_DEVREQ_GET_CONFIGURATION,
    583             0, 0,
    584             &value, 1, &actual_size);
     570            USB_DEVREQ_GET_CONFIGURATION, 0, 0, &value, 1, &actual_size);
    585571
    586572        if (rc != EOK) {
     
    607593    uint8_t configuration_value)
    608594{
    609         uint16_t config_value
     595        const uint16_t config_value
    610596            = uint16_host2usb((uint16_t) configuration_value);
    611597
     
    629615        size_t actual_size;
    630616
    631         int rc = usb_control_request_get(pipe,
     617        const int rc = usb_control_request_get(pipe,
    632618            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE,
    633619            USB_DEVREQ_GET_INTERFACE,
    634620            0, uint16_host2usb((uint16_t) interface_index),
    635             &value, 1, &actual_size);
     621            &value, sizeof(value), &actual_size);
    636622
    637623        if (rc != EOK) {
     
    678664    l18_win_locales_t **languages_ptr, size_t *languages_count)
    679665{
    680         int rc;
    681 
    682         if (languages_ptr == NULL) {
    683                 return EBADMEM;
    684         }
    685         if (languages_count == NULL) {
     666        if (languages_ptr == NULL || languages_count == NULL) {
    686667                return EBADMEM;
    687668        }
     
    689670        uint8_t *string_descriptor = NULL;
    690671        size_t string_descriptor_size = 0;
    691         rc = usb_request_get_descriptor_alloc(pipe,
     672        const int rc = usb_request_get_descriptor_alloc(pipe,
    692673            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    693674            USB_DESCTYPE_STRING, 0, 0,
     
    710691        }
    711692
    712         size_t langs_count = string_descriptor_size / 2;
    713         l18_win_locales_t *langs
    714             = malloc(sizeof(l18_win_locales_t) * langs_count);
     693        const size_t langs_count = string_descriptor_size / 2;
     694        l18_win_locales_t *langs =
     695            calloc(langs_count, sizeof(l18_win_locales_t));
    715696        if (langs == NULL) {
    716697                free(string_descriptor);
     
    718699        }
    719700
    720         size_t i;
    721         for (i = 0; i < langs_count; i++) {
     701        for (size_t i = 0; i < langs_count; i++) {
    722702                /* Language code from the descriptor is in USB endianness. */
    723703                /* FIXME: is this really correct? */
    724                 uint16_t lang_code = (string_descriptor[2 + 2 * i + 1] << 8)
     704                const uint16_t lang_code =
     705                    (string_descriptor[2 + 2 * i + 1] << 8)
    725706                    + string_descriptor[2 + 2 * i];
    726707                langs[i] = uint16_usb2host(lang_code);
     
    761742        }
    762743        /* Language is actually two byte value. */
    763         if (lang > 0xFFFF) {
     744        if (lang > L18N_WIN_LOCALE_MAX) {
    764745                return ERANGE;
    765746        }
     
    795776        }
    796777
    797         size_t string_char_count = string_size / 2;
     778        const size_t string_char_count = string_size / 2;
    798779        string_chars = malloc(sizeof(wchar_t) * (string_char_count + 1));
    799780        if (string_chars == NULL) {
     
    807788         * do not have them).
    808789         */
    809         size_t i;
    810         for (i = 0; i < string_char_count; i++) {
    811                 uint16_t uni_char = (string[2 + 2 * i + 1] << 8)
     790        for (size_t i = 0; i < string_char_count; i++) {
     791                const uint16_t uni_char = (string[2 + 2 * i + 1] << 8)
    812792                    + string[2 + 2 * i];
    813793                string_chars[i] = uni_char;
     
    827807
    828808leave:
    829         if (string != NULL) {
    830                 free(string);
    831         }
    832         if (string_chars != NULL) {
    833                 free(string_chars);
    834         }
     809        free(string);
     810        free(string_chars);
    835811
    836812        return rc;
     
    847823        return usb_request_clear_feature(pipe,
    848824            USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_ENDPOINT,
    849             uint16_host2usb(USB_FEATURE_SELECTOR_ENDPOINT_HALT),
     825            uint16_host2usb(USB_FEATURE_ENDPOINT_HALT),
    850826            uint16_host2usb(ep_index));
    851827}
Note: See TracChangeset for help on using the changeset viewer.