Ignore:
File:
1 edited

Legend:

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

    r69b9740 re978ada  
    6565        size_t alternate_count = 0;
    6666
    67         const void *iface_ptr =
    68             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);
    6969        while (iface_ptr != NULL) {
    70                 const usb_standard_interface_descriptor_t *iface = iface_ptr;
    71                 if (iface->descriptor_type == USB_DESCTYPE_INTERFACE
    72                     && iface->interface_number == interface_no) {
    73                         ++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                        }
    7476                }
    7577                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
     
    8082}
    8183
    82 /** Initialize alternate interface representation structure.
     84/** Create alternate interface representation structure.
    8385 *
    84  * @param[in] alternates Pointer to allocated structure.
    8586 * @param[in] config_descr Configuration descriptor.
    8687 * @param[in] config_descr_size Size of configuration descriptor.
    8788 * @param[in] interface_number Interface number.
     89 * @param[out] alternates_ptr Where to store pointer to allocated structure.
    8890 * @return Error code.
    8991 */
    90 int usb_alternate_interfaces_init(usb_alternate_interfaces_t *alternates,
    91     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)
    9295{
    93         assert(alternates != NULL);
     96        assert(alternates_ptr != NULL);
    9497        assert(config_descr != NULL);
    9598        assert(config_descr_size > 0);
    9699
    97         alternates->alternatives = NULL;
    98         alternates->alternative_count = 0;
    99         alternates->current = 0;
    100 
    101         /* No interfaces. */
     100        *alternates_ptr = NULL;
    102101        if (interface_number < 0) {
    103102                return EOK;
    104103        }
    105104
     105        usb_alternate_interfaces_t *alternates
     106            = malloc(sizeof(usb_alternate_interfaces_t));
     107        if (alternates == NULL) {
     108                return ENOMEM;
     109        }
     110
    106111        alternates->alternative_count
    107112            = usb_interface_count_alternates(config_descr, config_descr_size,
    108                 interface_number);
     113            interface_number);
    109114
    110115        if (alternates->alternative_count == 0) {
     116                free(alternates);
    111117                return ENOENT;
    112118        }
     
    115121            sizeof(usb_alternate_interface_descriptors_t));
    116122        if (alternates->alternatives == NULL) {
     123                free(alternates);
    117124                return ENOMEM;
    118125        }
    119126
    120         const usb_dp_parser_t dp_parser = {
     127        alternates->current = 0;
     128
     129        usb_dp_parser_t dp_parser = {
    121130                .nesting = usb_dp_standard_descriptor_nesting
    122131        };
    123         const usb_dp_parser_data_t dp_data = {
     132        usb_dp_parser_data_t dp_data = {
    124133                .data = config_descr,
    125134                .size = config_descr_size,
     
    127136        };
    128137
    129         usb_alternate_interface_descriptors_t *iterator
     138        usb_alternate_interface_descriptors_t *cur_alt_iface
    130139            = &alternates->alternatives[0];
    131140
    132         const usb_alternate_interface_descriptors_t *end
    133             = &alternates->alternatives[alternates->alternative_count];
    134 
    135         const void *iface_ptr =
    136             usb_dp_get_nested_descriptor(&dp_parser, &dp_data, dp_data.data);
    137 
    138         while (iface_ptr != NULL && iterator < end) {
    139                 const usb_standard_interface_descriptor_t *iface = iface_ptr;
    140 
     141        const uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
     142            &dp_data, dp_data.data);
     143        while (iface_ptr != NULL) {
     144                usb_standard_interface_descriptor_t *iface
     145                    = (usb_standard_interface_descriptor_t *) iface_ptr;
    141146                if ((iface->descriptor_type != USB_DESCTYPE_INTERFACE)
    142147                    || (iface->interface_number != interface_number)) {
    143                         /* This is not a valid alternate interface descriptor
    144                          * for interface with number == interface_number. */
    145148                        iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser,
    146                             &dp_data, dp_data.data, iface_ptr);
     149                            &dp_data,
     150                            dp_data.data, iface_ptr);
    147151                        continue;
    148152                }
    149153
    150                 iterator->interface = iface;
    151                 iterator->nested_descriptors = iface_ptr + sizeof(*iface);
     154                cur_alt_iface->interface = iface;
     155                cur_alt_iface->nested_descriptors = iface_ptr + sizeof(*iface);
    152156
    153157                /* Find next interface to count size of nested descriptors. */
    154158                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
    155159                    dp_data.data, iface_ptr);
     160                if (iface_ptr == NULL) {
     161                        const uint8_t *next = dp_data.data + dp_data.size;
     162                        cur_alt_iface->nested_descriptors_size
     163                            = next - cur_alt_iface->nested_descriptors;
     164                } else {
     165                        cur_alt_iface->nested_descriptors_size
     166                            = iface_ptr - cur_alt_iface->nested_descriptors;
     167                }
    156168
    157                 const uint8_t *next = (iface_ptr == NULL) ?
    158                     dp_data.data + dp_data.size : iface_ptr;
     169                cur_alt_iface++;
     170        }
    159171
    160                 iterator->nested_descriptors_size
    161                     = next - iterator->nested_descriptors;
    162 
    163                 ++iterator;
    164         }
     172        *alternates_ptr = alternates;
    165173
    166174        return EOK;
    167175}
    168176
    169 void usb_alternate_interfaces_deinit(usb_alternate_interfaces_t *alternate)
     177void usb_alternate_interfaces_destroy(usb_alternate_interfaces_t *alternate)
    170178{
    171179        if (!alternate)
    172180                return;
    173181        free(alternate->alternatives);
     182        free(alternate);
    174183}
    175184/**
Note: See TracChangeset for help on using the changeset viewer.