Changeset 7f56fb7 in mainline
- Timestamp:
- 2011-02-20T18:01:57Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c20da9f
- Parents:
- 51f0e410
- Location:
- uspace/lib/usb
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/include/usb/usbdrv.h
r51f0e410 r7f56fb7 103 103 int usb_drv_create_match_ids_from_device_descriptor(match_id_list_t *, 104 104 const usb_standard_device_descriptor_t *); 105 int usb_drv_create_match_ids_from_configuration_descriptor(match_id_list_t *,106 const void *, size_t);107 108 105 109 106 #endif -
uspace/lib/usb/src/recognise.c
r51f0e410 r7f56fb7 278 278 } 279 279 280 /** Create DDF match ids from USB configuration descriptor.281 * The configuration descriptor is expected to be in the complete form,282 * i.e. including interface, endpoint etc. descriptors.283 *284 * @param matches List of match ids to extend.285 * @param config_descriptor Configuration descriptor returned by given device.286 * @param total_size Size of the @p config_descriptor.287 * @return Error code.288 */289 int usb_drv_create_match_ids_from_configuration_descriptor(290 match_id_list_t *matches,291 const void *config_descriptor, size_t total_size)292 {293 /*294 * Iterate through config descriptor to find the interface295 * descriptors.296 */297 size_t position = sizeof(usb_standard_configuration_descriptor_t);298 while (position + 1 < total_size) {299 uint8_t *current_descriptor300 = ((uint8_t *) config_descriptor) + position;301 uint8_t cur_descr_len = current_descriptor[0];302 uint8_t cur_descr_type = current_descriptor[1];303 304 if (cur_descr_len == 0) {305 return ENOENT;306 }307 308 position += cur_descr_len;309 310 if (cur_descr_type != USB_DESCTYPE_INTERFACE) {311 continue;312 }313 314 /*315 * Finally, we found an interface descriptor.316 */317 usb_standard_interface_descriptor_t *interface318 = (usb_standard_interface_descriptor_t *)319 current_descriptor;320 321 ADD_MATCHID_OR_RETURN(matches, 50,322 "usb&interface&class=%s",323 usb_str_class(interface->interface_class));324 }325 326 return EOK;327 }328 329 /** Add match ids based on configuration descriptor.330 *331 * @param pipe Control pipe to the device.332 * @param matches Match ids list to add matches to.333 * @param config_count Number of configurations the device has.334 * @return Error code.335 */336 static int usb_add_config_descriptor_match_ids(usb_endpoint_pipe_t *pipe,337 match_id_list_t *matches, int config_count)338 {339 int final_rc = EOK;340 341 int config_index;342 for (config_index = 0; config_index < config_count; config_index++) {343 int rc;344 usb_standard_configuration_descriptor_t config_descriptor;345 rc = usb_request_get_bare_configuration_descriptor(pipe,346 config_index, &config_descriptor);347 if (rc != EOK) {348 final_rc = rc;349 continue;350 }351 352 size_t full_config_descriptor_size;353 void *full_config_descriptor354 = malloc(config_descriptor.total_length);355 rc = usb_request_get_full_configuration_descriptor(pipe,356 config_index,357 full_config_descriptor, config_descriptor.total_length,358 &full_config_descriptor_size);359 if (rc != EOK) {360 final_rc = rc;361 continue;362 }363 if (full_config_descriptor_size364 != config_descriptor.total_length) {365 final_rc = ERANGE;366 continue;367 }368 369 rc = usb_drv_create_match_ids_from_configuration_descriptor(370 matches,371 full_config_descriptor, full_config_descriptor_size);372 if (rc != EOK) {373 final_rc = rc;374 continue;375 }376 377 }378 379 return final_rc;380 }381 280 382 281 /** Create match ids describing attached device. … … 406 305 rc = usb_drv_create_match_ids_from_device_descriptor(matches, 407 306 &device_descriptor); 408 if (rc != EOK) {409 return rc;410 }411 412 /*413 * Go through all configurations and add matches414 * based on interface class.415 */416 rc = usb_add_config_descriptor_match_ids(ctrl_pipe, matches,417 device_descriptor.configuration_count);418 307 if (rc != EOK) { 419 308 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.