Changes in / [103cf26:a763eb4] in mainline
- Location:
- uspace
- Files:
-
- 3 added
- 2 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/hiddev.c
r103cf26 ra763eb4 440 440 if (rc != EOK) { 441 441 /* TODO: end session?? */ 442 usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe);443 442 usb_log_error("Failed to process descriptors: %s.\n", 444 443 str_error(rc)); -
uspace/drv/usbhid/hiddev.h
r103cf26 ra763eb4 32 32 /** @file 33 33 * Generic USB HID device structure and API. 34 *35 * @todo Add function for parsing report - this is generic HID function, not36 * keyboard-specific, as the report parser is also generic.37 * @todo Add function for polling as that is also a generic HID process.38 * @todo Add interrupt in pipe to the structure.39 34 */ 40 35 -
uspace/drv/usbhid/kbddev.c
r103cf26 ra763eb4 94 94 .flags = 0 95 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 = -1101 } usbhid_kbd_flags;102 96 103 97 /*----------------------------------------------------------------------------*/ … … 238 232 239 233 assert(kbd_dev->hid_dev != NULL); 240 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);234 assert(kbd_dev->hid_dev->initialized); 241 235 usbhid_req_set_report(kbd_dev->hid_dev, USB_HID_REPORT_TYPE_OUTPUT, 242 236 buffer, BOOTP_BUFFER_OUT_SIZE); … … 571 565 uint8_t *buffer, size_t actual_size) 572 566 { 573 assert(kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);567 assert(kbd_dev->initialized); 574 568 assert(kbd_dev->hid_dev->parser != NULL); 575 569 … … 625 619 626 620 kbd_dev->console_phone = -1; 627 kbd_dev->initialized = USBHID_KBD_STATUS_UNINITIALIZED;621 kbd_dev->initialized = 0; 628 622 629 623 return kbd_dev; … … 631 625 632 626 /*----------------------------------------------------------------------------*/ 633 634 static void usbhid_kbd_mark_unusable(usbhid_kbd_t *kbd_dev) 635 { 636 kbd_dev->initialized = USBHID_KBD_STATUS_TO_DESTROY; 627 /** 628 * Properly destroys the USB/HID keyboard structure. 629 * 630 * @param kbd_dev Pointer to the structure to be destroyed. 631 */ 632 static void usbhid_kbd_free(usbhid_kbd_t **kbd_dev) 633 { 634 if (kbd_dev == NULL || *kbd_dev == NULL) { 635 return; 636 } 637 638 // hangup phone to the console 639 async_hangup((*kbd_dev)->console_phone); 640 641 if ((*kbd_dev)->hid_dev != NULL) { 642 usbhid_dev_free(&(*kbd_dev)->hid_dev); 643 assert((*kbd_dev)->hid_dev == NULL); 644 } 645 646 if ((*kbd_dev)->repeat_mtx != NULL) { 647 /* TODO: replace by some check and wait */ 648 assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)); 649 free((*kbd_dev)->repeat_mtx); 650 } 651 652 free(*kbd_dev); 653 *kbd_dev = NULL; 637 654 } 638 655 … … 676 693 } 677 694 678 if (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED) {695 if (kbd_dev->initialized) { 679 696 usb_log_warning("Keyboard structure already initialized.\n"); 680 697 return EINVAL; … … 689 706 } 690 707 691 assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);708 assert(kbd_dev->hid_dev->initialized); 692 709 693 710 // save the size of the report (boot protocol report by default) … … 741 758 usbhid_req_set_idle(kbd_dev->hid_dev, IDLE_RATE); 742 759 743 kbd_dev->initialized = USBHID_KBD_STATUS_INITIALIZED;760 kbd_dev->initialized = 1; 744 761 usb_log_info("HID/KBD device structure initialized.\n"); 745 762 … … 855 872 usbhid_kbd_poll(kbd_dev); 856 873 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 874 // at the end, properly destroy the KBD structure 861 //usbhid_kbd_free(&kbd_dev);862 //assert(kbd_dev == NULL);875 usbhid_kbd_free(&kbd_dev); 876 assert(kbd_dev == NULL); 863 877 864 878 return EOK; … … 982 996 } 983 997 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 998 /** 1022 999 * @} -
uspace/drv/usbhid/kbddev.h
r103cf26 ra763eb4 101 101 fibril_mutex_t *repeat_mtx; 102 102 103 /** State of the structure (for checking before use). 104 * 105 * 0 - not initialized 106 * 1 - initialized 107 * -1 - ready for destroying 108 */ 103 /** State of the structure (for checking before use). */ 109 104 int initialized; 110 105 } usbhid_kbd_t; … … 113 108 114 109 int usbhid_kbd_try_add_device(ddf_dev_t *dev); 115 116 int usbhid_kbd_is_usable(const usbhid_kbd_t *kbd_dev);117 118 void usbhid_kbd_free(usbhid_kbd_t **kbd_dev);119 110 120 111 void usbhid_kbd_push_ev(usbhid_kbd_t *kbd_dev, int type, unsigned int key); -
uspace/drv/usbhid/kbdrepeat.c
r103cf26 ra763eb4 77 77 78 78 while (true) { 79 // check if the kbd structure is usable80 if (!usbhid_kbd_is_usable(kbd)) {81 usbhid_kbd_free(&kbd);82 assert(kbd == NULL);83 return;84 }85 86 79 fibril_mutex_lock(kbd->repeat_mtx); 87 80
Note:
See TracChangeset
for help on using the changeset viewer.