Ignore:
File:
1 edited

Legend:

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

    r160b75e r6e3c005  
    4848 * @return Number of alternate interfaces for @p interface_no interface.
    4949 */
    50 size_t usb_interface_count_alternates(uint8_t *config_descr,
     50size_t usb_interface_count_alternates(const uint8_t *config_descr,
    5151    size_t config_descr_size, uint8_t interface_no)
    5252{
     
    5454        assert(config_descr_size > 0);
    5555
    56         usb_dp_parser_t dp_parser = {
     56        const usb_dp_parser_t dp_parser = {
    5757                .nesting = usb_dp_standard_descriptor_nesting
    5858        };
    59         usb_dp_parser_data_t dp_data = {
     59        const usb_dp_parser_data_t dp_data = {
    6060                .data = config_descr,
    6161                .size = config_descr_size,
     
    6565        size_t alternate_count = 0;
    6666
    67         uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser,
    68             &dp_data, config_descr);
     67        const void *iface_ptr =
     68            usb_dp_get_nested_descriptor(&dp_parser, &dp_data, config_descr);
    6969        while (iface_ptr != NULL) {
    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                         }
     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;
    7674                }
    7775                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
     
    8280}
    8381
    84 /** Create alternate interface representation structure.
     82/** Initialize alternate interface representation structure.
    8583 *
     84 * @param[in] alternates Pointer to allocated structure.
    8685 * @param[in] config_descr Configuration descriptor.
    8786 * @param[in] config_descr_size Size of configuration descriptor.
    8887 * @param[in] interface_number Interface number.
    89  * @param[out] alternates_ptr Where to store pointer to allocated structure.
    9088 * @return Error code.
    9189 */
    92 int usb_alternate_interfaces_create(uint8_t *config_descr,
    93     size_t config_descr_size, int interface_number,
    94     usb_alternate_interfaces_t **alternates_ptr)
     90int usb_alternate_interfaces_init(usb_alternate_interfaces_t *alternates,
     91    const uint8_t *config_descr, size_t config_descr_size, int interface_number)
    9592{
    96         assert(alternates_ptr != NULL);
     93        assert(alternates != NULL);
    9794        assert(config_descr != NULL);
    9895        assert(config_descr_size > 0);
    9996
     97        alternates->alternatives = NULL;
     98        alternates->alternative_count = 0;
     99        alternates->current = 0;
     100
     101        /* No interfaces. */
    100102        if (interface_number < 0) {
    101                 alternates_ptr = NULL;
    102103                return EOK;
    103         }
    104 
    105         usb_alternate_interfaces_t *alternates
    106             = malloc(sizeof(usb_alternate_interfaces_t));
    107 
    108         if (alternates == NULL) {
    109                 return ENOMEM;
    110104        }
    111105
    112106        alternates->alternative_count
    113107            = usb_interface_count_alternates(config_descr, config_descr_size,
    114             interface_number);
     108                interface_number);
    115109
    116110        if (alternates->alternative_count == 0) {
    117                 free(alternates);
    118111                return ENOENT;
    119112        }
    120113
    121         alternates->alternatives = malloc(alternates->alternative_count
    122             * sizeof(usb_alternate_interface_descriptors_t));
     114        alternates->alternatives = calloc(alternates->alternative_count,
     115            sizeof(usb_alternate_interface_descriptors_t));
    123116        if (alternates->alternatives == NULL) {
    124                 free(alternates);
    125117                return ENOMEM;
    126118        }
    127119
    128         alternates->current = 0;
    129 
    130         usb_dp_parser_t dp_parser = {
     120        const usb_dp_parser_t dp_parser = {
    131121                .nesting = usb_dp_standard_descriptor_nesting
    132122        };
    133         usb_dp_parser_data_t dp_data = {
     123        const usb_dp_parser_data_t dp_data = {
    134124                .data = config_descr,
    135125                .size = config_descr_size,
     
    137127        };
    138128
    139         usb_alternate_interface_descriptors_t *cur_alt_iface
     129        usb_alternate_interface_descriptors_t *iterator
    140130            = &alternates->alternatives[0];
    141131
    142         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;
     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
    147141                if ((iface->descriptor_type != USB_DESCTYPE_INTERFACE)
    148142                    || (iface->interface_number != interface_number)) {
     143                        /* This is not a valid alternate interface descriptor
     144                         * for interface with number == interface_number. */
    149145                        iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser,
    150                             &dp_data,
    151                             dp_data.data, iface_ptr);
     146                            &dp_data, dp_data.data, iface_ptr);
    152147                        continue;
    153148                }
    154149
    155                 cur_alt_iface->interface = iface;
    156                 cur_alt_iface->nested_descriptors = iface_ptr + sizeof(*iface);
     150                iterator->interface = iface;
     151                iterator->nested_descriptors = iface_ptr + sizeof(*iface);
    157152
    158153                /* Find next interface to count size of nested descriptors. */
    159154                iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data,
    160155                    dp_data.data, iface_ptr);
    161                 if (iface_ptr == NULL) {
    162                         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                 }
    169156
    170                 cur_alt_iface++;
     157                const uint8_t *next = (iface_ptr == NULL) ?
     158                    dp_data.data + dp_data.size : iface_ptr;
     159
     160                iterator->nested_descriptors_size
     161                    = next - iterator->nested_descriptors;
     162
     163                ++iterator;
    171164        }
    172 
    173         *alternates_ptr = alternates;
    174165
    175166        return EOK;
    176167}
    177168
    178 
     169/** Clean initialized structure.
     170 * @param instance structure do deinitialize.
     171 */
     172void usb_alternate_interfaces_deinit(usb_alternate_interfaces_t *instance)
     173{
     174        if (!instance)
     175                return;
     176        free(instance->alternatives);
     177        instance->alternatives = NULL;
     178}
    179179/**
    180180 * @}
Note: See TracChangeset for help on using the changeset viewer.