Ignore:
File:
1 edited

Legend:

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

    r77ad86c r7c95d6f5  
    3333 * Handling alternate interface settings.
    3434 */
    35 
    3635#include <usb/dev/driver.h>
    3736#include <usb/dev/request.h>
     
    6665        size_t alternate_count = 0;
    6766
    68         const void *iface_ptr =
    69             usb_dp_get_nested_descriptor(&dp_parser, &dp_data, config_descr);
     67        const uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
     68            &dp_data, config_descr);
    7069        while (iface_ptr != NULL) {
    71                 const usb_standard_interface_descriptor_t *iface = iface_ptr;
    72                 if (iface->descriptor_type == USB_DESCTYPE_INTERFACE
    73                     && iface->interface_number == interface_no) {
    74                         ++alternate_count;
     70                usb_standard_interface_descriptor_t *iface
     71                    = (usb_standard_interface_descriptor_t *) iface_ptr;
     72                if (iface->descriptor_type == USB_DESCTYPE_INTERFACE) {
     73                        if (iface->interface_number == interface_no) {
     74                                alternate_count++;
     75                        }
    7576                }
    7677                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
     
    8182}
    8283
    83 /** Initialize alternate interface representation structure.
     84/** Create alternate interface representation structure.
    8485 *
    85  * @param[in] alternates Pointer to allocated structure.
    8686 * @param[in] config_descr Configuration descriptor.
    8787 * @param[in] config_descr_size Size of configuration descriptor.
    8888 * @param[in] interface_number Interface number.
     89 * @param[out] alternates_ptr Where to store pointer to allocated structure.
    8990 * @return Error code.
    9091 */
    91 int usb_alternate_interfaces_init(usb_alternate_interfaces_t *alternates,
    92     const uint8_t *config_descr, size_t config_descr_size, int interface_number)
     92int usb_alternate_interfaces_create(const uint8_t *config_descr,
     93    size_t config_descr_size, int interface_number,
     94    usb_alternate_interfaces_t **alternates_ptr)
    9395{
    94         assert(alternates != NULL);
     96        assert(alternates_ptr != NULL);
    9597        assert(config_descr != NULL);
    9698        assert(config_descr_size > 0);
    9799
    98         alternates->alternatives = NULL;
    99         alternates->alternative_count = 0;
    100         alternates->current = 0;
     100        if (interface_number < 0) {
     101                alternates_ptr = NULL;
     102                return EOK;
     103        }
    101104
    102         /* No interfaces. */
    103         if (interface_number < 0) {
    104                 return EOK;
     105        usb_alternate_interfaces_t *alternates
     106            = malloc(sizeof(usb_alternate_interfaces_t));
     107
     108        if (alternates == NULL) {
     109                return ENOMEM;
    105110        }
    106111
    107112        alternates->alternative_count
    108113            = usb_interface_count_alternates(config_descr, config_descr_size,
    109                 interface_number);
     114            interface_number);
    110115
    111116        if (alternates->alternative_count == 0) {
     117                free(alternates);
    112118                return ENOENT;
    113119        }
    114120
    115         alternates->alternatives = calloc(alternates->alternative_count,
    116             sizeof(usb_alternate_interface_descriptors_t));
     121        alternates->alternatives = malloc(alternates->alternative_count
     122            * sizeof(usb_alternate_interface_descriptors_t));
    117123        if (alternates->alternatives == NULL) {
     124                free(alternates);
    118125                return ENOMEM;
    119126        }
    120127
    121         const usb_dp_parser_t dp_parser = {
     128        alternates->current = 0;
     129
     130        usb_dp_parser_t dp_parser = {
    122131                .nesting = usb_dp_standard_descriptor_nesting
    123132        };
    124         const usb_dp_parser_data_t dp_data = {
     133        usb_dp_parser_data_t dp_data = {
    125134                .data = config_descr,
    126135                .size = config_descr_size,
     
    128137        };
    129138
    130         usb_alternate_interface_descriptors_t *iterator
     139        usb_alternate_interface_descriptors_t *cur_alt_iface
    131140            = &alternates->alternatives[0];
    132141
    133         const usb_alternate_interface_descriptors_t *end
    134             = &alternates->alternatives[alternates->alternative_count];
    135 
    136         const void *iface_ptr =
    137             usb_dp_get_nested_descriptor(&dp_parser, &dp_data, dp_data.data);
    138 
    139         while (iface_ptr != NULL && iterator < end) {
    140                 const usb_standard_interface_descriptor_t *iface = iface_ptr;
    141 
     142        const uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
     143            &dp_data, dp_data.data);
     144        while (iface_ptr != NULL) {
     145                usb_standard_interface_descriptor_t *iface
     146                    = (usb_standard_interface_descriptor_t *) iface_ptr;
    142147                if ((iface->descriptor_type != USB_DESCTYPE_INTERFACE)
    143148                    || (iface->interface_number != interface_number)) {
    144                         /* This is not a valid alternate interface descriptor
    145                          * for interface with number == interface_number. */
    146149                        iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser,
    147                             &dp_data, dp_data.data, iface_ptr);
     150                            &dp_data,
     151                            dp_data.data, iface_ptr);
    148152                        continue;
    149153                }
    150154
    151                 iterator->interface = iface;
    152                 iterator->nested_descriptors = iface_ptr + sizeof(*iface);
     155                cur_alt_iface->interface = iface;
     156                cur_alt_iface->nested_descriptors = iface_ptr + sizeof(*iface);
    153157
    154158                /* Find next interface to count size of nested descriptors. */
    155159                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
    156160                    dp_data.data, iface_ptr);
     161                if (iface_ptr == NULL) {
     162                        const uint8_t *next = dp_data.data + dp_data.size;
     163                        cur_alt_iface->nested_descriptors_size
     164                            = next - cur_alt_iface->nested_descriptors;
     165                } else {
     166                        cur_alt_iface->nested_descriptors_size
     167                            = iface_ptr - cur_alt_iface->nested_descriptors;
     168                }
    157169
    158                 const uint8_t *next = (iface_ptr == NULL) ?
    159                     dp_data.data + dp_data.size : iface_ptr;
     170                cur_alt_iface++;
     171        }
    160172
    161                 iterator->nested_descriptors_size
    162                     = next - iterator->nested_descriptors;
    163 
    164                 ++iterator;
    165         }
     173        *alternates_ptr = alternates;
    166174
    167175        return EOK;
    168176}
    169177
    170 /** Clean initialized structure.
    171  * @param instance structure do deinitialize.
    172  */
    173 void usb_alternate_interfaces_deinit(usb_alternate_interfaces_t *instance)
    174 {
    175         if (!instance)
    176                 return;
    177         free(instance->alternatives);
    178         instance->alternatives = NULL;
    179 }
     178
    180179/**
    181180 * @}
Note: See TracChangeset for help on using the changeset viewer.