Changeset ecf52c4b in mainline for uspace/drv/usbhub/utils.c
- Timestamp:
- 2010-12-12T20:24:12Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2aee3e06
- Parents:
- 138a7fd (diff), 682b697 (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/utils.c
r138a7fd recf52c4b 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+1) * sizeof(usb_hub_attached_device_t)); 355 int i; 356 for(i=0;i<result->port_count+1;++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; 387 for (port = 0; port < hub_info->port_count; ++port) { 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 430 for (port = 1; port < hub_info->port_count+1; ++port) { 388 431 usb_hub_set_power_port_request(&request, port); 389 432 opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0); 433 printf("[usb_hub] powering port %d\n",port); 390 434 if (opResult != EOK) { 391 435 printf("[usb_hub]something went wrong when setting hub`s %dth port\n", port); … … 393 437 } 394 438 //ports powered, hub seems to be enabled 439 395 440 396 441 ipc_hangup(hc); … … 411 456 hub_info->usb_device->address, 412 457 hub_info->port_count); 458 printf("\tused configuration %d\n",config_descriptor.configuration_number); 413 459 414 460 return EOK; … … 432 478 int opResult; 433 479 printf("[usb_hub] some connection changed\n"); 434 480 //get default address 435 481 opResult = usb_drv_reserve_default_address(hc); 436 482 if (opResult != EOK) { … … 478 524 } 479 525 480 481 526 usb_drv_release_default_address(hc); 482 527 … … 488 533 return; 489 534 } 490 usb_drv_bind_address(hc, new_device_address, child_handle); 535 hub->attached_devs[port].devman_handle = child_handle; 536 hub->attached_devs[port].address = new_device_address; 537 538 opResult = usb_drv_bind_address(hc, new_device_address, child_handle); 539 if (opResult != EOK) { 540 printf("[usb_hub] could not assign address of device in hcd \n"); 541 return; 542 } 543 printf("[usb_hub] new device address %d, handle %d\n", 544 new_device_address, child_handle); 545 sleep(60); 491 546 492 547 } … … 498 553 * @param target 499 554 */ 500 static void usb_hub_removed_device(int hc, uint16_t port, usb_target_t target) { 501 usb_device_request_setup_packet_t request; 555 static void usb_hub_removed_device( 556 usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 557 //usb_device_request_setup_packet_t request; 502 558 int opResult; 503 559 //disable port 504 usb_hub_set_disable_port_request(&request, port);560 /*usb_hub_set_disable_port_request(&request, port); 505 561 opResult = usb_drv_sync_control_write( 506 562 hc, target, … … 511 567 //continue; 512 568 printf("[usb_hub] something went wrong when disabling a port\n"); 513 } 514 //remove device 569 }*/ 570 /// \TODO remove device 571 572 hub->attached_devs[port].devman_handle=0; 515 573 //close address 516 // 517 518 ///\TODO this code is not complete 574 if(hub->attached_devs[port].address!=0){ 575 opResult = usb_drv_release_address(hc,hub->attached_devs[port].address); 576 if(opResult != EOK) { 577 printf("[usb_hub] could not release address of removed device: %d\n",opResult); 578 } 579 hub->attached_devs[port].address = 0; 580 }else{ 581 printf("[usb_hub] this is strange, disconnected device had no address\n"); 582 //device was disconnected before it`s port was reset - return default address 583 usb_drv_release_default_address(hc); 584 } 519 585 } 520 586 … … 525 591 * @param target 526 592 */ 527 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 593 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, 594 uint16_t port, usb_address_t address) { 528 595 printf("[usb_hub] interrupt at port %d\n", port); 529 596 //determine type of change 597 usb_target_t target; 598 target.address=address; 599 target.endpoint=0; 530 600 usb_port_status_t status; 531 601 size_t rcvd_size; … … 533 603 int opResult; 534 604 usb_hub_set_port_status_request(&request, port); 605 //endpoint 0 535 606 536 607 opResult = usb_drv_sync_control_read( … … 553 624 usb_hub_init_add_device(hc, port, target); 554 625 } else { 555 usb_hub_removed_device(h c, port, target);626 usb_hub_removed_device(hub, hc, port, target); 556 627 } 557 628 } … … 571 642 usb_port_set_dev_connected(&status, false); 572 643 if (status) { 573 printf("[usb_hub]there was some unsupported change on port \n");644 printf("[usb_hub]there was some unsupported change on port %d\n",port); 574 645 } 575 646 /// \TODO handle other changes … … 607 678 usb_target_t target; 608 679 target.address = hub_info->usb_device->address; 609 target.endpoint = 1; 680 target.endpoint = 1;/// \TODO get from endpoint descriptor 681 printf("checking changes for hub at addr %d \n",target.address); 610 682 611 683 size_t port_count = hub_info->port_count; … … 620 692 621 693 // FIXME: count properly 622 size_t byte_length = ( port_count/ 8) + 1;694 size_t byte_length = ((port_count+1) / 8) + 1; 623 695 624 696 void *change_bitmap = malloc(byte_length); … … 640 712 } 641 713 unsigned int port; 642 for (port = 0; port < port_count; ++port) {714 for (port = 1; port < port_count+1; ++port) { 643 715 bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2; 644 716 if (interrupt) { 645 usb_hub_process_interrupt(hub_info, hc, port, target); 717 usb_hub_process_interrupt( 718 hub_info, hc, port, hub_info->usb_device->address); 646 719 } 647 720 }
Note:
See TracChangeset
for help on using the changeset viewer.