Changes in uspace/lib/usbdev/src/altiface.c [6e3c005:160b75e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/altiface.c
r6e3c005 r160b75e 48 48 * @return Number of alternate interfaces for @p interface_no interface. 49 49 */ 50 size_t usb_interface_count_alternates( constuint8_t *config_descr,50 size_t usb_interface_count_alternates(uint8_t *config_descr, 51 51 size_t config_descr_size, uint8_t interface_no) 52 52 { … … 54 54 assert(config_descr_size > 0); 55 55 56 constusb_dp_parser_t dp_parser = {56 usb_dp_parser_t dp_parser = { 57 57 .nesting = usb_dp_standard_descriptor_nesting 58 58 }; 59 constusb_dp_parser_data_t dp_data = {59 usb_dp_parser_data_t dp_data = { 60 60 .data = config_descr, 61 61 .size = config_descr_size, … … 65 65 size_t alternate_count = 0; 66 66 67 const void *iface_ptr =68 usb_dp_get_nested_descriptor(&dp_parser,&dp_data, config_descr);67 uint8_t *iface_ptr = usb_dp_get_nested_descriptor(&dp_parser, 68 &dp_data, config_descr); 69 69 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 } 74 76 } 75 77 iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data, … … 80 82 } 81 83 82 /** Initialize alternate interface representation structure.84 /** Create alternate interface representation structure. 83 85 * 84 * @param[in] alternates Pointer to allocated structure.85 86 * @param[in] config_descr Configuration descriptor. 86 87 * @param[in] config_descr_size Size of configuration descriptor. 87 88 * @param[in] interface_number Interface number. 89 * @param[out] alternates_ptr Where to store pointer to allocated structure. 88 90 * @return Error code. 89 91 */ 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) 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) 92 95 { 93 assert(alternates != NULL);96 assert(alternates_ptr != NULL); 94 97 assert(config_descr != NULL); 95 98 assert(config_descr_size > 0); 96 99 97 alternates->alternatives = NULL; 98 alternates->alternative_count = 0; 99 alternates->current = 0; 100 if (interface_number < 0) { 101 alternates_ptr = NULL; 102 return EOK; 103 } 100 104 101 /* No interfaces. */ 102 if (interface_number < 0) { 103 return EOK; 105 usb_alternate_interfaces_t *alternates 106 = malloc(sizeof(usb_alternate_interfaces_t)); 107 108 if (alternates == NULL) { 109 return ENOMEM; 104 110 } 105 111 106 112 alternates->alternative_count 107 113 = usb_interface_count_alternates(config_descr, config_descr_size, 108 114 interface_number); 109 115 110 116 if (alternates->alternative_count == 0) { 117 free(alternates); 111 118 return ENOENT; 112 119 } 113 120 114 alternates->alternatives = calloc(alternates->alternative_count,115 sizeof(usb_alternate_interface_descriptors_t));121 alternates->alternatives = malloc(alternates->alternative_count 122 * sizeof(usb_alternate_interface_descriptors_t)); 116 123 if (alternates->alternatives == NULL) { 124 free(alternates); 117 125 return ENOMEM; 118 126 } 119 127 120 const usb_dp_parser_t dp_parser = { 128 alternates->current = 0; 129 130 usb_dp_parser_t dp_parser = { 121 131 .nesting = usb_dp_standard_descriptor_nesting 122 132 }; 123 constusb_dp_parser_data_t dp_data = {133 usb_dp_parser_data_t dp_data = { 124 134 .data = config_descr, 125 135 .size = config_descr_size, … … 127 137 }; 128 138 129 usb_alternate_interface_descriptors_t * iterator139 usb_alternate_interface_descriptors_t *cur_alt_iface 130 140 = &alternates->alternatives[0]; 131 141 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 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; 141 147 if ((iface->descriptor_type != USB_DESCTYPE_INTERFACE) 142 148 || (iface->interface_number != interface_number)) { 143 /* This is not a valid alternate interface descriptor144 * for interface with number == interface_number. */145 149 iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, 146 &dp_data, dp_data.data, iface_ptr); 150 &dp_data, 151 dp_data.data, iface_ptr); 147 152 continue; 148 153 } 149 154 150 iterator->interface = iface;151 iterator->nested_descriptors = iface_ptr + sizeof(*iface);155 cur_alt_iface->interface = iface; 156 cur_alt_iface->nested_descriptors = iface_ptr + sizeof(*iface); 152 157 153 158 /* Find next interface to count size of nested descriptors. */ 154 159 iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data, 155 160 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 } 156 169 157 c onst uint8_t *next = (iface_ptr == NULL) ?158 dp_data.data + dp_data.size : iface_ptr;170 cur_alt_iface++; 171 } 159 172 160 iterator->nested_descriptors_size 161 = next - iterator->nested_descriptors; 162 163 ++iterator; 164 } 173 *alternates_ptr = alternates; 165 174 166 175 return EOK; 167 176 } 168 177 169 /** Clean initialized structure. 170 * @param instance structure do deinitialize. 171 */ 172 void usb_alternate_interfaces_deinit(usb_alternate_interfaces_t *instance) 173 { 174 if (!instance) 175 return; 176 free(instance->alternatives); 177 instance->alternatives = NULL; 178 } 178 179 179 /** 180 180 * @}
Note:
See TracChangeset
for help on using the changeset viewer.