Changes in uspace/drv/usbhid/kbddev.c [00b13408:b05e2fe] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/kbddev.c
r00b13408 rb05e2fe 51 51 #include <usb/classes/hidparser.h> 52 52 #include <usb/classes/classes.h> 53 #include <usb/classes/hidut.h>54 53 55 54 #include "kbddev.h" … … 94 93 .flags = 0 95 94 }; 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 = -1101 } usbhid_kbd_flags;102 95 103 96 /*----------------------------------------------------------------------------*/ … … 131 124 }; 132 125 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 = 3138 } 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_SCROLL144 };145 146 126 /*----------------------------------------------------------------------------*/ 147 127 /* IPC method handler */ … … 238 218 239 219 assert(kbd_dev->hid_dev != NULL); 240 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);220 assert(kbd_dev->hid_dev->initialized); 241 221 usbhid_req_set_report(kbd_dev->hid_dev, USB_HID_REPORT_TYPE_OUTPUT, 242 222 buffer, BOOTP_BUFFER_OUT_SIZE); … … 366 346 * @sa usbhid_kbd_push_ev() 367 347 */ 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); 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; 409 380 } 410 381 … … 433 404 /* 434 405 * 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 modifiers437 * and which are regular keys.438 406 */ 439 407 i = 0; … … 466 434 // not found, i.e. the key was released 467 435 key = usbhid_parse_scancode(kbd_dev->keys[j]); 468 if (!usbhid_kbd_is_lock(key)) { 469 usbhid_kbd_repeat_stop(kbd_dev, key); 470 } 436 usbhid_kbd_repeat_stop(kbd_dev, key); 471 437 usbhid_kbd_push_ev(kbd_dev, KEY_RELEASE, key); 472 438 usb_log_debug2("Key released: %d\n", key); … … 492 458 key_codes[i]); 493 459 usbhid_kbd_push_ev(kbd_dev, KEY_PRESS, key); 494 if (!usbhid_kbd_is_lock(key)) { 495 usbhid_kbd_repeat_start(kbd_dev, key); 496 } 460 usbhid_kbd_repeat_start(kbd_dev, key); 497 461 } else { 498 462 // found, nothing happens … … 538 502 539 503 usb_log_debug("Got keys from parser: %s\n", 540 usb_debug_str_buffer(key_codes, count, 0));504 usb_debug_str_buffer(key_codes, kbd_dev->key_count, 0)); 541 505 542 506 if (count != kbd_dev->key_count) { … … 546 510 } 547 511 548 ///usbhid_kbd_check_modifier_changes(kbd_dev, key_codes, count);512 usbhid_kbd_check_modifier_changes(kbd_dev, modifiers); 549 513 usbhid_kbd_check_key_changes(kbd_dev, key_codes, count); 550 514 } … … 571 535 uint8_t *buffer, size_t actual_size) 572 536 { 573 assert(kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);574 assert(kbd_dev->hid_dev->parser != NULL);575 576 537 usb_hid_report_in_callbacks_t *callbacks = 577 538 (usb_hid_report_in_callbacks_t *)malloc( … … 580 541 callbacks->keyboard = usbhid_kbd_process_keycodes; 581 542 582 usb_log_debug("Calling usb_hid_ parse_report() with "543 usb_log_debug("Calling usb_hid_boot_keyboard_input_report() with " 583 544 "buffer %s\n", usb_debug_str_buffer(buffer, actual_size, 0)); 584 545 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); 546 int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, 547 callbacks, kbd_dev); 589 548 590 549 if (rc != EOK) { … … 625 584 626 585 kbd_dev->console_phone = -1; 627 kbd_dev->initialized = USBHID_KBD_STATUS_UNINITIALIZED;586 kbd_dev->initialized = 0; 628 587 629 588 return kbd_dev; … … 631 590 632 591 /*----------------------------------------------------------------------------*/ 633 634 static void usbhid_kbd_mark_unusable(usbhid_kbd_t *kbd_dev) 635 { 636 kbd_dev->initialized = USBHID_KBD_STATUS_TO_DESTROY; 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; 637 619 } 638 620 … … 676 658 } 677 659 678 if (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED) {660 if (kbd_dev->initialized) { 679 661 usb_log_warning("Keyboard structure already initialized.\n"); 680 662 return EINVAL; … … 689 671 } 690 672 691 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);673 assert(kbd_dev->hid_dev->initialized); 692 674 693 675 // save the size of the report (boot protocol report by default) 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 676 kbd_dev->key_count = BOOTP_REPORT_SIZE; 703 677 kbd_dev->keys = (uint8_t *)calloc( 704 678 kbd_dev->key_count, sizeof(uint8_t)); … … 735 709 assert(kbd_dev->hid_dev != NULL); 736 710 assert(kbd_dev->hid_dev->initialized); 737 //usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT);711 usbhid_req_set_protocol(kbd_dev->hid_dev, USB_HID_PROTOCOL_BOOT); 738 712 739 713 usbhid_kbd_set_led(kbd_dev); … … 741 715 usbhid_req_set_idle(kbd_dev->hid_dev, IDLE_RATE); 742 716 743 kbd_dev->initialized = USBHID_KBD_STATUS_INITIALIZED;717 kbd_dev->initialized = 1; 744 718 usb_log_info("HID/KBD device structure initialized.\n"); 745 719 … … 855 829 usbhid_kbd_poll(kbd_dev); 856 830 857 // as there is another fibril using this device, so we must leave the858 // structure to it, but mark it for destroying.859 usbhid_kbd_mark_unusable(kbd_dev);860 831 // at the end, properly destroy the KBD structure 861 //usbhid_kbd_free(&kbd_dev);862 //assert(kbd_dev == NULL);832 usbhid_kbd_free(&kbd_dev); 833 assert(kbd_dev == NULL); 863 834 864 835 return EOK; … … 982 953 } 983 954 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 console1004 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 1021 955 /** 1022 956 * @}
Note:
See TracChangeset
for help on using the changeset viewer.