Changeset 0368669c in mainline


Ignore:
Timestamp:
2011-03-26T20:18:41Z (13 years ago)
Author:
Matus Dekanek <smekideki@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
df3ad97
Parents:
aee6c73
Message:

ohci root hub codelifting

Location:
uspace/drv/ohci
Files:
2 edited

Legend:

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

    raee6c73 r0368669c  
    4343#include <usb/classes/hub.h>
    4444
     45/**
     46 *      standart device descriptor for ohci root hub
     47 */
    4548static const usb_standard_device_descriptor_t ohci_rh_device_descriptor =
    4649{
     
    6164};
    6265
     66/**
     67 * standart configuration descriptor with filled common values
     68 * for ohci root hubs
     69 */
    6370static const usb_standard_configuration_descriptor_t ohci_rh_conf_descriptor =
    6471{
     
    7380};
    7481
     82/**
     83 * standart ohci root hub interface descriptor
     84 */
    7585static const usb_standard_interface_descriptor_t ohci_rh_iface_descriptor =
    7686{
     
    8797};
    8898
     99/**
     100 * standart ohci root hub endpoint descriptor
     101 */
    89102static const usb_standard_endpoint_descriptor_t ohci_rh_ep_descriptor =
    90103{
     
    273286
    274287/**
    275  * create standard device descriptor for a hub
    276  * @return newly allocated descriptor
    277  */
    278 static usb_standard_device_descriptor_t *
    279         usb_ohci_rh_create_standard_device_descriptor(){
    280         usb_standard_device_descriptor_t * descriptor =
    281                                 (usb_standard_device_descriptor_t*)
    282                                 malloc(sizeof(usb_standard_device_descriptor_t));
    283         descriptor->configuration_count = 1;
    284         descriptor->descriptor_type = USB_DESCTYPE_DEVICE;
    285         descriptor->device_class = USB_CLASS_HUB;
    286         descriptor->device_protocol = 0;
    287         descriptor->device_subclass = 0;
    288         descriptor->device_version = 0;
    289         descriptor->length = sizeof(usb_standard_device_descriptor_t);
    290         /// \TODO this value is guessed
    291         descriptor->max_packet_size = 8;
    292         descriptor->product_id = 0x0001;
    293         /// \TODO these values migt be different
    294         descriptor->str_serial_number = 0;
    295         descriptor->str_serial_number = 0;
    296         descriptor->usb_spec_version = 0;
    297         descriptor->vendor_id = 0x16db;
    298         return descriptor;
    299 }
    300 
    301 /**
    302288 * create standart configuration descriptor for the root hub instance
    303289 * @param instance root hub instance
     
    307293usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){
    308294        usb_standard_configuration_descriptor_t * descriptor =
    309                         (usb_standard_configuration_descriptor_t*)
    310295                        malloc(sizeof(usb_standard_configuration_descriptor_t));
    311         /// \TODO some values are default or guessed
    312         descriptor->attributes = 1<<7;
    313         descriptor->configuration_number = 1;
    314         descriptor->descriptor_type = USB_DESCTYPE_CONFIGURATION;
    315         descriptor->interface_count = 1;
    316         descriptor->length = sizeof(usb_standard_configuration_descriptor_t);
    317         descriptor->max_power = 100;
    318         descriptor->str_configuration = 0;
     296        memcpy(descriptor, &ohci_rh_conf_descriptor,
     297                sizeof(usb_standard_configuration_descriptor_t));
    319298        /// \TODO should this include device descriptor?
    320         size_t hub_descriptor_size = 7 +
     299        const size_t hub_descriptor_size = 7 +
    321300                        2* (instance->port_count / 8 +
    322301                        ((instance->port_count % 8 > 0) ? 1 : 0));
     
    330309
    331310/**
    332  * create standard interface descriptor for a root hub
    333  * @return newly allocated descriptor
    334  */
    335 static usb_standard_interface_descriptor_t *
    336 usb_ohci_rh_create_standard_interface_descriptor(){
    337         usb_standard_interface_descriptor_t * descriptor =
    338                                 (usb_standard_interface_descriptor_t*)
    339                                 malloc(sizeof(usb_standard_interface_descriptor_t));
    340         descriptor->alternate_setting = 0;
    341         descriptor->descriptor_type = USB_DESCTYPE_INTERFACE;
    342         descriptor->endpoint_count = 1;
    343         descriptor->interface_class = USB_CLASS_HUB;
    344         /// \TODO is this correct?
    345         descriptor->interface_number = 1;
    346         descriptor->interface_protocol = 0;
    347         descriptor->interface_subclass = 0;
    348         descriptor->length = sizeof(usb_standard_interface_descriptor_t);
    349         descriptor->str_interface = 0;
    350         return descriptor;
    351 }
    352 
    353 /**
    354  * create standard endpoint descriptor for a root hub
    355  * @return newly allocated descriptor
    356  */
    357 static usb_standard_endpoint_descriptor_t *
    358 usb_ohci_rh_create_standard_endpoint_descriptor(){
    359         usb_standard_endpoint_descriptor_t * descriptor =
    360                         (usb_standard_endpoint_descriptor_t*)
    361                         malloc(sizeof(usb_standard_endpoint_descriptor_t));
    362         descriptor->attributes = USB_TRANSFER_INTERRUPT;
    363         descriptor->descriptor_type = USB_DESCTYPE_ENDPOINT;
    364         descriptor->endpoint_address = 1 + (1<<7);
    365         descriptor->length = sizeof(usb_standard_endpoint_descriptor_t);
    366         descriptor->max_packet_size = 8;
    367         descriptor->poll_interval = 255;
    368         return descriptor;
    369 }
    370 
    371 /**
    372311 * create answer to a descriptor request
    373312 *
     
    386325        const uint16_t setup_request_value = setup_request->value_high;
    387326                        //(setup_request->value_low << 8);
    388 #if 0
    389327        bool del = false;
    390         //this code was merged from development and has to be reviewed
    391328        switch (setup_request_value)
    392329        {
    393         case USB_DESCTYPE_HUB: {
    394                 uint8_t * descriptor;
    395                 usb_create_serialized_hub_descriptor(
    396                     instance, &descriptor, &size);
    397                 result_descriptor = descriptor;
    398                 break;
    399         }
    400         case USB_DESCTYPE_DEVICE: {
    401                 usb_log_debug("USB_DESCTYPE_DEVICE\n");
    402                 result_descriptor = &ohci_rh_device_descriptor;
    403                 size = sizeof(ohci_rh_device_descriptor);
    404                 break;
    405         }
    406         case USB_DESCTYPE_CONFIGURATION: {
    407                 usb_log_debug("USB_DESCTYPE_CONFIGURATION\n");
    408                 usb_standard_configuration_descriptor_t * descriptor =
    409                                 malloc(sizeof(usb_standard_configuration_descriptor_t));
    410                 memcpy(descriptor, &ohci_rh_conf_descriptor,
    411                     sizeof(usb_standard_configuration_descriptor_t));
    412                 /// \TODO should this include device descriptor?
    413                 const size_t hub_descriptor_size = 7 +
    414                                 2* (instance->port_count / 8 +
    415                                 ((instance->port_count % 8 > 0) ? 1 : 0));
    416                 descriptor->total_length =
    417                                 sizeof(usb_standard_configuration_descriptor_t)+
    418                                 sizeof(usb_standard_endpoint_descriptor_t)+
    419                                 sizeof(usb_standard_interface_descriptor_t)+
    420                                 hub_descriptor_size;
    421                 result_descriptor = descriptor;
    422                 size = sizeof(usb_standard_configuration_descriptor_t);
    423                 del = true;
    424                 break;
    425         }
    426         case USB_DESCTYPE_INTERFACE: {
    427                 usb_log_debug("USB_DESCTYPE_INTERFACE\n");
    428                 result_descriptor = &ohci_rh_iface_descriptor;
    429                 size = sizeof(ohci_rh_iface_descriptor);
    430                 break;
    431         }
    432         case USB_DESCTYPE_ENDPOINT: {
    433                 usb_log_debug("USB_DESCTYPE_ENDPOINT\n");
    434                 result_descriptor = &ohci_rh_ep_descriptor;
    435                 size = sizeof(ohci_rh_ep_descriptor);
    436                 break;
    437         }
    438         default: {
    439                 usb_log_debug("USB_DESCTYPE_EINVAL %d \n",setup_request->value);
    440                 usb_log_debug("\ttype %d\n\trequest %d\n\tvalue %d\n\tindex %d\n\tlen %d\n ",
    441                                 setup_request->request_type,
    442                                 setup_request->request,
    443                                 setup_request_value,
    444                                 setup_request->index,
    445                                 setup_request->length
    446                                 );
    447                 return EINVAL;
    448         }
    449         }
    450 #endif
    451         if(setup_request_value == USB_DESCTYPE_HUB){
    452                 usb_log_debug("USB_DESCTYPE_HUB\n");
    453                 //create hub descriptor
    454                 uint8_t * descriptor;
    455                 usb_create_serialized_hub_descriptor(instance,
    456                                 &descriptor, &size);
    457                 result_descriptor = descriptor;
    458         }else if(setup_request_value == USB_DESCTYPE_DEVICE){
    459                 //create std device descriptor
    460                 usb_log_debug("USB_DESCTYPE_DEVICE\n");
    461                 result_descriptor =
    462                                 usb_ohci_rh_create_standard_device_descriptor();
    463                 size = sizeof(usb_standard_device_descriptor_t);
    464         }else if(setup_request_value == USB_DESCTYPE_CONFIGURATION){
    465                 usb_log_debug("USB_DESCTYPE_CONFIGURATION\n");
    466                 result_descriptor =
    467                                 usb_ohci_rh_create_standart_configuration_descriptor(instance);
    468                 size = sizeof(usb_standard_configuration_descriptor_t);
    469 
    470         }else if(setup_request_value == USB_DESCTYPE_INTERFACE){
    471                 usb_log_debug("USB_DESCTYPE_INTERFACE\n");
    472                 result_descriptor =
    473                                 usb_ohci_rh_create_standard_interface_descriptor();
    474                 size = sizeof(usb_standard_interface_descriptor_t);
    475         }else if(setup_request_value == USB_DESCTYPE_ENDPOINT){
    476                 usb_log_debug("USB_DESCTYPE_ENDPOINT\n");
    477                 result_descriptor =
    478                                 usb_ohci_rh_create_standard_endpoint_descriptor();
    479                 size = sizeof(usb_standard_endpoint_descriptor_t);
    480         }else{
    481                 usb_log_debug("USB_DESCTYPE_EINVAL %d \n",setup_request->value);
    482                 usb_log_debug("\ttype %d\n\trequest %d\n\tvalue %d\n\tindex %d\n\tlen %d\n ",
    483                                 setup_request->request_type,
    484                                 setup_request->request,
    485                                 setup_request_value,
    486                                 setup_request->index,
    487                                 setup_request->length
    488                                 );
    489                 return EINVAL;
     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                }
    490377        }
    491378        if(request->buffer_size < size){
     
    494381        request->transfered_size = size;
    495382        memcpy(request->buffer,result_descriptor,size);
    496         if (result_descriptor)
     383        if (del)
    497384                free(result_descriptor);
    498385        return EOK;
     
    761648void rh_interrupt(rh_t *instance)
    762649{
    763         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");
    764651        /* TODO: implement? */
    765652}
  • uspace/drv/ohci/root_hub.h

    raee6c73 r0368669c  
    4141#include "batch.h"
    4242
     43/**
     44 * ohci root hub representation
     45 */
    4346typedef struct rh {
     47        /** pointer to ohci driver registers */
    4448        ohci_regs_t *registers;
     49        /** usb address of the root hub */
    4550        usb_address_t address;
     51        /** ddf device information */
    4652        ddf_dev_t *device;
     53        /** hub port count */
    4754        int port_count;
    4855} rh_t;
Note: See TracChangeset for help on using the changeset viewer.