Changes in uspace/drv/bus/usb/usbmid/explore.c [9d58539:065064e6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/explore.c
r9d58539 r065064e6 54 54 * @return Interface @p interface_no is already present in the list. 55 55 */ 56 static bool interface_in_list( constlist_t *list, int interface_no)56 static bool interface_in_list(list_t *list, int interface_no) 57 57 { 58 58 list_foreach(*list, l) { 59 usbmid_interface_t *iface = usbmid_interface_from_link(l); 59 usbmid_interface_t *iface 60 = list_get_instance(l, usbmid_interface_t, link); 60 61 if (iface->interface_no == interface_no) { 61 62 return true; … … 81 82 }; 82 83 83 static constusb_dp_parser_t parser = {84 usb_dp_parser_t parser = { 84 85 .nesting = usb_dp_standard_descriptor_nesting 85 86 }; 86 87 87 88 const uint8_t *interface_ptr = 88 usb_dp_get_nested_descriptor(&parser, &data, config_descriptor); 89 90 /* Walk all descriptors nested in the current configuration decriptor; 91 * i.e. all interface descriptors. */ 92 for (;interface_ptr != NULL; 93 interface_ptr = usb_dp_get_sibling_descriptor( 94 &parser, &data, config_descriptor, interface_ptr)) 95 { 96 /* The second byte is DESCTYPE byte in all desriptors. */ 97 if (interface_ptr[1] != USB_DESCTYPE_INTERFACE) 98 continue; 99 100 const usb_standard_interface_descriptor_t *interface 89 usb_dp_get_nested_descriptor(&parser, &data, data.data); 90 if (interface_ptr == NULL) { 91 return; 92 } 93 94 do { 95 if (interface_ptr[1] != USB_DESCTYPE_INTERFACE) { 96 goto next_descriptor; 97 } 98 99 usb_standard_interface_descriptor_t *interface 101 100 = (usb_standard_interface_descriptor_t *) interface_ptr; 102 101 103 102 /* Skip alternate interfaces. */ 104 if (interface_in_list(list, interface->interface_number)) { 105 /* TODO: add the alternatives and create match ids 106 * for them. */ 107 continue; 108 } 109 usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t)); 110 if (iface == NULL) { 111 //TODO: Do something about that failure. 112 break; 113 } 114 115 link_initialize(&iface->link); 116 iface->fun = NULL; 117 iface->interface_no = interface->interface_number; 118 iface->interface = interface; 119 120 list_append(&iface->link, list); 121 } 103 if (!interface_in_list(list, interface->interface_number)) { 104 usbmid_interface_t *iface 105 = malloc(sizeof(usbmid_interface_t)); 106 if (iface == NULL) { 107 break; 108 } 109 link_initialize(&iface->link); 110 iface->fun = NULL; 111 iface->interface_no = interface->interface_number; 112 iface->interface = interface; 113 114 list_append(&iface->link, list); 115 } 116 117 /* TODO: add the alternatives and create match ids from them 118 * as well. 119 */ 120 121 next_descriptor: 122 interface_ptr = usb_dp_get_sibling_descriptor(&parser, &data, 123 data.data, interface_ptr); 124 125 } while (interface_ptr != NULL); 126 122 127 } 123 128 … … 134 139 int rc; 135 140 136 unsigneddev_class = dev->descriptors.device.device_class;141 int dev_class = dev->descriptors.device.device_class; 137 142 if (dev_class != USB_CLASS_USE_INTERFACE) { 138 143 usb_log_warning( 139 "Device class: %u (%s), but expected class %u.\n", 140 dev_class, usb_str_class(dev_class), 141 USB_CLASS_USE_INTERFACE); 144 "Device class: %d (%s), but expected class 0.\n", 145 dev_class, usb_str_class(dev_class)); 142 146 usb_log_error("Not multi interface device, refusing.\n"); 143 147 return false; 144 148 } 145 149 146 /* Short cuts to save on typing ;-). */150 /* Short cuts to save on typing ;-). */ 147 151 const void *config_descriptor_raw = dev->descriptors.configuration; 148 152 size_t config_descriptor_size = dev->descriptors.configuration_size; … … 159 163 } 160 164 161 /* Create driver soft-state. */162 165 usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t)); 163 166 if (!usb_mid) { … … 166 169 } 167 170 168 /* Create control function .*/171 /* Create control function */ 169 172 usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl"); 170 173 if (usb_mid->ctl_fun == NULL) { … … 172 175 return false; 173 176 } 177 174 178 usb_mid->ctl_fun->ops = &mid_device_ops; 175 179 176 /* Bind control function. */177 180 rc = ddf_fun_bind(usb_mid->ctl_fun); 178 181 if (rc != EOK) { … … 189 192 &usb_mid->interface_list); 190 193 191 /* Start child function for every interface. */192 194 list_foreach(usb_mid->interface_list, link) { 193 usbmid_interface_t *iface = usbmid_interface_from_link(link); 195 usbmid_interface_t *iface = list_get_instance(link, 196 usbmid_interface_t, link); 194 197 195 198 usb_log_info("Creating child for interface %d (%s).\n", 196 iface->interface_no,199 (int) iface->interface_no, 197 200 usb_str_class(iface->interface->interface_class)); 198 201
Note:
See TracChangeset
for help on using the changeset viewer.