Changeset 403bb26 in mainline
- Timestamp:
- 2010-12-12T17:13:01Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5d4eb2df
- Parents:
- 3b9f1fd (diff), 8e8289d (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. - Location:
- uspace/drv/usbhub
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/port_status.h
r3b9f1fd r403bb26 55 55 request->index = port; 56 56 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS; 57 request->request = USB_HUB_REQUEST_GET_STAT E;57 request->request = USB_HUB_REQUEST_GET_STATUS; 58 58 request->value = 0; 59 59 request->length = 4; -
uspace/drv/usbhub/usbhub.h
r3b9f1fd r403bb26 40 40 #include "usb/hcdhubd.h" 41 41 42 42 /** basic information about device attached to hub */ 43 typedef struct{ 44 usb_address_t address; 45 devman_handle_t devman_handle; 46 }usb_hub_attached_device_t; 43 47 44 48 /** Information about attached hub. */ … … 46 50 /** Number of ports. */ 47 51 int port_count; 52 /** attached device handles */ 53 usb_hub_attached_device_t * attached_devs; 48 54 /** General usb device info. */ 49 55 usb_hcd_attached_device_info_t * usb_device; -
uspace/drv/usbhub/utils.c
r3b9f1fd r403bb26 351 351 //printf("[usb_hub] setting port count to %d\n",descriptor->ports_count); 352 352 result->port_count = descriptor->ports_count; 353 result->attached_devs = (usb_hub_attached_device_t*) 354 malloc(result->port_count * sizeof(usb_hub_attached_device_t)); 355 int i; 356 for(i=0;i<result->port_count;++i){ 357 result->attached_devs[i].devman_handle=0; 358 result->attached_devs[i].address=0; 359 } 353 360 //printf("[usb_hub] freeing data\n"); 354 361 free(serialized_descriptor); … … 385 392 target.address = hub_info->usb_device->address; 386 393 target.endpoint = 0; 394 395 //get configuration descriptor 396 // this is not fully correct - there are more configurations 397 // and all should be checked 398 usb_standard_device_descriptor_t std_descriptor; 399 opResult = usb_drv_req_get_device_descriptor(hc, target.address, 400 &std_descriptor); 401 if(opResult!=EOK){ 402 printf("[usb_hub] could not get device descriptor, %d\n",opResult); 403 return 1;///\TODO some proper error code needed 404 } 405 printf("[usb_hub] hub has %d configurations\n",std_descriptor.configuration_count); 406 if(std_descriptor.configuration_count<1){ 407 printf("[usb_hub] THERE ARE NO CONFIGURATIONS AVAILABLE\n"); 408 } 409 usb_standard_configuration_descriptor_t config_descriptor; 410 opResult = usb_drv_req_get_bare_configuration_descriptor(hc, 411 target.address, 0, 412 &config_descriptor); 413 if(opResult!=EOK){ 414 printf("[usb_hub] could not get configuration descriptor, %d\n",opResult); 415 return 1;///\TODO some proper error code needed 416 } 417 //set configuration 418 request.request_type = 0; 419 request.request = USB_DEVREQ_SET_CONFIGURATION; 420 request.index=0; 421 request.length=0; 422 request.value_high=0; 423 request.value_low = config_descriptor.configuration_number; 424 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0); 425 if (opResult != EOK) { 426 printf("[usb_hub]something went wrong when setting hub`s configuration, %d\n", opResult); 427 } 428 429 387 430 for (port = 0; port < hub_info->port_count; ++port) { 388 431 usb_hub_set_power_port_request(&request, port); … … 393 436 } 394 437 //ports powered, hub seems to be enabled 438 395 439 396 440 ipc_hangup(hc); … … 411 455 hub_info->usb_device->address, 412 456 hub_info->port_count); 457 printf("\tused configuration %d\n",config_descriptor.configuration_number); 413 458 414 459 return EOK; … … 432 477 int opResult; 433 478 printf("[usb_hub] some connection changed\n"); 434 479 //get default address 435 480 opResult = usb_drv_reserve_default_address(hc); 436 481 if (opResult != EOK) { … … 478 523 } 479 524 480 481 525 usb_drv_release_default_address(hc); 482 526 … … 488 532 return; 489 533 } 490 usb_drv_bind_address(hc, new_device_address, child_handle); 534 hub->attached_devs[port].devman_handle = child_handle; 535 hub->attached_devs[port].address = new_device_address; 536 537 opResult = usb_drv_bind_address(hc, new_device_address, child_handle); 538 if (opResult != EOK) { 539 printf("[usb_hub] could not assign address of device in hcd \n"); 540 return; 541 } 491 542 492 543 } … … 498 549 * @param target 499 550 */ 500 static void usb_hub_removed_device(int hc, uint16_t port, usb_target_t target) { 501 usb_device_request_setup_packet_t request; 551 static void usb_hub_removed_device( 552 usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 553 //usb_device_request_setup_packet_t request; 502 554 int opResult; 503 555 //disable port 504 usb_hub_set_disable_port_request(&request, port);556 /*usb_hub_set_disable_port_request(&request, port); 505 557 opResult = usb_drv_sync_control_write( 506 558 hc, target, … … 511 563 //continue; 512 564 printf("[usb_hub] something went wrong when disabling a port\n"); 513 } 514 //remove device 565 }*/ 566 /// \TODO remove device 567 568 hub->attached_devs[port].devman_handle=0; 515 569 //close address 516 // 517 518 ///\TODO this code is not complete 570 if(hub->attached_devs[port].address!=0){ 571 opResult = usb_drv_release_address(hc,hub->attached_devs[port].address); 572 if(opResult != EOK) { 573 printf("[usb_hub] could not release address of removed device: %d\n",opResult); 574 } 575 hub->attached_devs[port].address = 0; 576 }else{ 577 printf("[usb_hub] this is strange, disconnected device had no address\n"); 578 //device was disconnected before it`s port was reset - return default address 579 usb_drv_release_default_address(hc); 580 } 519 581 } 520 582 … … 525 587 * @param target 526 588 */ 527 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 589 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, 590 uint16_t port, usb_address_t address) { 528 591 printf("[usb_hub] interrupt at port %d\n", port); 529 592 //determine type of change 593 usb_target_t target; 594 target.address=address; 595 target.endpoint=0; 530 596 usb_port_status_t status; 531 597 size_t rcvd_size; … … 533 599 int opResult; 534 600 usb_hub_set_port_status_request(&request, port); 601 //endpoint 0 535 602 536 603 opResult = usb_drv_sync_control_read( … … 553 620 usb_hub_init_add_device(hc, port, target); 554 621 } else { 555 usb_hub_removed_device(h c, port, target);622 usb_hub_removed_device(hub, hc, port, target); 556 623 } 557 624 } … … 607 674 usb_target_t target; 608 675 target.address = hub_info->usb_device->address; 609 target.endpoint = 1; 676 target.endpoint = 1;/// \TODO get from endpoint descriptor 610 677 611 678 size_t port_count = hub_info->port_count; … … 643 710 bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2; 644 711 if (interrupt) { 645 usb_hub_process_interrupt(hub_info, hc, port, target); 712 usb_hub_process_interrupt( 713 hub_info, hc, port, hub_info->usb_device->address); 646 714 } 647 715 }
Note:
See TracChangeset
for help on using the changeset viewer.