Changes in uspace/drv/ohci/root_hub.c [f3da9b2:0368669c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/root_hub.c
rf3da9b2 r0368669c 43 43 #include <usb/classes/hub.h> 44 44 45 /** 46 * standart device descriptor for ohci root hub 47 */ 48 static 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 */ 70 static 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 */ 85 static 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 */ 102 static 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 }; 45 111 46 112 /** Root hub initialization … … 220 286 221 287 /** 222 * create standard device descriptor for a hub223 * @return newly allocated descriptor224 */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 guessed238 descriptor->max_packet_size = 8;239 descriptor->product_id = 0x0001;240 /// \TODO these values migt be different241 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 /**249 288 * create standart configuration descriptor for the root hub instance 250 289 * @param instance root hub instance … … 254 293 usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){ 255 294 usb_standard_configuration_descriptor_t * descriptor = 256 (usb_standard_configuration_descriptor_t*)257 295 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)); 266 298 /// \TODO should this include device descriptor? 267 size_t hub_descriptor_size = 7 +299 const size_t hub_descriptor_size = 7 + 268 300 2* (instance->port_count / 8 + 269 301 ((instance->port_count % 8 > 0) ? 1 : 0)); … … 277 309 278 310 /** 279 * create standard interface descriptor for a root hub280 * @return newly allocated descriptor281 */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 hub302 * @return newly allocated descriptor303 */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 /**319 311 * create answer to a descriptor request 320 312 * … … 330 322 (usb_device_request_setup_packet_t*)request->setup_buffer; 331 323 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; 334 326 //(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 } 374 377 } 375 378 if(request->buffer_size < size){ … … 378 381 request->transfered_size = size; 379 382 memcpy(request->buffer,result_descriptor,size); 380 free(result_descriptor); 383 if (del) 384 free(result_descriptor); 381 385 return EOK; 382 386 } … … 644 648 void rh_interrupt(rh_t *instance) 645 649 { 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"); 647 651 /* TODO: implement? */ 648 652 }
Note:
See TracChangeset
for help on using the changeset viewer.