Changes in uspace/drv/usbhid/kbddev.c [b05e2fe:00b13408] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbddev.c
rb05e2fe r00b13408 51 51 #include <usb/classes/hidparser.h> 52 52 #include <usb/classes/classes.h> 53 #include <usb/classes/hidut.h> 53 54 54 55 #include "kbddev.h" … … 93 94 .flags = 0 94 95 }; 96 97 typedef enum usbhid_kbd_flags { 98 USBHID_KBD_STATUS_UNINITIALIZED = 0, 99 USBHID_KBD_STATUS_INITIALIZED = 1, 100 USBHID_KBD_STATUS_TO_DESTROY = -1 101 } usbhid_kbd_flags; 95 102 96 103 /*----------------------------------------------------------------------------*/ … … 124 131 }; 125 132 133 typedef enum usbhid_lock_code { 134 USBHID_LOCK_NUM = 0x53, 135 USBHID_LOCK_CAPS = 0x39, 136 USBHID_LOCK_SCROLL = 0x47, 137 USBHID_LOCK_COUNT = 3 138 } usbhid_lock_code; 139 140 static const usbhid_lock_code usbhid_lock_codes[USBHID_LOCK_COUNT] = { 141 USBHID_LOCK_NUM, 142 USBHID_LOCK_CAPS, 143 USBHID_LOCK_SCROLL 144 }; 145 126 146 /*----------------------------------------------------------------------------*/ 127 147 /* IPC method handler */ … … 218 238 219 239 assert(kbd_dev->hid_dev != NULL); 220 assert(kbd_dev->hid_dev->initialized );240 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED); 221 241 usbhid_req_set_report(kbd_dev->hid_dev, USB_HID_REPORT_TYPE_OUTPUT, 222 242 buffer, BOOTP_BUFFER_OUT_SIZE); … … 346 366 * @sa usbhid_kbd_push_ev() 347 367 */ 348 static void usbhid_kbd_check_modifier_changes(usbhid_kbd_t *kbd_dev, 349 uint8_t modifiers) 350 { 351 /* 352 * TODO: why the USB keyboard has NUM_, SCROLL_ and CAPS_LOCK 353 * both as modifiers and as keys with their own scancodes??? 354 * 355 * modifiers should be sent as normal keys to usbhid_parse_scancode()!! 356 * so maybe it would be better if I received it from report parser in 357 * that way 358 */ 359 360 int i; 361 for (i = 0; i < USB_HID_MOD_COUNT; ++i) { 362 if ((modifiers & usb_hid_modifiers_consts[i]) && 363 !(kbd_dev->modifiers & usb_hid_modifiers_consts[i])) { 364 // modifier pressed 365 if (usbhid_modifiers_keycodes[i] != 0) { 366 usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, 367 usbhid_modifiers_keycodes[i]); 368 } 369 } else if (!(modifiers & usb_hid_modifiers_consts[i]) && 370 (kbd_dev->modifiers & usb_hid_modifiers_consts[i])) { 371 // modifier released 372 if (usbhid_modifiers_keycodes[i] != 0) { 373 usbhid_kbd_push_ev(kbd_dev, KEY_RELEASE, 374 usbhid_modifiers_keycodes[i]); 375 } 376 } // no change 377 } 378 379 kbd_dev->modifiers = modifiers; 368 //static void usbhid_kbd_check_modifier_changes(usbhid_kbd_t *kbd_dev, 369 // const uint8_t *key_codes, size_t count) 370 //{ 371 // /* 372 // * TODO: why the USB keyboard has NUM_, SCROLL_ and CAPS_LOCK 373 // * both as modifiers and as keyUSB_HID_LOCK_COUNTs with their own scancodes??? 374 // * 375 // * modifiers should be sent as normal keys to usbhid_parse_scancode()!! 376 // * so maybe it would be better if I received it from report parser in 377 // * that way 378 // */ 379 380 // int i; 381 // for (i = 0; i < count; ++i) { 382 // if ((modifiers & usb_hid_modifiers_consts[i]) && 383 // !(kbd_dev->modifiers & usb_hid_modifiers_consts[i])) { 384 // // modifier pressed 385 // if (usbhid_modifiers_keycodes[i] != 0) { 386 // usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, 387 // usbhid_modifiers_keycodes[i]); 388 // } 389 // } else if (!(modifiers & usb_hid_modifiers_consts[i]) && 390 // (kbd_dev->modifiers & usb_hid_modifiers_consts[i])) { 391 // // modifier released 392 // if (usbhid_modifiers_keycodes[i] != 0) { 393 // usbhid_kbd_push_ev(kbd_dev, KEY_RELEASE, 394 // usbhid_modifiers_keycodes[i]); 395 // } 396 // } // no change 397 // } 398 399 // kbd_dev->modifiers = modifiers; 400 //} 401 402 /*----------------------------------------------------------------------------*/ 403 404 static inline int usbhid_kbd_is_lock(unsigned int key_code) 405 { 406 return (key_code == KC_NUM_LOCK 407 || key_code == KC_SCROLL_LOCK 408 || key_code == KC_CAPS_LOCK); 380 409 } 381 410 … … 404 433 /* 405 434 * First of all, check if the kbd have reported phantom state. 435 * 436 * TODO: this must be changed as we don't know which keys are modifiers 437 * and which are regular keys. 406 438 */ 407 439 i = 0; … … 434 466 // not found, i.e. the key was released 435 467 key = usbhid_parse_scancode(kbd_dev->keys[j]); 436 usbhid_kbd_repeat_stop(kbd_dev, key); 468 if (!usbhid_kbd_is_lock(key)) { 469 usbhid_kbd_repeat_stop(kbd_dev, key); 470 } 437 471 usbhid_kbd_push_ev(kbd_dev, KEY_RELEASE, key); 438 472 usb_log_debug2("Key released: %d\n", key); … … 458 492 key_codes[i]); 459 493 usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, key); 460 usbhid_kbd_repeat_start(kbd_dev, key); 494 if (!usbhid_kbd_is_lock(key)) { 495 usbhid_kbd_repeat_start(kbd_dev, key); 496 } 461 497 } else { 462 498 // found, nothing happens … … 502 538 503 539 usb_log_debug("Got keys from parser: %s\n", 504 usb_debug_str_buffer(key_codes, kbd_dev->key_count, 0));540 usb_debug_str_buffer(key_codes, count, 0)); 505 541 506 542 if (count != kbd_dev->key_count) { … … 510 546 } 511 547 512 usbhid_kbd_check_modifier_changes(kbd_dev, modifiers);548 ///usbhid_kbd_check_modifier_changes(kbd_dev, key_codes, count); 513 549 usbhid_kbd_check_key_changes(kbd_dev, key_codes, count); 514 550 } … … 535 571 uint8_t *buffer, size_t actual_size) 536 572 { 573 assert(kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED); 574 assert(kbd_dev->hid_dev->parser != NULL); 575 537 576 usb_hid_report_in_callbacks_t *callbacks = 538 577 (usb_hid_report_in_callbacks_t *)malloc( … … 541 580 callbacks->keyboard = usbhid_kbd_process_keycodes; 542 581 543 usb_log_debug("Calling usb_hid_ boot_keyboard_input_report() with "582 usb_log_debug("Calling usb_hid_parse_report() with " 544 583 "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0)); 545 584 546 int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, 547 callbacks, kbd_dev); 585 // int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, 586 // callbacks, kbd_dev); 587 int rc = usb_hid_parse_report(kbd_dev->hid_dev->parser, buffer, 588 actual_size, callbacks, kbd_dev); 548 589 549 590 if (rc != EOK) { … … 584 625 585 626 kbd_dev->console_phone = -1; 586 kbd_dev->initialized = 0;627 kbd_dev->initialized = USBHID_KBD_STATUS_UNINITIALIZED; 587 628 588 629 return kbd_dev; … … 590 631 591 632 /*----------------------------------------------------------------------------*/ 592 /** 593 * Properly destroys the USB/HID keyboard structure. 594 * 595 * @param kbd_dev Pointer to the structure to be destroyed. 596 */ 597 static void usbhid_kbd_free(usbhid_kbd_t **kbd_dev) 598 { 599 if (kbd_dev == NULL || *kbd_dev == NULL) { 600 return; 601 } 602 603 // hangup phone to the console 604 async_hangup((*kbd_dev)->console_phone); 605 606 if ((*kbd_dev)->hid_dev != NULL) { 607 usbhid_dev_free(&(*kbd_dev)->hid_dev); 608 assert((*kbd_dev)->hid_dev == NULL); 609 } 610 611 if ((*kbd_dev)->repeat_mtx != NULL) { 612 /* TODO: replace by some check and wait */ 613 assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)); 614 free((*kbd_dev)->repeat_mtx); 615 } 616 617 free(*kbd_dev); 618 *kbd_dev = NULL; 633 634 static void usbhid_kbd_mark_unusable(usbhid_kbd_t *kbd_dev) 635 { 636 kbd_dev->initialized = USBHID_KBD_STATUS_TO_DESTROY; 619 637 } 620 638 … … 658 676 } 659 677 660 if (kbd_dev->initialized ) {678 if (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED) { 661 679 usb_log_warning("Keyboard structure already initialized.\n"); 662 680 return EINVAL; … … 671 689 } 672 690 673 assert(kbd_dev->hid_dev->initialized );691 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED); 674 692 675 693 // save the size of the report (boot protocol report by default) 676 kbd_dev->key_count = BOOTP_REPORT_SIZE; 694 // kbd_dev->key_count = BOOTP_REPORT_SIZE; 695 696 usb_hid_report_path_t path; 697 path.usage_page = USB_HIDUT_PAGE_KEYBOARD; 698 kbd_dev->key_count = usb_hid_report_input_length( 699 kbd_dev->hid_dev->parser, &path); 700 701 usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count); 702 677 703 kbd_dev->keys = (uint8_t *)calloc( 678 704 kbd_dev->key_count, sizeof(uint8_t)); … … 709 735 assert(kbd_dev->hid_dev != NULL); 710 736 assert(kbd_dev->hid_dev->initialized); 711 usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT);737 //usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT); 712 738 713 739 usbhid_kbd_set_led(kbd_dev); … … 715 741 usbhid_req_set_idle(kbd_dev->hid_dev, IDLE_RATE); 716 742 717 kbd_dev->initialized = 1;743 kbd_dev->initialized = USBHID_KBD_STATUS_INITIALIZED; 718 744 usb_log_info("HID/KBD device structure initialized.\n"); 719 745 … … 829 855 usbhid_kbd_poll(kbd_dev); 830 856 857 // as there is another fibril using this device, so we must leave the 858 // structure to it, but mark it for destroying. 859 usbhid_kbd_mark_unusable(kbd_dev); 831 860 // at the end, properly destroy the KBD structure 832 usbhid_kbd_free(&kbd_dev);833 assert(kbd_dev == NULL);861 // usbhid_kbd_free(&kbd_dev); 862 // assert(kbd_dev == NULL); 834 863 835 864 return EOK; … … 953 982 } 954 983 984 /*----------------------------------------------------------------------------*/ 985 986 int usbhid_kbd_is_usable(const usbhid_kbd_t *kbd_dev) 987 { 988 return (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED); 989 } 990 991 /*----------------------------------------------------------------------------*/ 992 /** 993 * Properly destroys the USB/HID keyboard structure. 994 * 995 * @param kbd_dev Pointer to the structure to be destroyed. 996 */ 997 void usbhid_kbd_free(usbhid_kbd_t **kbd_dev) 998 { 999 if (kbd_dev == NULL || *kbd_dev == NULL) { 1000 return; 1001 } 1002 1003 // hangup phone to the console 1004 async_hangup((*kbd_dev)->console_phone); 1005 1006 if ((*kbd_dev)->hid_dev != NULL) { 1007 usbhid_dev_free(&(*kbd_dev)->hid_dev); 1008 assert((*kbd_dev)->hid_dev == NULL); 1009 } 1010 1011 if ((*kbd_dev)->repeat_mtx != NULL) { 1012 /* TODO: replace by some check and wait */ 1013 assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)); 1014 free((*kbd_dev)->repeat_mtx); 1015 } 1016 1017 free(*kbd_dev); 1018 *kbd_dev = NULL; 1019 } 1020 955 1021 /** 956 1022 * @}
Note:
See TracChangeset
for help on using the changeset viewer.