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