Changes in uspace/drv/usbhid/kbd/kbddev.c [1775ebc:cfbbe1d3] in mainline
- File:
-
- 1 edited
-
uspace/drv/usbhid/kbd/kbddev.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbd/kbddev.c
r1775ebc rcfbbe1d3 177 177 /*----------------------------------------------------------------------------*/ 178 178 179 //static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count,180 //uint8_t report_id, void *arg);181 182 //static const usb_hid_report_in_callbacks_t usb_kbd_parser_callbacks = {183 //.keyboard = usb_kbd_process_keycodes184 //};179 static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count, 180 uint8_t report_id, void *arg); 181 182 static const usb_hid_report_in_callbacks_t usb_kbd_parser_callbacks = { 183 .keyboard = usb_kbd_process_keycodes 184 }; 185 185 186 186 /*----------------------------------------------------------------------------*/ … … 304 304 usb_log_debug("Creating output report:\n"); 305 305 306 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 307 hid_dev->report, NULL, kbd_dev->led_path, 308 USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END, 309 USB_HID_REPORT_TYPE_OUTPUT); 310 311 while (field != NULL) { 312 313 if ((field->usage == USB_HID_LED_NUM_LOCK) 314 && (kbd_dev->mods & KM_NUM_LOCK)){ 306 usb_hid_report_field_t *field = usb_hid_report_get_sibling (hid_dev->parser, NULL, 307 kbd_dev->led_path, 308 USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END, 309 USB_HID_REPORT_TYPE_OUTPUT); 310 while(field != NULL) { 311 312 if((field->usage == USB_HID_LED_NUM_LOCK) && (kbd_dev->mods & KM_NUM_LOCK)){ 315 313 field->value = 1; 316 314 } 317 315 318 if ((field->usage == USB_HID_LED_CAPS_LOCK) 319 && (kbd_dev->mods & KM_CAPS_LOCK)){ 316 if((field->usage == USB_HID_LED_CAPS_LOCK) && (kbd_dev->mods & KM_CAPS_LOCK)){ 320 317 field->value = 1; 321 318 } 322 319 323 if ((field->usage == USB_HID_LED_SCROLL_LOCK) 324 && (kbd_dev->mods & KM_SCROLL_LOCK)){ 320 if((field->usage == USB_HID_LED_SCROLL_LOCK) && (kbd_dev->mods & KM_SCROLL_LOCK)){ 325 321 field->value = 1; 326 322 } 327 323 328 field = usb_hid_report_get_sibling (hid_dev->report, field,329 kbd_dev->led_path, USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY330 | USB_HID_PATH_COMPARE_END, USB_HID_REPORT_TYPE_OUTPUT);331 }332 333 // TODO: what about the Report ID?334 int rc = usb_hid_report_output_translate(hid_dev-> report, 0,324 field = usb_hid_report_get_sibling (hid_dev->parser, field, 325 kbd_dev->led_path, 326 USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY | USB_HID_PATH_COMPARE_END, 327 USB_HID_REPORT_TYPE_OUTPUT); 328 } 329 330 int rc = usb_hid_report_output_translate(hid_dev->parser, 0, 335 331 kbd_dev->output_buffer, kbd_dev->output_size); 336 332 … … 492 488 */ 493 489 static void usb_kbd_check_key_changes(usb_hid_dev_t *hid_dev, 494 usb_kbd_t *kbd_dev /*, const uint8_t *key_codes, size_t count*/)490 usb_kbd_t *kbd_dev, const uint8_t *key_codes, size_t count) 495 491 { 496 492 unsigned int key; … … 506 502 */ 507 503 i = 0; 508 while (i < kbd_dev->key_count && kbd_dev->keys[i] != ERROR_ROLLOVER) {504 while (i < count && key_codes[i] != ERROR_ROLLOVER) { 509 505 ++i; 510 506 } 511 if (i != kbd_dev->key_count) {507 if (i != count) { 512 508 usb_log_debug("Phantom state occured.\n"); 513 509 // phantom state, do nothing 514 510 return; 515 511 } 512 513 /* TODO: quite dummy right now, think of better implementation */ 514 assert(count == kbd_dev->key_count); 516 515 517 516 /* 518 517 * 1) Key releases 519 518 */ 520 for (j = 0; j < kbd_dev->key_count; ++j) {519 for (j = 0; j < count; ++j) { 521 520 // try to find the old key in the new key list 522 521 i = 0; 523 522 while (i < kbd_dev->key_count 524 && k bd_dev->keys[i] != kbd_dev->keys_old[j]) {523 && key_codes[i] != kbd_dev->keys[j]) { 525 524 ++i; 526 525 } 527 526 528 if (i == kbd_dev->key_count) {527 if (i == count) { 529 528 // not found, i.e. the key was released 530 key = usbhid_parse_scancode(kbd_dev->keys _old[j]);529 key = usbhid_parse_scancode(kbd_dev->keys[j]); 531 530 if (!usb_kbd_is_lock(key)) { 532 531 usb_kbd_repeat_stop(kbd_dev, key); … … 545 544 // try to find the new key in the old key list 546 545 j = 0; 547 while (j < kbd_dev->key_count 548 && kbd_dev->keys_old[j] != kbd_dev->keys[i]) { 546 while (j < count && kbd_dev->keys[j] != key_codes[i]) { 549 547 ++j; 550 548 } 551 549 552 if (j == kbd_dev->key_count) {550 if (j == count) { 553 551 // not found, i.e. new key pressed 554 key = usbhid_parse_scancode(k bd_dev->keys[i]);552 key = usbhid_parse_scancode(key_codes[i]); 555 553 usb_log_debug2("Key pressed: %d (keycode: %d)\n", key, 556 kbd_dev->keys[i]); 557 usb_kbd_push_ev(hid_dev, kbd_dev, KEY_PRESS, key); 554 key_codes[i]); 555 usb_kbd_push_ev(hid_dev, kbd_dev, KEY_PRESS, 556 key); 558 557 if (!usb_kbd_is_lock(key)) { 559 558 usb_kbd_repeat_start(kbd_dev, key); … … 564 563 } 565 564 566 // usb_log_debug("Old keys: "); 567 // for (i = 0; i < kbd_dev->key_count; ++i) { 568 // usb_log_debug("%d ", kbd_dev->keys_old[i]); 569 // } 570 // usb_log_debug("\n"); 571 572 573 // usb_log_debug("New keys: "); 574 // for (i = 0; i < kbd_dev->key_count; ++i) { 575 // usb_log_debug("%d ", kbd_dev->keys[i]); 576 // } 577 // usb_log_debug("\n"); 578 579 memcpy(kbd_dev->keys_old, kbd_dev->keys, kbd_dev->key_count * 4); 580 581 usb_log_debug2("New stored keys: "); 582 for (i = 0; i < kbd_dev->key_count; ++i) { 583 usb_log_debug2("%d ", kbd_dev->keys_old[i]); 584 } 585 usb_log_debug2("\n"); 565 memcpy(kbd_dev->keys, key_codes, count); 566 567 usb_log_debug("New stored keycodes: %s\n", 568 usb_debug_str_buffer(kbd_dev->keys, kbd_dev->key_count, 0)); 586 569 } 587 570 … … 605 588 * @sa usb_kbd_check_key_changes(), usb_kbd_check_modifier_changes() 606 589 */ 607 //static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count,608 //uint8_t report_id, void *arg)609 //{610 //if (arg == NULL) {611 //usb_log_warning("Missing argument in callback "612 //"usbhid_process_keycodes().\n");613 //return;614 //}615 616 //usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg;617 618 //if (hid_dev->data == NULL) {619 //usb_log_warning("Missing KBD device structure in callback.\n");620 //return;621 //}622 623 //usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data;624 625 //usb_log_debug("Got keys from parser (report id: %u): %s\n",626 //report_id, usb_debug_str_buffer(key_codes, count, 0));627 628 //if (count != kbd_dev->key_count) {629 // usb_log_warning("Number of received keycodes (%zu) differs from"630 // " expected (%zu).\n", count, kbd_dev->key_count);631 //return;632 //}633 634 /////usb_kbd_check_modifier_changes(kbd_dev, key_codes, count);635 //usb_kbd_check_key_changes(hid_dev, kbd_dev, key_codes, count);636 //}590 static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count, 591 uint8_t report_id, void *arg) 592 { 593 if (arg == NULL) { 594 usb_log_warning("Missing argument in callback " 595 "usbhid_process_keycodes().\n"); 596 return; 597 } 598 599 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 600 601 if (hid_dev->data == NULL) { 602 usb_log_warning("Missing KBD device structure in callback.\n"); 603 return; 604 } 605 606 usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data; 607 608 usb_log_debug("Got keys from parser (report id: %u): %s\n", 609 report_id, usb_debug_str_buffer(key_codes, count, 0)); 610 611 if (count != kbd_dev->key_count) { 612 usb_log_warning("Number of received keycodes (%d) differs from" 613 " expected number (%d).\n", count, kbd_dev->key_count); 614 return; 615 } 616 617 ///usb_kbd_check_modifier_changes(kbd_dev, key_codes, count); 618 usb_kbd_check_key_changes(hid_dev, kbd_dev, key_codes, count); 619 } 637 620 638 621 /*----------------------------------------------------------------------------*/ … … 658 641 uint8_t *buffer, size_t actual_size) 659 642 { 660 assert(hid_dev->report != NULL); 661 assert(hid_dev != NULL); 662 assert(hid_dev->data != NULL); 663 664 usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data; 643 assert(hid_dev->parser != NULL); 665 644 666 645 usb_log_debug("Calling usb_hid_parse_report() with " … … 674 653 675 654 uint8_t report_id; 676 int rc = usb_hid_parse_report(hid_dev->report, buffer, actual_size, 677 &report_id); 655 int rc = usb_hid_parse_report(hid_dev->parser, buffer, actual_size, &report_id); 656 usb_hid_report_path_set_report_id (path, report_id); 657 usb_hid_report_field_t *field = usb_hid_report_get_sibling(hid_dev->parser, 658 NULL, path, USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 659 USB_HID_REPORT_TYPE_INPUT); 660 661 unsigned i=0; 662 usb_kbd_t *kbd_dev = (usb_kbd_t *)hid_dev->data; 663 664 memset(kbd_dev->keys, 0, kbd_dev->key_count); 665 while(field != NULL) { 666 if((i < kbd_dev->key_count) && (field->value != 0)){ 667 kbd_dev->keys[i++] = (uint8_t)field->usage; 668 } 669 field = usb_hid_report_get_sibling(hid_dev->parser, field, path, 670 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 671 USB_HID_REPORT_TYPE_INPUT); 672 } 673 usb_kbd_process_keycodes(kbd_dev->keys, kbd_dev->key_count, report_id, hid_dev); 674 675 usb_hid_report_path_free(path); 678 676 679 677 if (rc != EOK) { 680 usb_log_warning("Error in usb_hid_ parse_report():"678 usb_log_warning("Error in usb_hid_boot_keyboard_input_report():" 681 679 "%s\n", str_error(rc)); 682 680 } 683 684 usb_hid_report_path_set_report_id (path, report_id);685 686 // fill in the currently pressed keys687 688 usb_hid_report_field_t *field = usb_hid_report_get_sibling(689 hid_dev->report, NULL, path,690 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,691 USB_HID_REPORT_TYPE_INPUT);692 unsigned i = 0;693 694 while (field != NULL) {695 usb_log_debug2("FIELD (%p) - VALUE(%d) USAGE(%u)\n",696 field, field->value, field->value);697 698 assert(i < kbd_dev->key_count);699 // if (i == kbd_dev->key_count) {700 // break;701 // }702 703 // save the key usage704 /* TODO: maybe it's not good to save value, nor usage705 * as the value may be e.g. 1 for LEDs and usage may be706 * value of the LED. On the other hand, in case of normal707 * keys, the usage is more important and we must check708 * that. One possible solution: distinguish between those709 * two parts of the Report somehow.710 */711 kbd_dev->keys[i] = field->value;712 usb_log_debug2("Saved %u. key usage %d\n", i, kbd_dev->keys[i]);713 714 ++i;715 field = usb_hid_report_get_sibling(hid_dev->report, field, path,716 USB_HID_PATH_COMPARE_END717 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,718 USB_HID_REPORT_TYPE_INPUT);719 }720 721 usb_hid_report_path_free(path);722 723 usb_kbd_check_key_changes(hid_dev, kbd_dev);724 681 } 725 682 … … 809 766 810 767 kbd_dev->key_count = usb_hid_report_input_length( 811 hid_dev-> report, path,768 hid_dev->parser, path, 812 769 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); 813 770 usb_hid_report_path_free(path); … … 815 772 usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count); 816 773 817 kbd_dev->keys = ( int32_t *)calloc(kbd_dev->key_count, sizeof(int32_t));774 kbd_dev->keys = (uint8_t *)calloc(kbd_dev->key_count, sizeof(uint8_t)); 818 775 819 776 if (kbd_dev->keys == NULL) { … … 823 780 } 824 781 825 kbd_dev->keys_old =826 (int32_t *)calloc(kbd_dev->key_count, sizeof(int32_t));827 828 if (kbd_dev->keys_old == NULL) {829 usb_log_fatal("No memory!\n");830 free(kbd_dev->keys);831 free(kbd_dev);832 return ENOMEM;833 }834 835 782 /* 836 783 * Output report 837 784 */ 838 785 kbd_dev->output_size = 0; 839 kbd_dev->output_buffer = usb_hid_report_output(hid_dev-> report,840 &kbd_dev->output_size, 0 );786 kbd_dev->output_buffer = usb_hid_report_output(hid_dev->parser, 787 &kbd_dev->output_size, 0x00); 841 788 if (kbd_dev->output_buffer == NULL) { 842 789 usb_log_warning("Error creating output report buffer.\n"); … … 851 798 kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0); 852 799 853 kbd_dev->led_output_size = usb_hid_report_output_size(hid_dev-> report,800 kbd_dev->led_output_size = usb_hid_report_output_size(hid_dev->parser, 854 801 kbd_dev->led_path, 855 802 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY); … … 1008 955 int usb_kbd_set_boot_protocol(usb_hid_dev_t *hid_dev) 1009 956 { 1010 int rc = usb_hid_parse_report_descriptor(hid_dev-> report,957 int rc = usb_hid_parse_report_descriptor(hid_dev->parser, 1011 958 USB_KBD_BOOT_REPORT_DESCRIPTOR, 1012 959 USB_KBD_BOOT_REPORT_DESCRIPTOR_SIZE);
Note:
See TracChangeset
for help on using the changeset viewer.
