Changeset ec153a0 in mainline for kbd/generic/kbd.c
- Timestamp:
- 2006-05-16T09:46:22Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ca603c6
- Parents:
- 250717cc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kbd/generic/kbd.c
r250717cc rec153a0 53 53 54 54 ipcarg_t retval, arg1, arg2; 55 55 56 /* Counter of unsatisfied calls */ 56 57 fifo_count_t callers_counter = 0; 57 58 /* Fifo with callid's of unsatisfied calls requred for answer */ 58 59 FIFO_INITIALIZE_STATIC(callers_buffer, ipc_callid_t, KBD_REQUEST_MAX); 59 60 … … 81 82 // printf("%s:Call phone=%lX..", NAME, call.in_phone_hash); 82 83 switch (IPC_GET_METHOD(call)) { 83 case IPC_M_PHONE_HUNGUP: 84 if (connected) { 85 if (--connected == 0) { 86 callers_counter = 0; 87 callers_buffer.head = callers_buffer.tail = 0; 88 key_buffer_free(); 84 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); 89 96 } 90 } 91 92 printf("%s: Phone hung up.\n", NAME); 93 retval = 0; 94 break; 95 case IPC_M_CONNECT_TO_ME: 96 printf("%s: Somebody connecting phid=%zd.\n", NAME, IPC_GET_ARG3(call)); 97 retval = 0; 98 break; 99 case IPC_M_CONNECT_ME_TO: 100 // printf("%s: Connect me (%P) to: %zd\n",NAME, IPC_GET_ARG3(call), IPC_GET_ARG1(call)); 101 if (connected) { 102 retval = ELIMIT; 103 } else { 97 104 98 retval = 0; 105 connected = 1;106 }107 break;108 case IPC_M_INTERRUPT:109 if (connected) {110 kbd_arch_process(IPC_GET_ARG2(call));111 }112 //printf("%s: GOT INTERRUPT: %c\n", NAME, IPC_GET_ARG2(call));113 if (!callers_counter)114 99 break; 115 /* Small trick - interrupt does not need answer so we can change callid to caller awaiting key */ 116 callers_counter--; 117 callid = fifo_pop(callers_buffer); 118 case KBD_GETCHAR: 119 // printf("%s: Getchar: ", NAME); 120 retval = 0; 121 arg1 = 0; 122 if (!key_buffer_pop((char *)&arg1)) { 123 if (callers_counter < KBD_REQUEST_MAX) { 124 callers_counter++; 125 fifo_push(callers_buffer, callid); 100 case IPC_M_CONNECT_TO_ME: 101 printf("%s: Somebody connecting phid=%zd.\n", NAME, IPC_GET_ARG3(call)); 102 retval = 0; 103 break; 104 case IPC_M_CONNECT_ME_TO: 105 // printf("%s: Connect me (%P) to: %zd\n",NAME, IPC_GET_ARG3(call), IPC_GET_ARG1(call)); 106 /* Only one connected client allowed */ 107 if (connected) { 108 retval = ELIMIT; 126 109 } else { 127 retval = ELIMIT; 110 retval = 0; 111 connected = 1; 128 112 } 129 continue; 130 }; 131 arg2 = 0xbeef; 132 // printf("GetChar return %c\n", arg1); 133 134 break; 135 default: 136 printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call)); 137 retval = ENOENT; 138 break; 113 break; 114 case IPC_M_INTERRUPT: 115 if (connected) { 116 /* recode scancode and store it into key buffer */ 117 kbd_arch_process(IPC_GET_ARG2(call)); 118 //printf("%s: GOT INTERRUPT: %c\n", NAME, IPC_GET_ARG2(call)); 119 120 /* Some callers could awaiting keypress - if its true, we have to send keys to them. 121 * One interrupt can store more than one key into buffer. */ 122 retval = 0; 123 arg2 = 0xbeef; 124 while ((callers_counter) && (!key_buffer_empty())) { 125 callers_counter--; 126 if (!key_buffer_pop((char *)&arg1)) { 127 printf("%s: KeyBuffer empty but it should not be.\n"); 128 break; 129 } 130 ipc_answer_fast(fifo_pop(callers_buffer), retval, arg1, arg2); 131 } 132 } 133 break; 134 case KBD_GETCHAR: 135 // printf("%s: Getchar: ", NAME); 136 retval = 0; 137 arg1 = 0; 138 if (!key_buffer_pop((char *)&arg1)) { 139 if (callers_counter < KBD_REQUEST_MAX) { 140 callers_counter++; 141 fifo_push(callers_buffer, callid); 142 } else { 143 retval = ELIMIT; 144 } 145 continue; 146 }; 147 arg2 = 0xbeef; 148 // printf("GetChar return %c\n", arg1); 149 150 break; 151 default: 152 printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call)); 153 retval = ENOENT; 154 break; 139 155 } 156 140 157 if (! (callid & IPC_CALLID_NOTIFICATION)) { 141 // printf("%s: Answering\n", NAME);142 158 ipc_answer_fast(callid, retval, arg1, arg2); 143 159 } 144 160 } 145 161 } 162
Note:
See TracChangeset
for help on using the changeset viewer.