Changes in uspace/drv/bus/usb/usbhid/usbhid.c [065064e6:93d2684] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/usbhid.c
r065064e6 r93d2684 54 54 55 55 /* Array of endpoints expected on the device, NULL terminated. */ 56 usb_endpoint_description_t *usb_hid_endpoints[] = {56 const usb_endpoint_description_t *usb_hid_endpoints[] = { 57 57 &usb_hid_kbd_poll_endpoint_description, 58 58 &usb_hid_mouse_poll_endpoint_description, … … 61 61 }; 62 62 63 static const int USB_HID_MAX_SUBDRIVERS = 10;64 65 63 /*----------------------------------------------------------------------------*/ 66 64 67 65 static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev) 68 66 { 69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0);70 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 72 67 assert(hid_dev != NULL); 68 assert(hid_dev->subdriver_count == 0); 69 70 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 73 71 if (hid_dev->subdrivers == NULL) { 74 72 return ENOMEM; 75 73 } 76 77 assert(hid_dev->subdriver_count >= 0); 78 79 // set the init callback 80 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_kbd_init; 81 82 // set the polling callback 83 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 84 usb_kbd_polling_callback; 85 86 // set the polling ended callback 87 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 88 89 // set the deinit callback 90 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_kbd_deinit; 91 92 // set subdriver count 93 ++hid_dev->subdriver_count; 74 hid_dev->subdriver_count = 1; 75 // TODO 0 should be keyboard, but find a better way 76 hid_dev->subdrivers[0] = usb_hid_subdrivers[0].subdriver; 94 77 95 78 return EOK; … … 100 83 static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev) 101 84 { 102 assert(hid_dev != NULL && hid_dev->subdriver_count == 0);103 104 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 105 85 assert(hid_dev != NULL); 86 assert(hid_dev->subdriver_count == 0); 87 88 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 106 89 if (hid_dev->subdrivers == NULL) { 107 90 return ENOMEM; 108 91 } 109 110 assert(hid_dev->subdriver_count >= 0); 111 112 // set the init callback 113 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_mouse_init; 114 115 // set the polling callback 116 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 117 usb_mouse_polling_callback; 118 119 // set the polling ended callback 120 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 121 122 // set the deinit callback 123 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_mouse_deinit; 124 125 // set subdriver count 126 ++hid_dev->subdriver_count; 92 hid_dev->subdriver_count = 1; 93 // TODO 2 should be mouse, but find a better way 94 hid_dev->subdrivers[2] = usb_hid_subdrivers[0].subdriver; 127 95 128 96 return EOK; … … 135 103 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 136 104 137 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 138 sizeof(usb_hid_subdriver_t)); 105 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 139 106 if (hid_dev->subdrivers == NULL) { 140 107 return ENOMEM; 141 108 } 142 143 assert(hid_dev->subdriver_count >= 0); 144 145 // set the init callback 146 hid_dev->subdrivers[hid_dev->subdriver_count].init = 147 usb_generic_hid_init; 148 149 // set the polling callback 150 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 151 usb_generic_hid_polling_callback; 152 153 // set the polling ended callback 154 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 155 156 // set the deinit callback 157 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = 158 usb_generic_hid_deinit; 159 160 // set subdriver count 161 ++hid_dev->subdriver_count; 109 hid_dev->subdriver_count = 1; 110 111 /* Set generic hid subdriver routines */ 112 hid_dev->subdrivers[0].init = usb_generic_hid_init; 113 hid_dev->subdrivers[0].poll = usb_generic_hid_polling_callback; 114 hid_dev->subdrivers[0].poll_end = NULL; 115 hid_dev->subdrivers[0].deinit = usb_generic_hid_deinit; 162 116 163 117 return EOK; … … 166 120 /*----------------------------------------------------------------------------*/ 167 121 168 static bool usb_hid_ids_match( usb_hid_dev_t *hid_dev,122 static bool usb_hid_ids_match(const usb_hid_dev_t *hid_dev, 169 123 const usb_hid_subdriver_mapping_t *mapping) 170 124 { … … 172 126 assert(hid_dev->usb_dev != NULL); 173 127 174 return (hid_dev->usb_dev->descriptors.device.vendor_id 128 return (hid_dev->usb_dev->descriptors.device.vendor_id 175 129 == mapping->vendor_id 176 130 && hid_dev->usb_dev->descriptors.device.product_id … … 180 134 /*----------------------------------------------------------------------------*/ 181 135 182 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 136 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 183 137 const usb_hid_subdriver_mapping_t *mapping) 184 138 { … … 192 146 } 193 147 int i = 0; 194 while (mapping->usage_path[i].usage != 0 148 while (mapping->usage_path[i].usage != 0 195 149 || mapping->usage_path[i].usage_page != 0) { 196 if (usb_hid_report_path_append_item(usage_path, 197 mapping->usage_path[i].usage_page, 150 if (usb_hid_report_path_append_item(usage_path, 151 mapping->usage_path[i].usage_page, 198 152 mapping->usage_path[i].usage) != EOK) { 199 153 usb_log_debug("Failed to append to usage path.\n"); … … 204 158 } 205 159 206 assert(hid_dev->report != NULL);207 208 160 usb_log_debug("Compare flags: %d\n", mapping->compare); 209 161 … … 213 165 do { 214 166 usb_log_debug("Trying report id %u\n", report_id); 215 167 216 168 if (report_id != 0) { 217 169 usb_hid_report_path_set_report_id(usage_path, … … 220 172 221 173 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 222 hid_dev->report, 223 NULL, usage_path, mapping->compare, 174 &hid_dev->report, NULL, usage_path, mapping->compare, 224 175 USB_HID_REPORT_TYPE_INPUT); 225 176 226 177 usb_log_debug("Field: %p\n", field); 227 178 … … 230 181 break; 231 182 } 232 183 233 184 report_id = usb_hid_get_next_report_id( 234 hid_dev->report, report_id, 235 USB_HID_REPORT_TYPE_INPUT); 185 &hid_dev->report, report_id, USB_HID_REPORT_TYPE_INPUT); 236 186 } while (!matches && report_id != 0); 237 187 … … 243 193 /*----------------------------------------------------------------------------*/ 244 194 245 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 195 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 246 196 const usb_hid_subdriver_t **subdrivers, int count) 247 197 { … … 254 204 } 255 205 256 // add one generic HID subdriver per device 257 258 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc((count + 1) * 259 sizeof(usb_hid_subdriver_t)); 206 /* +1 for generic hid subdriver */ 207 hid_dev->subdrivers = calloc((count + 1), sizeof(usb_hid_subdriver_t)); 260 208 if (hid_dev->subdrivers == NULL) { 261 209 return ENOMEM; … … 269 217 } 270 218 219 /* Add one generic HID subdriver per device */ 271 220 hid_dev->subdrivers[count].init = usb_generic_hid_init; 272 221 hid_dev->subdrivers[count].poll = usb_generic_hid_polling_callback; … … 307 256 return EINVAL; 308 257 } 309 258 310 259 ids_matched = false; 311 260 matched = false; 312 261 313 262 if (mapping->vendor_id >= 0) { 314 263 assert(mapping->product_id >= 0); … … 321 270 } 322 271 } 323 272 324 273 if (mapping->usage_path != NULL) { 325 274 usb_log_debug("Comparing device against usage path.\n"); … … 332 281 matched = ids_matched; 333 282 } 334 283 335 284 if (matched) { 336 285 usb_log_debug("Subdriver matched.\n"); 337 286 subdrivers[count++] = &mapping->subdriver; 338 287 } 339 288 340 289 mapping = &usb_hid_subdrivers[++i]; 341 290 } 342 291 343 // we have all subdrivers determined, save them into the hid device 292 /* We have all subdrivers determined, save them into the hid device */ 293 // TODO Dowe really need this complicated stuff if there is 294 // max_subdrivers limitation? 344 295 return usb_hid_save_subdrivers(hid_dev, subdrivers, count); 345 296 } … … 347 298 /*----------------------------------------------------------------------------*/ 348 299 349 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, usb_device_t *dev) 350 { 351 assert(hid_dev != NULL && dev != NULL); 352 353 int rc = EOK; 300 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, const usb_device_t *dev) 301 { 302 assert(hid_dev); 303 assert(dev); 354 304 355 305 if (dev->pipes[USB_HID_KBD_POLL_EP_NO].present) { … … 368 318 usb_log_error("None of supported endpoints found - probably" 369 319 " not a supported device.\n"); 370 r c =ENOTSUP;371 } 372 373 return rc;320 return ENOTSUP; 321 } 322 323 return EOK; 374 324 } 375 325 … … 378 328 static int usb_hid_init_report(usb_hid_dev_t *hid_dev) 379 329 { 380 assert(hid_dev != NULL && hid_dev->report != NULL);330 assert(hid_dev != NULL); 381 331 382 332 uint8_t report_id = 0; 383 size_t size;384 385 333 size_t max_size = 0; 386 334 387 335 do { 388 336 usb_log_debug("Getting size of the report.\n"); 389 size = usb_hid_report_byte_size(hid_dev->report, report_id, 390 USB_HID_REPORT_TYPE_INPUT); 337 const size_t size = 338 usb_hid_report_byte_size(&hid_dev->report, report_id, 339 USB_HID_REPORT_TYPE_INPUT); 391 340 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 392 341 max_size = (size > max_size) ? size : max_size; 393 342 usb_log_debug("Getting next report ID\n"); 394 report_id = usb_hid_get_next_report_id( hid_dev->report,343 report_id = usb_hid_get_next_report_id(&hid_dev->report, 395 344 report_id, USB_HID_REPORT_TYPE_INPUT); 396 345 } while (report_id != 0); … … 398 347 usb_log_debug("Max size of input report: %zu\n", max_size); 399 348 400 hid_dev->max_input_report_size = max_size;401 349 assert(hid_dev->input_report == NULL); 402 350 403 hid_dev->input_report = malloc(max_size);351 hid_dev->input_report = calloc(1, max_size); 404 352 if (hid_dev->input_report == NULL) { 405 353 return ENOMEM; 406 354 } 407 memset(hid_dev->input_report, 0, max_size);355 hid_dev->max_input_report_size = max_size; 408 356 409 357 return EOK; … … 430 378 } 431 379 432 hid_dev->report = (usb_hid_report_t *)(malloc(sizeof( 433 usb_hid_report_t))); 434 if (hid_dev->report == NULL) { 435 usb_log_error("No memory!\n"); 436 return ENOMEM; 437 } 438 usb_hid_report_init(hid_dev->report); 380 usb_hid_report_init(&hid_dev->report); 439 381 440 382 /* The USB device should already be initialized, save it in structure */ … … 446 388 return rc; 447 389 } 448 390 449 391 /* Get the report descriptor and parse it. */ 450 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 451 hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);392 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 393 &hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size); 452 394 453 395 bool fallback = false; … … 488 430 break; 489 431 default: 490 assert(hid_dev->poll_pipe_index 432 assert(hid_dev->poll_pipe_index 491 433 == USB_HID_GENERIC_POLL_EP_NO); 492 434 493 435 usb_log_info("Falling back to generic HID driver.\n"); 494 436 rc = usb_hid_set_generic_hid_subdriver(hid_dev); … … 499 441 usb_log_error("No subdriver for handling this device could be" 500 442 " initialized: %s.\n", str_error(rc)); 501 usb_log_debug("Subdriver count: %d\n", 443 usb_log_debug("Subdriver count: %d\n", 502 444 hid_dev->subdriver_count); 503 504 445 } else { 505 446 bool ok = false; 506 507 usb_log_debug("Subdriver count: %d\n", 447 448 usb_log_debug("Subdriver count: %d\n", 508 449 hid_dev->subdriver_count); 509 450 510 451 for (i = 0; i < hid_dev->subdriver_count; ++i) { 511 452 if (hid_dev->subdrivers[i].init != NULL) { … … 524 465 } 525 466 } 526 467 527 468 rc = (ok) ? EOK : -1; // what error to report 528 469 } … … 538 479 } 539 480 540 541 481 return rc; 542 482 } … … 544 484 /*----------------------------------------------------------------------------*/ 545 485 546 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 486 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 547 487 size_t buffer_size, void *arg) 548 488 { 549 int i;550 551 489 if (dev == NULL || arg == NULL || buffer == NULL) { 552 490 usb_log_error("Missing arguments to polling callback.\n"); 553 491 return false; 554 492 } 555 556 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 493 usb_hid_dev_t *hid_dev = arg; 557 494 558 495 assert(hid_dev->input_report != NULL); 496 559 497 usb_log_debug("New data [%zu/%zu]: %s\n", buffer_size, 560 498 hid_dev->max_input_report_size, … … 568 506 } 569 507 570 // parse the input report 571 572 int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 573 &hid_dev->report_id); 574 508 /* Parse the input report */ 509 const int rc = usb_hid_parse_report( 510 &hid_dev->report, buffer, buffer_size, &hid_dev->report_id); 575 511 if (rc != EOK) { 576 512 usb_log_warning("Error in usb_hid_parse_report():" 577 513 "%s\n", str_error(rc)); 578 } 514 } 579 515 580 516 bool cont = false; 581 582 // continue if at least one of the subdrivers want to continue 583 for (i = 0; i < hid_dev->subdriver_count; ++i) { 584 if (hid_dev->subdrivers[i].poll != NULL 585 && hid_dev->subdrivers[i].poll(hid_dev, 586 hid_dev->subdrivers[i].data)) { 587 cont = true; 517 /* Continue if at least one of the subdrivers want to continue */ 518 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 519 if (hid_dev->subdrivers[i].poll != NULL) { 520 cont = cont || hid_dev->subdrivers[i].poll( 521 hid_dev, hid_dev->subdrivers[i].data); 588 522 } 589 523 } … … 594 528 /*----------------------------------------------------------------------------*/ 595 529 596 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, 597 void *arg) 598 { 599 int i; 600 601 if (dev == NULL || arg == NULL) { 602 return; 603 } 604 605 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 606 607 for (i = 0; i < hid_dev->subdriver_count; ++i) { 530 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg) 531 { 532 assert(dev); 533 assert(arg); 534 535 usb_hid_dev_t *hid_dev = arg; 536 537 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 608 538 if (hid_dev->subdrivers[i].poll_end != NULL) { 609 hid_dev->subdrivers[i].poll_end( hid_dev,610 hid_dev ->subdrivers[i].data, reason);539 hid_dev->subdrivers[i].poll_end( 540 hid_dev, hid_dev->subdrivers[i].data, reason); 611 541 } 612 542 } … … 624 554 /*----------------------------------------------------------------------------*/ 625 555 626 int usb_hid_report_number( usb_hid_dev_t *hid_dev)556 int usb_hid_report_number(const usb_hid_dev_t *hid_dev) 627 557 { 628 558 return hid_dev->report_nr; … … 631 561 /*----------------------------------------------------------------------------*/ 632 562 633 void usb_hid_destroy(usb_hid_dev_t *hid_dev) 634 { 635 int i; 636 637 if (hid_dev == NULL) { 638 return; 639 } 563 void usb_hid_deinit(usb_hid_dev_t *hid_dev) 564 { 565 assert(hid_dev); 566 assert(hid_dev->subdrivers != NULL || hid_dev->subdriver_count == 0); 567 640 568 641 569 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 642 570 hid_dev->subdrivers, hid_dev->subdriver_count); 643 571 644 assert(hid_dev->subdrivers != NULL 645 || hid_dev->subdriver_count == 0); 646 647 for (i = 0; i < hid_dev->subdriver_count; ++i) { 572 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 648 573 if (hid_dev->subdrivers[i].deinit != NULL) { 649 574 hid_dev->subdrivers[i].deinit(hid_dev, … … 657 582 658 583 /* Destroy the parser */ 659 if (hid_dev->report != NULL) { 660 usb_hid_free_report(hid_dev->report); 661 } 584 usb_hid_report_deinit(&hid_dev->report); 662 585 663 586 }
Note:
See TracChangeset
for help on using the changeset viewer.