Changes in uspace/lib/usbdev/src/altiface.c [77ad86c:7c95d6f5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/altiface.c
r77ad86c r7c95d6f5 33 33 * Handling alternate interface settings. 34 34 */ 35 36 35 #include <usb/dev/driver.h> 37 36 #include <usb/dev/request.h> … … 66 65 size_t alternate_count = 0; 67 66 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); 70 69 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 } 75 76 } 76 77 iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data, … … 81 82 } 82 83 83 /** Initialize alternate interface representation structure.84 /** Create alternate interface representation structure. 84 85 * 85 * @param[in] alternates Pointer to allocated structure.86 86 * @param[in] config_descr Configuration descriptor. 87 87 * @param[in] config_descr_size Size of configuration descriptor. 88 88 * @param[in] interface_number Interface number. 89 * @param[out] alternates_ptr Where to store pointer to allocated structure. 89 90 * @return Error code. 90 91 */ 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) 92 int 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) 93 95 { 94 assert(alternates != NULL);96 assert(alternates_ptr != NULL); 95 97 assert(config_descr != NULL); 96 98 assert(config_descr_size > 0); 97 99 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 } 101 104 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; 105 110 } 106 111 107 112 alternates->alternative_count 108 113 = usb_interface_count_alternates(config_descr, config_descr_size, 109 114 interface_number); 110 115 111 116 if (alternates->alternative_count == 0) { 117 free(alternates); 112 118 return ENOENT; 113 119 } 114 120 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)); 117 123 if (alternates->alternatives == NULL) { 124 free(alternates); 118 125 return ENOMEM; 119 126 } 120 127 121 const usb_dp_parser_t dp_parser = { 128 alternates->current = 0; 129 130 usb_dp_parser_t dp_parser = { 122 131 .nesting = usb_dp_standard_descriptor_nesting 123 132 }; 124 constusb_dp_parser_data_t dp_data = {133 usb_dp_parser_data_t dp_data = { 125 134 .data = config_descr, 126 135 .size = config_descr_size, … … 128 137 }; 129 138 130 usb_alternate_interface_descriptors_t * iterator139 usb_alternate_interface_descriptors_t *cur_alt_iface 131 140 = &alternates->alternatives[0]; 132 141 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; 142 147 if ((iface->descriptor_type != USB_DESCTYPE_INTERFACE) 143 148 || (iface->interface_number != interface_number)) { 144 /* This is not a valid alternate interface descriptor145 * for interface with number == interface_number. */146 149 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); 148 152 continue; 149 153 } 150 154 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); 153 157 154 158 /* Find next interface to count size of nested descriptors. */ 155 159 iface_ptr = usb_dp_get_sibling_descriptor(&dp_parser, &dp_data, 156 160 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 } 157 169 158 c onst uint8_t *next = (iface_ptr == NULL) ?159 dp_data.data + dp_data.size : iface_ptr;170 cur_alt_iface++; 171 } 160 172 161 iterator->nested_descriptors_size 162 = next - iterator->nested_descriptors; 163 164 ++iterator; 165 } 173 *alternates_ptr = alternates; 166 174 167 175 return EOK; 168 176 } 169 177 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 180 179 /** 181 180 * @}
Note:
See TracChangeset
for help on using the changeset viewer.