Changeset c2245a3 in mainline for uspace/drv/bus/usb/usbmid/explore.c
- Timestamp:
- 2011-11-10T20:03:48Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fa76f81
- Parents:
- 27ca3a3 (diff), 747ef72 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/explore.c
r27ca3a3 rc2245a3 57 57 { 58 58 list_foreach(*list, l) { 59 usbmid_interface_t *iface 60 = list_get_instance(l, usbmid_interface_t, link); 59 usbmid_interface_t *iface = usbmid_interface_from_link(l); 61 60 if (iface->interface_no == interface_no) { 62 61 return true; … … 82 81 }; 83 82 84 usb_dp_parser_t parser = {83 static const usb_dp_parser_t parser = { 85 84 .nesting = usb_dp_standard_descriptor_nesting 86 85 }; 87 86 88 87 const uint8_t *interface_ptr = 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 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 100 101 = (usb_standard_interface_descriptor_t *) interface_ptr; 101 102 102 103 /* Skip alternate interfaces. */ 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 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 } 127 122 } 128 123 … … 139 134 int rc; 140 135 141 intdev_class = dev->descriptors.device.device_class;136 unsigned dev_class = dev->descriptors.device.device_class; 142 137 if (dev_class != USB_CLASS_USE_INTERFACE) { 143 138 usb_log_warning( 144 "Device class: %d (%s), but expected class 0.\n", 145 dev_class, usb_str_class(dev_class)); 139 "Device class: %u (%s), but expected class %u.\n", 140 dev_class, usb_str_class(dev_class), 141 USB_CLASS_USE_INTERFACE); 146 142 usb_log_error("Not multi interface device, refusing.\n"); 147 143 return false; 148 144 } 149 145 150 /* Short 146 /* Shortcuts to save on typing ;-). */ 151 147 const void *config_descriptor_raw = dev->descriptors.configuration; 152 148 size_t config_descriptor_size = dev->descriptors.configuration_size; … … 163 159 } 164 160 161 /* Create driver soft-state. */ 165 162 usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t)); 166 163 if (!usb_mid) { … … 169 166 } 170 167 171 /* Create control function */168 /* Create control function. */ 172 169 usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl"); 173 170 if (usb_mid->ctl_fun == NULL) { … … 175 172 return false; 176 173 } 177 178 174 usb_mid->ctl_fun->ops = &mid_device_ops; 179 175 176 /* Bind control function. */ 180 177 rc = ddf_fun_bind(usb_mid->ctl_fun); 181 178 if (rc != EOK) { … … 192 189 &usb_mid->interface_list); 193 190 191 /* Start child function for every interface. */ 194 192 list_foreach(usb_mid->interface_list, link) { 195 usbmid_interface_t *iface = list_get_instance(link, 196 usbmid_interface_t, link); 193 usbmid_interface_t *iface = usbmid_interface_from_link(link); 197 194 198 195 usb_log_info("Creating child for interface %d (%s).\n", 199 (int)iface->interface_no,196 iface->interface_no, 200 197 usb_str_class(iface->interface->interface_class)); 201 198
Note:
See TracChangeset
for help on using the changeset viewer.