Changeset 48d4231 in mainline for uspace/drv/usbhub/usbhub.c
- Timestamp:
- 2011-03-30T19:44:49Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ecb107b
- Parents:
- f62468c (diff), 27bdfa5 (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/usbhub/usbhub.c
rf62468c r48d4231 53 53 #include "usb/classes/classes.h" 54 54 55 56 static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port, 57 usb_speed_t speed); 58 59 static int usb_hub_trigger_connecting_non_removable_devices( 60 usb_hub_info_t * hub, usb_hub_descriptor_t * descriptor); 61 62 /** 63 * control loop running in hub`s fibril 64 * 65 * Hub`s fibril periodically asks for changes on hub and if needded calls 66 * change handling routine. 67 * @warning currently hub driver asks for changes once a second 68 * @param hub_info_param hub representation pointer 69 * @return zero 70 */ 55 71 int usb_hub_control_loop(void * hub_info_param){ 56 72 usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param; … … 91 107 92 108 /** 93 * Load hub-specific information into hub_info structure .109 * Load hub-specific information into hub_info structure and process if needed 94 110 * 95 111 * Particularly read port count and initialize structure holding port 96 * information. 112 * information. If there are non-removable devices, start initializing them. 97 113 * This function is hub-specific and should be run only after the hub is 98 114 * configured using usb_hub_set_configuration function. 99 * @param hub_info pointer to structure with usb hub data115 * @param hub_info hub representation 100 116 * @return error code 101 117 */ 102 static int usb_hub_ get_hub_specific_info(usb_hub_info_t * hub_info){118 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info){ 103 119 // get hub descriptor 104 120 usb_log_debug("creating serialized descriptor\n"); … … 107 123 108 124 /* this was one fix of some bug, should not be needed anymore 125 * these lines allow to reset hub once more, it can be used as 126 * brute-force initialization for non-removable devices 109 127 int opResult = usb_request_set_configuration(&result->endpoints.control, 1); 110 128 if(opResult!=EOK){ … … 141 159 hub_info->attached_devs[i].address=0; 142 160 } 161 //handle non-removable devices 162 usb_hub_trigger_connecting_non_removable_devices(hub_info, descriptor); 143 163 usb_log_debug2("freeing data\n"); 144 164 free(serialized_descriptor); … … 152 172 * Check whether there is at least one configuration and sets the first one. 153 173 * This function should be run prior to running any hub-specific action. 154 * @param hub_info 155 * @return 174 * @param hub_info hub representation 175 * @return error code 156 176 */ 157 177 static int usb_hub_set_configuration(usb_hub_info_t * hub_info){ … … 218 238 } 219 239 //get port count and create attached_devs 220 opResult = usb_hub_ get_hub_specific_info(hub_info);240 opResult = usb_hub_process_hub_specific_info(hub_info); 221 241 if(opResult!=EOK){ 222 242 usb_log_error("could not set hub configuration, errno %d\n",opResult); … … 256 276 //********************************************* 257 277 // 258 // hub driver code, main loop 278 // hub driver code, main loop and port handling 259 279 // 260 280 //********************************************* 281 282 /** 283 * triggers actions to connect non0removable devices 284 * 285 * This will trigger operations leading to activated non-removable device. 286 * Control pipe of the hub must be open fo communication. 287 * @param hub hub representation 288 * @param descriptor usb hub descriptor 289 * @return error code 290 */ 291 static int usb_hub_trigger_connecting_non_removable_devices(usb_hub_info_t * hub, 292 usb_hub_descriptor_t * descriptor) 293 { 294 usb_log_info("attaching non-removable devices(if any)\n"); 295 usb_device_request_setup_packet_t request; 296 int opResult; 297 size_t rcvd_size; 298 usb_port_status_t status; 299 uint8_t * non_removable_dev_bitmap = descriptor->devices_removable; 300 int port; 301 for(port=1;port<=descriptor->ports_count;++port){ 302 bool is_non_removable = 303 ((non_removable_dev_bitmap[port/8]) >> (port%8)) %2; 304 if(is_non_removable){ 305 usb_log_debug("non-removable device on port %d\n",port); 306 usb_hub_set_port_status_request(&request, port); 307 opResult = usb_pipe_control_read( 308 hub->control_pipe, 309 &request, sizeof(usb_device_request_setup_packet_t), 310 &status, 4, &rcvd_size 311 ); 312 if (opResult != EOK) { 313 usb_log_error("could not get port status of port %d errno:%d\n", 314 port, opResult); 315 return opResult; 316 } 317 //set the status change bit, so it will be noticed in driver loop 318 if(usb_port_dev_connected(&status)){ 319 usb_hub_set_enable_port_feature_request(&request, port, 320 USB_HUB_FEATURE_C_PORT_CONNECTION); 321 opResult = usb_pipe_control_read( 322 hub->control_pipe, 323 &request, sizeof(usb_device_request_setup_packet_t), 324 &status, 4, &rcvd_size 325 ); 326 if (opResult != EOK) { 327 usb_log_warning( 328 "could not set port change on port %d errno:%d\n", 329 port, opResult); 330 } 331 } 332 } 333 } 334 return EOK; 335 } 336 261 337 262 338 /** … … 280 356 /** 281 357 * Reset the port with new device and reserve the default address. 282 * @param h c283 * @param port 284 * @param target358 * @param hub hub representation 359 * @param port port number, starting from 1 360 * @param speed transfer speed of attached device, one of low, full or high 285 361 */ 286 362 static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port, … … 315 391 if (opResult != EOK) { 316 392 usb_log_error("something went wrong when reseting a port %d\n",opResult); 317 //usb_hub_release_default_address(hc);318 393 usb_hub_release_default_address(hub); 319 394 } … … 323 398 /** 324 399 * Finalize adding new device after port reset 325 * @param hc 326 * @param port 327 * @param target 400 * 401 * Set device`s address and start it`s driver. 402 * @param hub hub representation 403 * @param port port number, starting from 1 404 * @param speed transfer speed of attached device, one of low, full or high 328 405 */ 329 406 static void usb_hub_finalize_add_device( usb_hub_info_t * hub, … … 375 452 } 376 453 377 378 454 //opResult = usb_hub_release_default_address(hc); 379 455 opResult = usb_hub_release_default_address(hub); … … 410 486 411 487 /** 412 * Unregister device address in hc 413 * @param hc 414 * @param port 415 * @param target 488 * routine called when a device on port has been removed 489 * 490 * If the device on port had default address, it releases default address. 491 * Otherwise does not do anything, because DDF does not allow to remove device 492 * from it`s device tree. 493 * @param hub hub representation 494 * @param port port number, starting from 1 416 495 */ 417 496 static void usb_hub_removed_device( … … 452 531 * Turn off the power on the port. 453 532 * 454 * @param hub 455 * @param port 533 * @param hub hub representation 534 * @param port port number, starting from 1 456 535 */ 457 536 static void usb_hub_over_current( usb_hub_info_t * hub, … … 468 547 /** 469 548 * Process interrupts on given hub port 470 * @param hc 471 * @param port 472 * @param target 549 * 550 * Accepts connection, over current and port reset change. 551 * @param hub hub representation 552 * @param port port number, starting from 1 473 553 */ 474 554 static void usb_hub_process_interrupt(usb_hub_info_t * hub, … … 541 621 542 622 /** 543 * Check changes on particular hub 544 * @param hub_info_param pointer to usb_hub_info_t structure 545 * @return error code if there is problem when initializing communication with 546 * hub, EOK otherwise 623 * check changes on hub 624 * 625 * Handles changes on each port with a status change. 626 * @param hub_info hub representation 627 * @return error code 547 628 */ 548 629 int usb_hub_check_hub_changes(usb_hub_info_t * hub_info){
Note:
See TracChangeset
for help on using the changeset viewer.