Changeset d93f5afb in mainline for uspace/lib/usbdev/src/devdrv.c
- Timestamp:
- 2013-08-02T15:59:51Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- dcbda00
- Parents:
- 3969a42
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbdev/src/devdrv.c
r3969a42 rd93f5afb 45 45 /** USB device structure. */ 46 46 typedef struct usb_device { 47 /** Connection to USB hc, used by wire and arbitrary requests. */ 48 usb_hc_connection_t hc_conn; 49 /** Connection backing the pipes. 50 * Typically, you will not need to use this attribute at all. 51 */ 52 usb_device_connection_t wire; 47 /** Connection to device on USB bus */ 48 usb_dev_session_t *bus_session; 49 /** devman handle */ 50 devman_handle_t handle; 53 51 /** The default control pipe. */ 54 52 usb_pipe_t ctrl_pipe; … … 78 76 void *driver_data; 79 77 80 /** Connection to device on USB bus */81 usb_dev_session_t *bus_session;82 /** devman handle */83 devman_handle_t handle;84 78 } usb_device_t; 85 79 … … 157 151 assert(usb_dev->descriptors.full_config == NULL); 158 152 159 /* It is worth to start a long transfer. */160 usb_pipe_start_long_transfer(&usb_dev->ctrl_pipe);161 162 153 /* Get the device descriptor. */ 163 154 int rc = usb_request_get_device_descriptor(&usb_dev->ctrl_pipe, 164 155 &usb_dev->descriptors.device); 165 156 if (rc != EOK) { 166 goto leave;157 return rc; 167 158 } 168 159 … … 173 164 &usb_dev->descriptors.full_config_size); 174 165 175 leave:176 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe);177 166 178 167 return rc; … … 198 187 * - registers endpoints with the host controller 199 188 * 200 * @param[in] wire Initialized backing connection to the host controller.201 189 * @param[in] endpoints Endpoints description, NULL terminated. 202 190 * @param[in] config_descr Configuration descriptor of active configuration. … … 240 228 int rc = usb_pipe_initialize_from_configuration(pipes, pipe_count, 241 229 usb_dev->descriptors.full_config, 242 usb_dev->descriptors.full_config_size, &usb_dev->wire,230 usb_dev->descriptors.full_config_size, 243 231 usb_dev->bus_session); 244 232 if (rc != EOK) { … … 353 341 } 354 342 355 static int usb_dev_get_info(usb_device_t *usb_dev, devman_handle_t *handle,356 usb_address_t *address, int *iface_no)357 {358 assert(usb_dev);359 360 int ret = EOK;361 async_exch_t *exch = async_exchange_begin(usb_dev->bus_session);362 if (!exch)363 ret = ENOMEM;364 365 if (ret == EOK && address)366 ret = usb_get_my_address(exch, address);367 368 if (ret == EOK && handle)369 ret = usb_get_hc_handle(exch, handle);370 371 if (ret == EOK && iface_no) {372 ret = usb_get_my_interface(exch, iface_no);373 if (ret == ENOTSUP) {374 ret = EOK;375 *iface_no = -1;376 }377 }378 379 async_exchange_end(exch);380 return ret;381 }382 383 343 /** Clean instance of a USB device. 384 344 * … … 393 353 usb_device_destroy_pipes(usb_dev); 394 354 /* Ignore errors and hope for the best. */ 395 usb_hc_connection_deinitialize(&usb_dev->hc_conn);396 355 usb_alternate_interfaces_deinit(&usb_dev->alternate_interfaces); 397 356 usb_device_release_descriptors(usb_dev); … … 437 396 } 438 397 439 /* Get assigned params */440 devman_handle_t hc_handle;441 usb_address_t address;442 443 int rc = usb_dev_get_info(usb_dev, &hc_handle, &address, NULL);444 if (rc != EOK) {445 usb_dev_disconnect(usb_dev->bus_session);446 *errstr_ptr = "device parameters retrieval";447 return rc;448 }449 450 /* Initialize hc connection. */451 usb_hc_connection_initialize(&usb_dev->hc_conn, hc_handle);452 453 /* Initialize backing wire and control pipe. */454 rc = usb_device_connection_initialize(455 &usb_dev->wire, &usb_dev->hc_conn, address);456 if (rc != EOK) {457 usb_dev_disconnect(usb_dev->bus_session);458 *errstr_ptr = "device connection initialization";459 return rc;460 }461 462 398 /* This pipe was registered by the hub driver, 463 399 * during device initialization. */ 464 rc = usb_pipe_initialize_default_control(465 &usb_dev->ctrl_pipe, &usb_dev->wire,usb_dev->bus_session);400 int rc = usb_pipe_initialize_default_control( 401 &usb_dev->ctrl_pipe, usb_dev->bus_session); 466 402 if (rc != EOK) { 467 403 usb_dev_disconnect(usb_dev->bus_session); … … 470 406 } 471 407 472 /* Open hc connection for pipe registration. */473 rc = usb_hc_connection_open(&usb_dev->hc_conn);474 if (rc != EOK) {475 usb_dev_disconnect(usb_dev->bus_session);476 *errstr_ptr = "hc connection open";477 return rc;478 }479 480 408 /* Retrieve standard descriptors. */ 481 409 rc = usb_device_retrieve_descriptors(usb_dev); 482 410 if (rc != EOK) { 483 411 *errstr_ptr = "descriptor retrieval"; 484 usb_hc_connection_close(&usb_dev->hc_conn);485 412 usb_dev_disconnect(usb_dev->bus_session); 486 413 return rc; … … 499 426 rc = usb_device_create_pipes(usb_dev, endpoints); 500 427 if (rc != EOK) { 501 usb_hc_connection_close(&usb_dev->hc_conn);502 428 usb_device_fini(usb_dev); 503 429 *errstr_ptr = "pipes initialization"; … … 506 432 } 507 433 508 usb_hc_connection_close(&usb_dev->hc_conn);509 434 return EOK; 510 435 } … … 645 570 } 646 571 647 usb_address_t usb_device_address(usb_device_t *usb_dev)648 {649 assert(usb_dev);650 return usb_dev->wire.address;651 }652 653 devman_handle_t usb_device_hc_handle(usb_device_t *usb_dev)654 {655 assert(usb_dev);656 return usb_dev->hc_conn.hc_handle;657 }658 572 /** 659 573 * @}
Note:
See TracChangeset
for help on using the changeset viewer.