Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/hcdhubd.c

    rda55d5b r03171de  
    3636#include <usb/devreq.h>
    3737#include <usbhc_iface.h>
    38 #include <usb/descriptor.h>
    3938#include <driver.h>
    4039#include <bool.h>
     
    4342
    4443#define USB_HUB_DEVICE_NAME "usbhub"
    45 
    46 #define USB_KBD_DEVICE_NAME "hid"
    47 
    48 
    49 
    5044
    5145/** List of handled host controllers. */
     
    7468//*********************************************
    7569
    76 void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor) {
     70
     71void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor){
    7772        //base size
    7873        size_t size = 7;
    7974        //variable size according to port count
    80         size_t var_size = descriptor->ports_count / 8 + ((descriptor->ports_count % 8 > 0) ? 1 : 0);
     75        size_t var_size = descriptor->ports_count / 8 + ((descriptor->ports_count % 8>0)?1:0);
    8176        size += 2 * var_size;
    8277        uint8_t * result = (uint8_t*) malloc(size);
    8378        //size
    84         result[0] = size;
     79        result[0]=size;
    8580        //descriptor type
    86         result[1] = USB_DESCTYPE_HUB;
    87         result[2] = descriptor->ports_count;
     81        result[1]=USB_HUB_DESCRIPTOR_TYPE;
     82        result[2]=descriptor->ports_count;
    8883        /// @fixme handling of endianness??
    89         result[3] = descriptor->hub_characteristics / 256;
    90         result[4] = descriptor->hub_characteristics % 256;
    91         result[5] = descriptor->pwr_on_2_good_time;
    92         result[6] = descriptor->current_requirement;
    93 
    94         size_t i;
    95         for (i = 0; i < var_size; ++i) {
    96                 result[7 + i] = descriptor->devices_removable[i];
    97         }
    98         for (i = 0; i < var_size; ++i) {
    99                 result[7 + var_size + i] = 255;
     84        result[3]=descriptor->hub_characteristics / 256;
     85        result[4]=descriptor->hub_characteristics % 256;
     86        result[5]=descriptor->pwr_on_2_good_time;
     87        result[6]=descriptor->current_requirement;
     88
     89        size_t i;
     90        for(i=0;i<var_size;++i){
     91                result[7+i]=descriptor->devices_removable[i];
     92        }
     93        for(i=0;i<var_size;++i){
     94                result[7+var_size+i]=255;
    10095        }
    10196        return result;
    10297}
    10398
    104 usb_hub_descriptor_t * usb_deserialize_hub_desriptor(void * serialized_descriptor) {
    105         uint8_t * sdescriptor = (uint8_t*) serialized_descriptor;
    106         if (sdescriptor[1] != USB_DESCTYPE_HUB) return NULL;
    107         usb_hub_descriptor_t * result = (usb_hub_descriptor_t*) malloc(sizeof (usb_hub_descriptor_t));
     99usb_hub_descriptor_t * usb_deserialize_hub_desriptor(void * serialized_descriptor){
     100        uint8_t * sdescriptor = (uint8_t*)serialized_descriptor;
     101        if(sdescriptor[1]!=USB_HUB_DESCRIPTOR_TYPE) return NULL;
     102        usb_hub_descriptor_t * result = (usb_hub_descriptor_t*) malloc(sizeof(usb_hub_descriptor_t));
    108103        //uint8_t size = sdescriptor[0];
    109104        result->ports_count = sdescriptor[2];
    110105        /// @fixme handling of endianness??
    111106        result->hub_characteristics = sdescriptor[4] + 256 * sdescriptor[3];
    112         result->pwr_on_2_good_time = sdescriptor[5];
    113         result->current_requirement = sdescriptor[6];
    114         size_t var_size = result->ports_count / 8 + ((result->ports_count % 8 > 0) ? 1 : 0);
    115         result->devices_removable = (uint8_t*) malloc(var_size);
    116 
    117         size_t i;
    118         for (i = 0; i < var_size; ++i) {
    119                 result->devices_removable[i] = sdescriptor[7 + i];
     107        result->pwr_on_2_good_time=sdescriptor[5];
     108        result->current_requirement=sdescriptor[6];
     109        size_t var_size = result->ports_count / 8 + ((result->ports_count % 8>0)?1:0);
     110        result->devices_removable = (uint8_t*)malloc(var_size);
     111
     112        size_t i;
     113        for(i=0;i<var_size;++i){
     114                result->devices_removable[i] = sdescriptor[7+i];
    120115        }
    121116        return result;
     
    129124//*********************************************
    130125
     126
     127
    131128static void set_hub_address(usb_hc_device_t *hc, usb_address_t address);
    132 
    133 usb_hcd_hub_info_t * usb_create_hub_info(device_t * device) {
    134         usb_hcd_hub_info_t* result = (usb_hcd_hub_info_t*) malloc(sizeof (usb_hcd_hub_info_t));
    135         //get parent device
    136         /// @TODO this code is not correct
    137         device_t * my_hcd = device;
    138         while (my_hcd->parent)
    139                 my_hcd = my_hcd->parent;
    140         //dev->
    141         printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);
    142         //we add the hub into the first hc
    143         //link_t *link_hc = hc_list.next;
    144         //usb_hc_device_t *hc = list_get_instance(link_hc,
    145         //              usb_hc_device_t, link);
    146         //must get generic device info
    147 
    148 
    149         return result;
    150 }
    151129
    152130/** Callback when new device is detected and must be handled by this driver.
     
    155133 * @return Error code.hub added, hurrah!\n"
    156134 */
    157 static int add_device(device_t *dev) {
     135static int add_device(device_t *dev)
     136{
    158137        /*
    159138         * FIXME: use some magic to determine whether hub or another HC
     
    167146                 * We are the HC itself.
    168147                 */
    169                 usb_hc_device_t *hc_dev = malloc(sizeof (usb_hc_device_t));
     148                usb_hc_device_t *hc_dev = malloc(sizeof(usb_hc_device_t));
    170149                list_initialize(&hc_dev->link);
    171150                hc_dev->transfer_ops = NULL;
     
    189168                list_append(&hc_dev->link, &hc_list);
    190169
    191                 //add keyboard
    192                 /// @TODO this is not correct code
    193                
    194                 /*
    195                  * Announce presence of child device.
    196                  */
    197                 device_t *kbd = NULL;
    198                 match_id_t *match_id = NULL;
    199 
    200                 kbd = create_device();
    201                 if (kbd == NULL) {
    202                         printf("ERROR: enomem\n");
    203                 }
    204                 kbd->name = USB_KBD_DEVICE_NAME;
    205 
    206                 match_id = create_match_id();
    207                 if (match_id == NULL) {
    208                         printf("ERROR: enomem\n");
    209                 }
    210 
    211                 char *id;
    212                 rc = asprintf(&id, USB_KBD_DEVICE_NAME);
    213                 if (rc <= 0) {
    214                         printf("ERROR: enomem\n");
    215                         return rc;
    216                 }
    217 
    218                 match_id->id = id;
    219                 match_id->score = 30;
    220 
    221                 add_match_id(&kbd->match_ids, match_id);
    222 
    223                 rc = child_device_register(kbd, dev);
    224                 if (rc != EOK) {
    225                         printf("ERROR: cannot register kbd\n");
    226                         return rc;
    227                 }
    228 
    229                 printf("%s: registered root hub\n", dev->name);
    230170                return EOK;
    231 
    232 
    233 
    234171        } else {
    235172                usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link);
     
    241178                 * connected devices.
    242179                 */
    243                 //insert hub into list
    244                 //find owner hcd
    245                 device_t * my_hcd = dev;
    246                 while (my_hcd->parent)
    247                         my_hcd = my_hcd->parent;
    248                 //dev->
    249                 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);
    250                 my_hcd = dev;
    251                 while (my_hcd->parent)
    252                         my_hcd = my_hcd->parent;
    253                 //dev->
    254 
    255                 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);
    256                
    257                 //create the hub structure
    258                 usb_hcd_hub_info_t * hub_info = usb_create_hub_info(dev);
    259 
    260 
    261                 //append into the list
    262                 //we add the hub into the first hc
    263                 list_append(&hub_info->link, &hc->hubs);
    264 
    265 
    266 
    267                 return EOK;
    268                 //return ENOTSUP;
     180                //insert hub into list
     181                //find owner hcd
     182                device_t * my_hcd = dev;
     183                while(my_hcd->parent)
     184                    my_hcd = my_hcd->parent;
     185                //dev->
     186                printf("%s: owner hcd found: %s\n",hc_driver->name, my_hcd->name);
     187
     188
     189                return ENOTSUP;
    269190        }
    270191}
     
    279200 * @param address New hub address.
    280201 */
    281 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) {
     202static void set_hub_address(usb_hc_device_t *hc, usb_address_t address)
     203{
    282204        printf("%s: setting hub address to %d\n", hc->generic->name, address);
    283205        usb_target_t target = {0, 0};
     
    294216
    295217        rc = usb_hc_async_control_write_setup(hc, target,
    296                         &setup_packet, sizeof (setup_packet), &handle);
     218            &setup_packet, sizeof(setup_packet), &handle);
    297219        if (rc != EOK) {
    298220                return;
     
    319241/** Check changes on all known hubs.
    320242 */
    321 static void check_hub_changes(void) {
     243static void check_hub_changes(void)
     244{
    322245        /*
    323246         * Iterate through all HCs.
     
    325248        link_t *link_hc;
    326249        for (link_hc = hc_list.next;
    327                         link_hc != &hc_list;
    328                         link_hc = link_hc->next) {
     250            link_hc != &hc_list;
     251            link_hc = link_hc->next) {
    329252                usb_hc_device_t *hc = list_get_instance(link_hc,
    330                                 usb_hc_device_t, link);
     253                    usb_hc_device_t, link);
    331254                /*
    332255                 * Iterate through all their hubs.
     
    334257                link_t *link_hub;
    335258                for (link_hub = hc->hubs.next;
    336                                 link_hub != &hc->hubs;
    337                                 link_hub = link_hub->next) {
     259                    link_hub != &hc->hubs;
     260                    link_hub = link_hub->next) {
    338261                        usb_hcd_hub_info_t *hub = list_get_instance(link_hub,
    339                                         usb_hcd_hub_info_t, link);
     262                            usb_hcd_hub_info_t, link);
    340263
    341264                        /*
     
    359282                         */
    360283                        usb_hc_async_interrupt_in(hc, target,
    361                                         change_bitmap, byte_length, &actual_size,
    362                                         &handle);
     284                            change_bitmap, byte_length, &actual_size,
     285                            &handle);
    363286
    364287                        usb_hc_async_wait_for(handle);
     
    388311 * @return Error code.
    389312 */
    390 int usb_hcd_main(usb_hc_driver_t *hc) {
     313int usb_hcd_main(usb_hc_driver_t *hc)
     314{
    391315        hc_driver = hc;
    392316        hc_driver_generic.name = hc->name;
     
    414338 * @return Error code.
    415339 */
    416 int usb_hcd_add_root_hub(usb_hc_device_t *dev) {
     340int usb_hcd_add_root_hub(usb_hc_device_t *dev)
     341{
    417342        int rc;
    418343
Note: See TracChangeset for help on using the changeset viewer.