Changes in uspace/lib/usb/src/hcdhubd.c [da55d5b:03171de] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/hcdhubd.c
rda55d5b r03171de 36 36 #include <usb/devreq.h> 37 37 #include <usbhc_iface.h> 38 #include <usb/descriptor.h>39 38 #include <driver.h> 40 39 #include <bool.h> … … 43 42 44 43 #define USB_HUB_DEVICE_NAME "usbhub" 45 46 #define USB_KBD_DEVICE_NAME "hid"47 48 49 50 44 51 45 /** List of handled host controllers. */ … … 74 68 //********************************************* 75 69 76 void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor) { 70 71 void * usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor){ 77 72 //base size 78 73 size_t size = 7; 79 74 //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); 81 76 size += 2 * var_size; 82 77 uint8_t * result = (uint8_t*) malloc(size); 83 78 //size 84 result[0] =size;79 result[0]=size; 85 80 //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; 88 83 /// @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 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; 100 95 } 101 96 return result; 102 97 } 103 98 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 99 usb_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)); 108 103 //uint8_t size = sdescriptor[0]; 109 104 result->ports_count = sdescriptor[2]; 110 105 /// @fixme handling of endianness?? 111 106 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*) 116 117 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]; 120 115 } 121 116 return result; … … 129 124 //********************************************* 130 125 126 127 131 128 static 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 device136 /// @TODO this code is not correct137 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 hc143 //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 info147 148 149 return result;150 }151 129 152 130 /** Callback when new device is detected and must be handled by this driver. … … 155 133 * @return Error code.hub added, hurrah!\n" 156 134 */ 157 static int add_device(device_t *dev) { 135 static int add_device(device_t *dev) 136 { 158 137 /* 159 138 * FIXME: use some magic to determine whether hub or another HC … … 167 146 * We are the HC itself. 168 147 */ 169 usb_hc_device_t *hc_dev = malloc(sizeof 148 usb_hc_device_t *hc_dev = malloc(sizeof(usb_hc_device_t)); 170 149 list_initialize(&hc_dev->link); 171 150 hc_dev->transfer_ops = NULL; … … 189 168 list_append(&hc_dev->link, &hc_list); 190 169 191 //add keyboard192 /// @TODO this is not correct code193 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);230 170 return EOK; 231 232 233 234 171 } else { 235 172 usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); … … 241 178 * connected devices. 242 179 */ 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; 269 190 } 270 191 } … … 279 200 * @param address New hub address. 280 201 */ 281 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) { 202 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) 203 { 282 204 printf("%s: setting hub address to %d\n", hc->generic->name, address); 283 205 usb_target_t target = {0, 0}; … … 294 216 295 217 rc = usb_hc_async_control_write_setup(hc, target, 296 &setup_packet, sizeof(setup_packet), &handle);218 &setup_packet, sizeof(setup_packet), &handle); 297 219 if (rc != EOK) { 298 220 return; … … 319 241 /** Check changes on all known hubs. 320 242 */ 321 static void check_hub_changes(void) { 243 static void check_hub_changes(void) 244 { 322 245 /* 323 246 * Iterate through all HCs. … … 325 248 link_t *link_hc; 326 249 for (link_hc = hc_list.next; 327 328 250 link_hc != &hc_list; 251 link_hc = link_hc->next) { 329 252 usb_hc_device_t *hc = list_get_instance(link_hc, 330 253 usb_hc_device_t, link); 331 254 /* 332 255 * Iterate through all their hubs. … … 334 257 link_t *link_hub; 335 258 for (link_hub = hc->hubs.next; 336 337 259 link_hub != &hc->hubs; 260 link_hub = link_hub->next) { 338 261 usb_hcd_hub_info_t *hub = list_get_instance(link_hub, 339 262 usb_hcd_hub_info_t, link); 340 263 341 264 /* … … 359 282 */ 360 283 usb_hc_async_interrupt_in(hc, target, 361 362 284 change_bitmap, byte_length, &actual_size, 285 &handle); 363 286 364 287 usb_hc_async_wait_for(handle); … … 388 311 * @return Error code. 389 312 */ 390 int usb_hcd_main(usb_hc_driver_t *hc) { 313 int usb_hcd_main(usb_hc_driver_t *hc) 314 { 391 315 hc_driver = hc; 392 316 hc_driver_generic.name = hc->name; … … 414 338 * @return Error code. 415 339 */ 416 int usb_hcd_add_root_hub(usb_hc_device_t *dev) { 340 int usb_hcd_add_root_hub(usb_hc_device_t *dev) 341 { 417 342 int rc; 418 343
Note:
See TracChangeset
for help on using the changeset viewer.