Changeset 51c1b003 in mainline for kbd/generic/kbd.c
- Timestamp:
- 2006-05-29T13:34:40Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 854387b
- Parents:
- d1e70c7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kbd/generic/kbd.c
rd1e70c7 r51c1b003 36 36 #include <arch/kbd.h> 37 37 #include <kbd.h> 38 #include <libadt/fifo.h> 38 39 #include <key_buffer.h> 39 #include <libadt/fifo.h>40 40 41 41 #define NAME "KBD" 42 43 #define KBD_REQUEST_MAX 32 /**< Maximum requests buffered until keypress */ 44 42 void hello(void *private, int retval, ipc_call_t *data) { 43 printf("%s: got answer from console with retval %d.\n", NAME, retval); 44 } 45 45 int main(int argc, char **argv) 46 46 { 47 47 ipc_call_t call; 48 48 ipc_callid_t callid; 49 int res; 50 ipcarg_t phonead; 51 int phoneid; 49 52 char connected = 0; 50 int res;51 int c;52 ipcarg_t phonead;53 53 54 54 ipcarg_t retval, arg1, arg2; 55 56 /* Counter of unsatisfied calls */57 fifo_count_t callers_counter = 0;58 /* Fifo with callid's of unsatisfied calls requred for answer */59 FIFO_INITIALIZE_STATIC(callers_buffer, ipc_callid_t, KBD_REQUEST_MAX);60 55 61 56 printf("Uspace kbd service started.\n"); … … 83 78 switch (IPC_GET_METHOD(call)) { 84 79 case IPC_M_PHONE_HUNGUP: 85 if (connected) { 86 /* If nobody's connected, clear keybuffer and dont store new keys */ 87 if (--connected == 0) { 88 callers_counter = 0; 89 callers_buffer.head = callers_buffer.tail = 0; 90 key_buffer_free(); 91 } 92 93 printf("%s: Phone hung up.\n", NAME); 94 } else { 95 printf("%s: Oops, got phone hung up, but nobody connected.\n", NAME); 96 } 97 80 printf("%s: Phone hung up.\n", NAME); 81 connected = 0; 98 82 retval = 0; 99 83 break; … … 108 92 } 109 93 break; 94 case IPC_M_CONNECT_TO_ME: 95 phoneid = IPC_GET_ARG3(call); 96 retval = 0; 97 break; 98 110 99 case IPC_M_INTERRUPT: 111 100 if (connected) { 112 /* recode scancode and store it into key buffer*/101 /* recode to ASCII - one interrupt can produce more than one code so result is stored in fifo */ 113 102 kbd_arch_process(IPC_GET_ARG2(call)); 114 //printf("%s: GOT INTERRUPT: %c\n", NAME, IPC_GET_ARG2(call)); 103 104 //printf("%s: GOT INTERRUPT: %c\n", NAME, key); 115 105 116 106 /* Some callers could awaiting keypress - if its true, we have to send keys to them. 117 107 * One interrupt can store more than one key into buffer. */ 108 118 109 retval = 0; 119 arg2 = 0xbeef; 120 while ((callers_counter) && (!key_buffer_empty())) { 121 callers_counter--; 110 111 while (!key_buffer_empty()) { 122 112 if (!key_buffer_pop((char *)&arg1)) { 123 printf("%s: KeyBuffer empty but it should not be.\n");113 printf("%s: KeyBuffer is empty but it should not be.\n"); 124 114 break; 125 115 } 126 ipc_answer_fast(fifo_pop(callers_buffer), retval, arg1, arg2); 116 /*FIXME: detection of closed connection */ 117 ipc_call_async(phoneid, KBD_PUSHCHAR, arg1, 0, &hello); 127 118 } 119 128 120 } 129 break; 130 case KBD_GETCHAR: 131 // printf("%s: Getchar: ", NAME); 132 retval = 0; 133 arg1 = 0; 134 if (!key_buffer_pop((char *)&arg1)) { 135 if (callers_counter < KBD_REQUEST_MAX) { 136 callers_counter++; 137 fifo_push(callers_buffer, callid); 138 } else { 139 retval = ELIMIT; 140 } 141 continue; 142 }; 143 arg2 = 0xbeef; 144 // printf("GetChar return %c\n", arg1); 145 121 printf("%s: Interrupt processed.\n", NAME); 146 122 break; 147 123 default:
Note:
See TracChangeset
for help on using the changeset viewer.