Changeset 403bb26 in mainline


Ignore:
Timestamp:
2010-12-12T17:13:01Z (14 years ago)
Author:
Matus Dekanek <smekideki@…>
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.
Message:

merge from smekideki

Location:
uspace/drv/usbhub
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhub/port_status.h

    r3b9f1fd r403bb26  
    5555        request->index = port;
    5656        request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
    57         request->request = USB_HUB_REQUEST_GET_STATE;
     57        request->request = USB_HUB_REQUEST_GET_STATUS;
    5858        request->value = 0;
    5959        request->length = 4;
  • uspace/drv/usbhub/usbhub.h

    r3b9f1fd r403bb26  
    4040#include "usb/hcdhubd.h"
    4141
    42 
     42/** basic information about device attached to hub */
     43typedef struct{
     44        usb_address_t address;
     45        devman_handle_t devman_handle;
     46}usb_hub_attached_device_t;
    4347
    4448/** Information about attached hub. */
     
    4650        /** Number of ports. */
    4751        int port_count;
     52        /** attached device handles */
     53        usb_hub_attached_device_t * attached_devs;
    4854        /** General usb device info. */
    4955        usb_hcd_attached_device_info_t * usb_device;
  • uspace/drv/usbhub/utils.c

    r3b9f1fd r403bb26  
    351351        //printf("[usb_hub] setting port count to %d\n",descriptor->ports_count);
    352352        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        }
    353360        //printf("[usb_hub] freeing data\n");
    354361        free(serialized_descriptor);
     
    385392        target.address = hub_info->usb_device->address;
    386393        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
    387430        for (port = 0; port < hub_info->port_count; ++port) {
    388431                usb_hub_set_power_port_request(&request, port);
     
    393436        }
    394437        //ports powered, hub seems to be enabled
     438       
    395439
    396440        ipc_hangup(hc);
     
    411455                        hub_info->usb_device->address,
    412456                        hub_info->port_count);
     457        printf("\tused configuration %d\n",config_descriptor.configuration_number);
    413458
    414459        return EOK;
     
    432477        int opResult;
    433478        printf("[usb_hub] some connection changed\n");
    434 
     479        //get default address
    435480        opResult = usb_drv_reserve_default_address(hc);
    436481        if (opResult != EOK) {
     
    478523        }
    479524
    480 
    481525        usb_drv_release_default_address(hc);
    482526
     
    488532                return;
    489533        }
    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        }
    491542       
    492543}
     
    498549 * @param target
    499550 */
    500 static void usb_hub_removed_device(int hc, uint16_t port, usb_target_t target) {
    501         usb_device_request_setup_packet_t request;
     551static 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;
    502554        int opResult;
    503555        //disable port
    504         usb_hub_set_disable_port_request(&request, port);
     556        /*usb_hub_set_disable_port_request(&request, port);
    505557        opResult = usb_drv_sync_control_write(
    506558                        hc, target,
     
    511563                //continue;
    512564                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;
    515569        //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        }
    519581}
    520582
     
    525587 * @param target
    526588 */
    527 static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) {
     589static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc,
     590        uint16_t port, usb_address_t address) {
    528591        printf("[usb_hub] interrupt at port %d\n", port);
    529592        //determine type of change
     593        usb_target_t target;
     594        target.address=address;
     595        target.endpoint=0;
    530596        usb_port_status_t status;
    531597        size_t rcvd_size;
     
    533599        int opResult;
    534600        usb_hub_set_port_status_request(&request, port);
     601        //endpoint 0
    535602
    536603        opResult = usb_drv_sync_control_read(
     
    553620                        usb_hub_init_add_device(hc, port, target);
    554621                } else {
    555                         usb_hub_removed_device(hc, port, target);
     622                        usb_hub_removed_device(hub, hc, port, target);
    556623                }
    557624        }
     
    607674                usb_target_t target;
    608675                target.address = hub_info->usb_device->address;
    609                 target.endpoint = 1;
     676                target.endpoint = 1;/// \TODO get from endpoint descriptor
    610677
    611678                size_t port_count = hub_info->port_count;
     
    643710                        bool interrupt = (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2;
    644711                        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);
    646714                        }
    647715                }
Note: See TracChangeset for help on using the changeset viewer.