Changes in / [5d4eb2df:a39f4cf] in mainline
- Location:
- uspace
- Files:
-
- 3 added
- 2 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhub/port_status.h
r5d4eb2df ra39f4cf 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 US;57 request->request = USB_HUB_REQUEST_GET_STATE; 58 58 request->value = 0; 59 59 request->length = 4; -
uspace/drv/usbhub/usbhub.h
r5d4eb2df ra39f4cf 40 40 #include "usb/hcdhubd.h" 41 41 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; 42 47 43 48 44 /** Information about attached hub. */ … … 50 46 /** Number of ports. */ 51 47 int port_count; 52 /** attached device handles */53 usb_hub_attached_device_t * attached_devs;54 48 /** General usb device info. */ 55 49 usb_hcd_attached_device_info_t * usb_device; -
uspace/drv/usbhub/utils.c
r5d4eb2df ra39f4cf 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 }360 353 //printf("[usb_hub] freeing data\n"); 361 354 free(serialized_descriptor); … … 392 385 target.address = hub_info->usb_device->address; 393 386 target.endpoint = 0; 394 395 //get configuration descriptor396 // this is not fully correct - there are more configurations397 // and all should be checked398 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 needed404 }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 needed416 }417 //set configuration418 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 387 for (port = 0; port < hub_info->port_count; ++port) { 431 388 usb_hub_set_power_port_request(&request, port); … … 436 393 } 437 394 //ports powered, hub seems to be enabled 438 439 395 440 396 ipc_hangup(hc); … … 455 411 hub_info->usb_device->address, 456 412 hub_info->port_count); 457 printf("\tused configuration %d\n",config_descriptor.configuration_number);458 413 459 414 return EOK; … … 477 432 int opResult; 478 433 printf("[usb_hub] some connection changed\n"); 479 //get default address 434 480 435 opResult = usb_drv_reserve_default_address(hc); 481 436 if (opResult != EOK) { … … 523 478 } 524 479 480 525 481 usb_drv_release_default_address(hc); 526 482 … … 532 488 return; 533 489 } 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 } 490 usb_drv_bind_address(hc, new_device_address, child_handle); 542 491 543 492 } … … 549 498 * @param target 550 499 */ 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; 500 static void usb_hub_removed_device(int hc, uint16_t port, usb_target_t target) { 501 usb_device_request_setup_packet_t request; 554 502 int opResult; 555 503 //disable port 556 /*usb_hub_set_disable_port_request(&request, port);504 usb_hub_set_disable_port_request(&request, port); 557 505 opResult = usb_drv_sync_control_write( 558 506 hc, target, … … 563 511 //continue; 564 512 printf("[usb_hub] something went wrong when disabling a port\n"); 565 }*/ 566 /// \TODO remove device 567 568 hub->attached_devs[port].devman_handle=0; 513 } 514 //remove device 569 515 //close address 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 } 516 // 517 518 ///\TODO this code is not complete 581 519 } 582 520 … … 587 525 * @param target 588 526 */ 589 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, 590 uint16_t port, usb_address_t address) { 527 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) { 591 528 printf("[usb_hub] interrupt at port %d\n", port); 592 529 //determine type of change 593 usb_target_t target;594 target.address=address;595 target.endpoint=0;596 530 usb_port_status_t status; 597 531 size_t rcvd_size; … … 599 533 int opResult; 600 534 usb_hub_set_port_status_request(&request, port); 601 //endpoint 0602 535 603 536 opResult = usb_drv_sync_control_read( … … 620 553 usb_hub_init_add_device(hc, port, target); 621 554 } else { 622 usb_hub_removed_device(h ub, hc, port, target);555 usb_hub_removed_device(hc, port, target); 623 556 } 624 557 } … … 674 607 usb_target_t target; 675 608 target.address = hub_info->usb_device->address; 676 target.endpoint = 1; /// \TODO get from endpoint descriptor609 target.endpoint = 1; 677 610 678 611 size_t port_count = hub_info->port_count; … … 710 643 bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2; 711 644 if (interrupt) { 712 usb_hub_process_interrupt( 713 hub_info, hc, port, hub_info->usb_device->address); 645 usb_hub_process_interrupt(hub_info, hc, port, target); 714 646 } 715 647 }
Note:
See TracChangeset
for help on using the changeset viewer.