Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/root_hub.c

    rf3da9b2 r0368669c  
    4343#include <usb/classes/hub.h>
    4444
     45/**
     46 *      standart device descriptor for ohci root hub
     47 */
     48static const usb_standard_device_descriptor_t ohci_rh_device_descriptor =
     49{
     50                .configuration_count = 1,
     51                .descriptor_type = USB_DESCTYPE_DEVICE,
     52                .device_class = USB_CLASS_HUB,
     53                .device_protocol = 0,
     54                .device_subclass = 0,
     55                .device_version = 0,
     56                .length = sizeof(usb_standard_device_descriptor_t),
     57                /// \TODO this value is guessed
     58                .max_packet_size = 8,
     59                .vendor_id = 0x16db,
     60                .product_id = 0x0001,
     61                /// \TODO these values migt be different
     62                .str_serial_number = 0,
     63                .usb_spec_version = 0,
     64};
     65
     66/**
     67 * standart configuration descriptor with filled common values
     68 * for ohci root hubs
     69 */
     70static const usb_standard_configuration_descriptor_t ohci_rh_conf_descriptor =
     71{
     72        /// \TODO some values are default or guessed
     73        .attributes = 1<<7,
     74        .configuration_number = 1,
     75        .descriptor_type = USB_DESCTYPE_CONFIGURATION,
     76        .interface_count = 1,
     77        .length = sizeof(usb_standard_configuration_descriptor_t),
     78        .max_power = 100,
     79        .str_configuration = 0,
     80};
     81
     82/**
     83 * standart ohci root hub interface descriptor
     84 */
     85static const usb_standard_interface_descriptor_t ohci_rh_iface_descriptor =
     86{
     87        .alternate_setting = 0,
     88        .descriptor_type = USB_DESCTYPE_INTERFACE,
     89        .endpoint_count = 1,
     90        .interface_class = USB_CLASS_HUB,
     91        /// \TODO is this correct?
     92        .interface_number = 1,
     93        .interface_protocol = 0,
     94        .interface_subclass = 0,
     95        .length = sizeof(usb_standard_interface_descriptor_t),
     96        .str_interface = 0,
     97};
     98
     99/**
     100 * standart ohci root hub endpoint descriptor
     101 */
     102static const usb_standard_endpoint_descriptor_t ohci_rh_ep_descriptor =
     103{
     104        .attributes = USB_TRANSFER_INTERRUPT,
     105        .descriptor_type = USB_DESCTYPE_ENDPOINT,
     106        .endpoint_address = 1 + (1<<7),
     107        .length = sizeof(usb_standard_endpoint_descriptor_t),
     108        .max_packet_size = 8,
     109        .poll_interval = 255,
     110};
    45111
    46112/** Root hub initialization
     
    220286
    221287/**
    222  * create standard device descriptor for a hub
    223  * @return newly allocated descriptor
    224  */
    225 static usb_standard_device_descriptor_t *
    226         usb_ohci_rh_create_standard_device_descriptor(){
    227         usb_standard_device_descriptor_t * descriptor =
    228                                 (usb_standard_device_descriptor_t*)
    229                                 malloc(sizeof(usb_standard_device_descriptor_t));
    230         descriptor->configuration_count = 1;
    231         descriptor->descriptor_type = USB_DESCTYPE_DEVICE;
    232         descriptor->device_class = USB_CLASS_HUB;
    233         descriptor->device_protocol = 0;
    234         descriptor->device_subclass = 0;
    235         descriptor->device_version = 0;
    236         descriptor->length = sizeof(usb_standard_device_descriptor_t);
    237         /// \TODO this value is guessed
    238         descriptor->max_packet_size = 8;
    239         descriptor->product_id = 0x0001;
    240         /// \TODO these values migt be different
    241         descriptor->str_serial_number = 0;
    242         descriptor->str_serial_number = 0;
    243         descriptor->usb_spec_version = 0;
    244         descriptor->vendor_id = 0x16db;
    245         return descriptor;
    246 }
    247 
    248 /**
    249288 * create standart configuration descriptor for the root hub instance
    250289 * @param instance root hub instance
     
    254293usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){
    255294        usb_standard_configuration_descriptor_t * descriptor =
    256                         (usb_standard_configuration_descriptor_t*)
    257295                        malloc(sizeof(usb_standard_configuration_descriptor_t));
    258         /// \TODO some values are default or guessed
    259         descriptor->attributes = 1<<7;
    260         descriptor->configuration_number = 1;
    261         descriptor->descriptor_type = USB_DESCTYPE_CONFIGURATION;
    262         descriptor->interface_count = 1;
    263         descriptor->length = sizeof(usb_standard_configuration_descriptor_t);
    264         descriptor->max_power = 100;
    265         descriptor->str_configuration = 0;
     296        memcpy(descriptor, &ohci_rh_conf_descriptor,
     297                sizeof(usb_standard_configuration_descriptor_t));
    266298        /// \TODO should this include device descriptor?
    267         size_t hub_descriptor_size = 7 +
     299        const size_t hub_descriptor_size = 7 +
    268300                        2* (instance->port_count / 8 +
    269301                        ((instance->port_count % 8 > 0) ? 1 : 0));
     
    277309
    278310/**
    279  * create standard interface descriptor for a root hub
    280  * @return newly allocated descriptor
    281  */
    282 static usb_standard_interface_descriptor_t *
    283 usb_ohci_rh_create_standard_interface_descriptor(){
    284         usb_standard_interface_descriptor_t * descriptor =
    285                                 (usb_standard_interface_descriptor_t*)
    286                                 malloc(sizeof(usb_standard_interface_descriptor_t));
    287         descriptor->alternate_setting = 0;
    288         descriptor->descriptor_type = USB_DESCTYPE_INTERFACE;
    289         descriptor->endpoint_count = 1;
    290         descriptor->interface_class = USB_CLASS_HUB;
    291         /// \TODO is this correct?
    292         descriptor->interface_number = 1;
    293         descriptor->interface_protocol = 0;
    294         descriptor->interface_subclass = 0;
    295         descriptor->length = sizeof(usb_standard_interface_descriptor_t);
    296         descriptor->str_interface = 0;
    297         return descriptor;
    298 }
    299 
    300 /**
    301  * create standard endpoint descriptor for a root hub
    302  * @return newly allocated descriptor
    303  */
    304 static usb_standard_endpoint_descriptor_t *
    305 usb_ohci_rh_create_standard_endpoint_descriptor(){
    306         usb_standard_endpoint_descriptor_t * descriptor =
    307                         (usb_standard_endpoint_descriptor_t*)
    308                         malloc(sizeof(usb_standard_endpoint_descriptor_t));
    309         descriptor->attributes = USB_TRANSFER_INTERRUPT;
    310         descriptor->descriptor_type = USB_DESCTYPE_ENDPOINT;
    311         descriptor->endpoint_address = 1 + (1<<7);
    312         descriptor->length = sizeof(usb_standard_endpoint_descriptor_t);
    313         descriptor->max_packet_size = 8;
    314         descriptor->poll_interval = 255;
    315         return descriptor;
    316 }
    317 
    318 /**
    319311 * create answer to a descriptor request
    320312 *
     
    330322                        (usb_device_request_setup_packet_t*)request->setup_buffer;
    331323        size_t size;
    332         void * result_descriptor;
    333         uint16_t setup_request_value = setup_request->value_high;
     324        const void * result_descriptor = NULL;
     325        const uint16_t setup_request_value = setup_request->value_high;
    334326                        //(setup_request->value_low << 8);
    335         if(setup_request_value == USB_DESCTYPE_HUB){
    336                 usb_log_debug("USB_DESCTYPE_HUB\n");
    337                 //create hub descriptor
    338                 uint8_t * descriptor;
    339                 usb_create_serialized_hub_descriptor(instance,
    340                                 &descriptor, &size);
    341                 result_descriptor = descriptor;
    342         }else if(setup_request_value == USB_DESCTYPE_DEVICE){
    343                 //create std device descriptor
    344                 usb_log_debug("USB_DESCTYPE_DEVICE\n");
    345                 result_descriptor =
    346                                 usb_ohci_rh_create_standard_device_descriptor();
    347                 size = sizeof(usb_standard_device_descriptor_t);
    348         }else if(setup_request_value == USB_DESCTYPE_CONFIGURATION){
    349                 usb_log_debug("USB_DESCTYPE_CONFIGURATION\n");
    350                 result_descriptor =
    351                                 usb_ohci_rh_create_standart_configuration_descriptor(instance);
    352                 size = sizeof(usb_standard_configuration_descriptor_t);
    353 
    354         }else if(setup_request_value == USB_DESCTYPE_INTERFACE){
    355                 usb_log_debug("USB_DESCTYPE_INTERFACE\n");
    356                 result_descriptor =
    357                                 usb_ohci_rh_create_standard_interface_descriptor();
    358                 size = sizeof(usb_standard_interface_descriptor_t);
    359         }else if(setup_request_value == USB_DESCTYPE_ENDPOINT){
    360                 usb_log_debug("USB_DESCTYPE_ENDPOINT\n");
    361                 result_descriptor =
    362                                 usb_ohci_rh_create_standard_endpoint_descriptor();
    363                 size = sizeof(usb_standard_endpoint_descriptor_t);
    364         }else{
    365                 usb_log_debug("USB_DESCTYPE_EINVAL %d \n",setup_request->value);
    366                 usb_log_debug("\ttype %d\n\trequest %d\n\tvalue %d\n\tindex %d\n\tlen %d\n ",
    367                                 setup_request->request_type,
    368                                 setup_request->request,
    369                                 setup_request_value,
    370                                 setup_request->index,
    371                                 setup_request->length
    372                                 );
    373                 return EINVAL;
     327        bool del = false;
     328        switch (setup_request_value)
     329        {
     330                case USB_DESCTYPE_HUB: {
     331                        uint8_t * descriptor;
     332                        usb_create_serialized_hub_descriptor(
     333                                instance, &descriptor, &size);
     334                        result_descriptor = descriptor;
     335                        if(result_descriptor) del = true;
     336                        break;
     337                }
     338                case USB_DESCTYPE_DEVICE: {
     339                        usb_log_debug("USB_DESCTYPE_DEVICE\n");
     340                        result_descriptor = &ohci_rh_device_descriptor;
     341                        size = sizeof(ohci_rh_device_descriptor);
     342                        break;
     343                }
     344                case USB_DESCTYPE_CONFIGURATION: {
     345                        usb_log_debug("USB_DESCTYPE_CONFIGURATION\n");
     346                        usb_standard_configuration_descriptor_t * descriptor =
     347                                        usb_ohci_rh_create_standart_configuration_descriptor(
     348                                                instance);
     349                        result_descriptor = descriptor;
     350                        size = sizeof(usb_standard_configuration_descriptor_t);
     351                        del = true;
     352                        break;
     353                }
     354                case USB_DESCTYPE_INTERFACE: {
     355                        usb_log_debug("USB_DESCTYPE_INTERFACE\n");
     356                        result_descriptor = &ohci_rh_iface_descriptor;
     357                        size = sizeof(ohci_rh_iface_descriptor);
     358                        break;
     359                }
     360                case USB_DESCTYPE_ENDPOINT: {
     361                        usb_log_debug("USB_DESCTYPE_ENDPOINT\n");
     362                        result_descriptor = &ohci_rh_ep_descriptor;
     363                        size = sizeof(ohci_rh_ep_descriptor);
     364                        break;
     365                }
     366                default: {
     367                        usb_log_debug("USB_DESCTYPE_EINVAL %d \n",setup_request->value);
     368                        usb_log_debug("\ttype %d\n\trequest %d\n\tvalue %d\n\tindex %d\n\tlen %d\n ",
     369                                        setup_request->request_type,
     370                                        setup_request->request,
     371                                        setup_request_value,
     372                                        setup_request->index,
     373                                        setup_request->length
     374                                        );
     375                        return EINVAL;
     376                }
    374377        }
    375378        if(request->buffer_size < size){
     
    378381        request->transfered_size = size;
    379382        memcpy(request->buffer,result_descriptor,size);
    380         free(result_descriptor);
     383        if (del)
     384                free(result_descriptor);
    381385        return EOK;
    382386}
     
    644648void rh_interrupt(rh_t *instance)
    645649{
    646         usb_log_info("Whoa whoa wait, I`m not supposed to receive interrupts, am I?\n");
     650        usb_log_info("Whoa whoa wait, I`m not supposed to receive any interrupts, am I?\n");
    647651        /* TODO: implement? */
    648652}
Note: See TracChangeset for help on using the changeset viewer.