Changeset cc29622 in mainline for uspace/drv/bus/usb/usbhid/usbhid.c
- Timestamp:
- 2011-10-14T12:40:31Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e5024111
- Parents:
- 3002434
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/usbhid.c
r3002434 rcc29622 68 68 { 69 69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 70 70 71 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 72 72 sizeof(usb_hid_subdriver_t)); … … 74 74 return ENOMEM; 75 75 } 76 76 77 77 assert(hid_dev->subdriver_count >= 0); 78 78 79 79 // set the init callback 80 80 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_kbd_init; 81 81 82 82 // set the polling callback 83 83 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 84 84 usb_kbd_polling_callback; 85 85 86 86 // set the polling ended callback 87 87 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 88 88 89 89 // set the deinit callback 90 90 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_kbd_deinit; 91 91 92 92 // set subdriver count 93 93 ++hid_dev->subdriver_count; 94 94 95 95 return EOK; 96 96 } … … 101 101 { 102 102 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 103 103 104 104 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 105 105 sizeof(usb_hid_subdriver_t)); … … 107 107 return ENOMEM; 108 108 } 109 109 110 110 assert(hid_dev->subdriver_count >= 0); 111 111 112 112 // set the init callback 113 113 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_mouse_init; 114 114 115 115 // set the polling callback 116 116 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 117 117 usb_mouse_polling_callback; 118 118 119 119 // set the polling ended callback 120 120 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 121 121 122 122 // set the deinit callback 123 123 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_mouse_deinit; 124 124 125 125 // set subdriver count 126 126 ++hid_dev->subdriver_count; 127 127 128 128 return EOK; 129 129 } … … 134 134 { 135 135 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 136 136 137 137 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 138 138 sizeof(usb_hid_subdriver_t)); … … 140 140 return ENOMEM; 141 141 } 142 142 143 143 assert(hid_dev->subdriver_count >= 0); 144 144 145 145 // set the init callback 146 146 hid_dev->subdrivers[hid_dev->subdriver_count].init = 147 147 usb_generic_hid_init; 148 148 149 149 // set the polling callback 150 150 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 151 151 usb_generic_hid_polling_callback; 152 152 153 153 // set the polling ended callback 154 154 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 155 155 156 156 // set the deinit callback 157 157 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = NULL; 158 158 159 159 // set subdriver count 160 160 ++hid_dev->subdriver_count; 161 161 162 162 return EOK; 163 163 } … … 170 170 assert(hid_dev != NULL); 171 171 assert(hid_dev->usb_dev != NULL); 172 172 173 173 return (hid_dev->usb_dev->descriptors.device.vendor_id 174 174 == mapping->vendor_id … … 184 184 assert(hid_dev != NULL); 185 185 assert(mapping != NULL); 186 186 187 187 usb_hid_report_path_t *usage_path = usb_hid_report_path(); 188 188 if (usage_path == NULL) { … … 202 202 ++i; 203 203 } 204 204 205 205 assert(hid_dev->report != NULL); 206 206 207 207 usb_log_debug("Compare flags: %d\n", mapping->compare); 208 208 209 209 bool matches = false; 210 210 uint8_t report_id = mapping->report_id; … … 234 234 USB_HID_REPORT_TYPE_INPUT); 235 235 } while (!matches && report_id != 0); 236 236 237 237 usb_hid_report_path_free(usage_path); 238 238 239 239 return matches; 240 240 } … … 246 246 { 247 247 int i; 248 248 249 249 if (count <= 0) { 250 250 hid_dev->subdriver_count = 0; … … 252 252 return EOK; 253 253 } 254 254 255 255 // add one generic HID subdriver per device 256 256 257 257 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc((count + 1) * 258 258 sizeof(usb_hid_subdriver_t)); … … 260 260 return ENOMEM; 261 261 } 262 262 263 263 for (i = 0; i < count; ++i) { 264 264 hid_dev->subdrivers[i].init = subdrivers[i]->init; … … 267 267 hid_dev->subdrivers[i].poll_end = subdrivers[i]->poll_end; 268 268 } 269 269 270 270 hid_dev->subdrivers[count].init = usb_generic_hid_init; 271 271 hid_dev->subdrivers[count].poll = usb_generic_hid_polling_callback; 272 272 hid_dev->subdrivers[count].deinit = NULL; 273 273 hid_dev->subdrivers[count].poll_end = NULL; 274 274 275 275 hid_dev->subdriver_count = count + 1; 276 276 277 277 return EOK; 278 278 } … … 283 283 { 284 284 assert(hid_dev != NULL); 285 285 286 286 const usb_hid_subdriver_t *subdrivers[USB_HID_MAX_SUBDRIVERS]; 287 287 288 288 int i = 0, count = 0; 289 289 const usb_hid_subdriver_mapping_t *mapping = &usb_hid_subdrivers[i]; … … 291 291 bool ids_matched; 292 292 bool matched; 293 293 294 294 while (count < USB_HID_MAX_SUBDRIVERS && 295 295 (mapping->usage_path != NULL … … 339 339 mapping = &usb_hid_subdrivers[++i]; 340 340 } 341 341 342 342 // we have all subdrivers determined, save them into the hid device 343 343 return usb_hid_save_subdrivers(hid_dev, subdrivers, count); … … 349 349 { 350 350 assert(hid_dev != NULL && dev != NULL); 351 351 352 352 int rc = EOK; 353 353 354 354 if (dev->pipes[USB_HID_KBD_POLL_EP_NO].present) { 355 355 usb_log_debug("Found keyboard endpoint.\n"); … … 369 369 rc = ENOTSUP; 370 370 } 371 371 372 372 return rc; 373 373 } … … 378 378 { 379 379 assert(hid_dev != NULL && hid_dev->report != NULL); 380 380 381 381 uint8_t report_id = 0; 382 382 size_t size; 383 383 384 384 size_t max_size = 0; 385 385 386 386 do { 387 387 usb_log_debug("Getting size of the report.\n"); … … 394 394 report_id, USB_HID_REPORT_TYPE_INPUT); 395 395 } while (report_id != 0); 396 396 397 397 usb_log_debug("Max size of input report: %zu\n", max_size); 398 398 399 399 hid_dev->max_input_report_size = max_size; 400 400 assert(hid_dev->input_report == NULL); 401 401 402 402 hid_dev->input_report = malloc(max_size); 403 403 if (hid_dev->input_report == NULL) { … … 405 405 } 406 406 memset(hid_dev->input_report, 0, max_size); 407 407 408 408 return EOK; 409 409 } … … 415 415 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)calloc(1, 416 416 sizeof(usb_hid_dev_t)); 417 417 418 418 if (hid_dev == NULL) { 419 419 usb_log_fatal("No memory!\n"); 420 420 return NULL; 421 421 } 422 422 423 423 hid_dev->report = (usb_hid_report_t *)(malloc(sizeof( 424 424 usb_hid_report_t))); … … 428 428 return NULL; 429 429 } 430 430 431 431 hid_dev->poll_pipe_index = -1; 432 432 433 433 return hid_dev; 434 434 } … … 439 439 { 440 440 int rc, i; 441 441 442 442 usb_log_debug("Initializing HID structure...\n"); 443 443 444 444 if (hid_dev == NULL) { 445 445 usb_log_error("Failed to init HID structure: no structure given" … … 447 447 return EINVAL; 448 448 } 449 449 450 450 if (dev == NULL) { 451 451 usb_log_error("Failed to init HID structure: no USB device" … … 453 453 return EINVAL; 454 454 } 455 455 456 456 /* The USB device should already be initialized, save it in structure */ 457 457 hid_dev->usb_dev = dev; 458 458 459 459 rc = usb_hid_check_pipes(hid_dev, dev); 460 460 if (rc != EOK) { … … 465 465 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 466 466 hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size); 467 467 468 468 bool fallback = false; 469 469 470 470 if (rc == EOK) { 471 471 // try to find subdrivers that may want to handle this device … … 484 484 fallback = true; 485 485 } 486 486 487 487 if (fallback) { 488 488 // fall back to boot protocol … … 510 510 } 511 511 } 512 512 513 513 if (rc != EOK) { 514 514 usb_log_error("No subdriver for handling this device could be" … … 542 542 rc = (ok) ? EOK : -1; // what error to report 543 543 } 544 545 544 545 546 546 if (rc == EOK) { 547 547 // save max input report size and allocate space for the report … … 552 552 } 553 553 } 554 555 554 555 556 556 return rc; 557 557 } … … 563 563 { 564 564 int i; 565 565 566 566 if (dev == NULL || arg == NULL || buffer == NULL) { 567 567 usb_log_error("Missing arguments to polling callback.\n"); 568 568 return false; 569 569 } 570 570 571 571 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 572 572 573 573 assert(hid_dev->input_report != NULL); 574 574 usb_log_debug("New data [%zu/%zu]: %s\n", buffer_size, … … 582 582 usb_hid_new_report(hid_dev); 583 583 } 584 584 585 585 // parse the input report 586 586 587 587 int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 588 588 &hid_dev->report_id); 589 589 590 590 if (rc != EOK) { 591 591 usb_log_warning("Error in usb_hid_parse_report():" 592 592 "%s\n", str_error(rc)); 593 593 } 594 594 595 595 bool cont = false; 596 596 597 597 // continue if at least one of the subdrivers want to continue 598 598 for (i = 0; i < hid_dev->subdriver_count; ++i) { … … 603 603 } 604 604 } 605 605 606 606 return cont; 607 607 } … … 613 613 { 614 614 int i; 615 615 616 616 if (dev == NULL || arg == NULL) { 617 617 return; 618 618 } 619 619 620 620 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 621 621 622 622 for (i = 0; i < hid_dev->subdriver_count; ++i) { 623 623 if (hid_dev->subdrivers[i].poll_end != NULL) { … … 626 626 } 627 627 } 628 628 629 629 usb_hid_destroy(hid_dev); 630 630 } … … 649 649 { 650 650 int i; 651 651 652 652 if (hid_dev == NULL) { 653 653 return; 654 654 } 655 655 656 656 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 657 657 hid_dev->subdrivers, hid_dev->subdriver_count); 658 658 659 659 assert(hid_dev->subdrivers != NULL 660 660 || hid_dev->subdriver_count == 0); 661 661 662 662 for (i = 0; i < hid_dev->subdriver_count; ++i) { 663 663 if (hid_dev->subdrivers[i].deinit != NULL) { … … 666 666 } 667 667 } 668 668 669 669 // free the subdrivers info 670 670 if (hid_dev->subdrivers != NULL) {
Note:
See TracChangeset
for help on using the changeset viewer.