Changeset 323a5aaf in mainline for uspace/srv/kbd/arch/ia64/src/kbd.c
- Timestamp:
- 2008-11-30T12:17:56Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0ad9e47
- Parents:
- 57e76cb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/kbd/arch/ia64/src/kbd.c
r57e76cb r323a5aaf 40 40 #include <kbd.h> 41 41 #include <keys.h> 42 #include <stdio.h> 43 #include <stdlib.h> 44 45 #include <unistd.h> 46 #include <align.h> 47 #include <async.h> 48 #include <ipc/ipc.h> 49 #include <errno.h> 50 #include <stdio.h> 51 #include <ddi.h> 52 #include <sysinfo.h> 53 #include <as.h> 54 #include <ipc/fb.h> 55 #include <ipc/ipc.h> 56 #include <ipc/ns.h> 57 #include <ipc/services.h> 58 #include <libarch/ddi.h> 59 42 60 43 61 #define KEY_F1 0x504f1b … … 54 72 #define KEY_F12 0x7e34325b1b 55 73 74 75 76 77 #define NSKEY_F1 0x415b5b1b 78 #define NSKEY_F2 0x425b5b1b 79 #define NSKEY_F3 0x435b5b1b 80 #define NSKEY_F4 0x445b5b1b 81 #define NSKEY_F5 0x455b5b1b 82 #define NSKEY_F6 0x37315b1b 83 #define NSKEY_F7 0x38315b1b 84 #define NSKEY_F8 0x39315b1b 85 #define NSKEY_F9 0x30325b1b 86 #define NSKEY_F10 0x31325b1b 87 #define NSKEY_F11 0x33325b1b 88 #define NSKEY_F12 0x34325b1b 89 90 56 91 #define FUNCTION_KEYS 0x100 92 93 94 #define KBD_SKI 1 95 #define KBD_LEGACY 2 96 #define KBD_NS16550 3 97 98 99 100 101 /* NS16550 registers */ 102 #define RBR_REG 0 /** Receiver Buffer Register. */ 103 #define IER_REG 1 /** Interrupt Enable Register. */ 104 #define IIR_REG 2 /** Interrupt Ident Register (read). */ 105 #define FCR_REG 2 /** FIFO control register (write). */ 106 #define LCR_REG 3 /** Line Control register. */ 107 #define MCR_REG 4 /** Modem Control Register. */ 108 #define LSR_REG 5 /** Line Status Register. */ 109 110 111 57 112 58 113 irq_cmd_t ski_cmds[1] = { … … 65 120 }; 66 121 122 123 124 irq_cmd_t ns16550_cmds[1] = { 125 { CMD_PORT_READ_1, 0, 0, 2 }, 126 }; 127 128 irq_code_t ns16550_kbd = { 129 1, 130 ns16550_cmds 131 }; 132 133 134 uint16_t ns16550_port; 135 136 int kbd_type; 137 67 138 int kbd_arch_init(void) 68 139 { 69 140 if (sysinfo_value("kbd")) { 70 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); 141 kbd_type=sysinfo_value("kbd.type"); 142 if(kbd_type==KBD_SKI) ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); 143 if(kbd_type==KBD_NS16550) { 144 ns16550_kbd.cmds[0].addr= (void *) (sysinfo_value("kbd.port")+RBR_REG); 145 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ns16550_kbd); 146 iospace_enable(task_get_id(),ns16550_port=sysinfo_value("kbd.port"),8); 147 } 71 148 return 0; 72 149 } … … 82 159 } 83 160 */ 84 85 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) 161 #define LSR_DATA_READY 0x01 162 163 int kbd_ns16550_process(keybuffer_t *keybuffer, ipc_call_t *call) 164 { 165 static unsigned long buf = 0; 166 static int count = 0, esc_count=0; 167 168 int scan_code = IPC_GET_ARG2(*call); 169 170 if (scan_code == 0x1b) { 171 esc_count++; 172 if (esc_count == 3) { 173 __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); 174 } 175 } else { 176 esc_count = 0; 177 } 178 179 if(scan_code==0x0d) return 1; //Delete CR 180 181 if(scan_code == 0x7e) { 182 switch (buf) { 183 case NSKEY_F6: 184 keybuffer_push(keybuffer,FUNCTION_KEYS | 6); 185 buf = count = 0; 186 return 1; 187 case NSKEY_F7: 188 keybuffer_push(keybuffer,FUNCTION_KEYS | 7); 189 buf = count = 0; 190 return 1; 191 case NSKEY_F8: 192 keybuffer_push(keybuffer,FUNCTION_KEYS | 8); 193 buf = count = 0; 194 return 1; 195 case NSKEY_F9: 196 keybuffer_push(keybuffer,FUNCTION_KEYS | 9); 197 buf = count = 0; 198 return 1; 199 case NSKEY_F10: 200 keybuffer_push(keybuffer,FUNCTION_KEYS | 10); 201 buf = count = 0; 202 return 1; 203 case NSKEY_F11: 204 keybuffer_push(keybuffer,FUNCTION_KEYS | 11); 205 buf = count = 0; 206 return 1; 207 case NSKEY_F12: 208 keybuffer_push(keybuffer,FUNCTION_KEYS | 12); 209 buf = count = 0; 210 return 1; 211 default: 212 keybuffer_push(keybuffer, buf & 0xff); 213 keybuffer_push(keybuffer, (buf >> 8) &0xff); 214 keybuffer_push(keybuffer, (buf >> 16) &0xff); 215 keybuffer_push(keybuffer, (buf >> 24) &0xff); 216 keybuffer_push(keybuffer, scan_code); 217 buf = count = 0; 218 return 1; 219 } 220 } 221 222 buf |= ((unsigned long) scan_code)<<(8*(count++)); 223 224 if((buf & 0xff) != (NSKEY_F1 & 0xff)) { 225 keybuffer_push(keybuffer, buf); 226 buf = count = 0; 227 return 1; 228 } 229 230 if (count <= 1) 231 return 1; 232 233 if ((buf & 0xffff) != (NSKEY_F1 & 0xffff)) { 234 235 keybuffer_push(keybuffer, buf & 0xff); 236 keybuffer_push(keybuffer, (buf >> 8) &0xff); 237 buf = count = 0; 238 return 1; 239 } 240 241 if (count <= 2) 242 return 1; 243 244 245 if ((buf & 0xffffff) != (NSKEY_F1 & 0xffffff) 246 && (buf & 0xffffff) != (NSKEY_F6 & 0xffffff) 247 && (buf & 0xffffff) != (NSKEY_F9 & 0xffffff) ) { 248 249 keybuffer_push(keybuffer, buf & 0xff); 250 keybuffer_push(keybuffer, (buf >> 8) &0xff); 251 keybuffer_push(keybuffer, (buf >> 16) &0xff); 252 buf = count = 0; 253 return 1; 254 } 255 256 if (count <= 3) 257 return 1; 258 259 switch (buf) { 260 case NSKEY_F1: 261 keybuffer_push(keybuffer,FUNCTION_KEYS | 1); 262 buf = count = 0; 263 return 1; 264 case NSKEY_F2: 265 keybuffer_push(keybuffer,FUNCTION_KEYS | 2); 266 buf = count = 0; 267 return 1; 268 case NSKEY_F3: 269 keybuffer_push(keybuffer,FUNCTION_KEYS | 3); 270 buf = count = 0; 271 return 1; 272 case NSKEY_F4: 273 keybuffer_push(keybuffer,FUNCTION_KEYS | 4); 274 buf = count = 0; 275 return 1; 276 case NSKEY_F5: 277 keybuffer_push(keybuffer,FUNCTION_KEYS | 5); 278 buf = count = 0; 279 return 1; 280 } 281 282 283 284 switch (buf) { 285 case NSKEY_F6: 286 case NSKEY_F7: 287 case NSKEY_F8: 288 case NSKEY_F9: 289 case NSKEY_F10: 290 case NSKEY_F11: 291 case NSKEY_F12: 292 return 1; 293 default: 294 keybuffer_push(keybuffer, buf & 0xff); 295 keybuffer_push(keybuffer, (buf >> 8) &0xff); 296 keybuffer_push(keybuffer, (buf >> 16) &0xff); 297 keybuffer_push(keybuffer, (buf >> 24) &0xff); 298 buf = count = 0; 299 return 1; 300 } 301 return 1; 302 } 303 304 305 306 307 308 309 310 int kbd_ski_process(keybuffer_t *keybuffer, ipc_call_t *call) 86 311 { 87 312 static unsigned long long buf = 0; … … 89 314 static int esc_count = 0; 90 315 int scan_code = IPC_GET_ARG2(*call); 91 316 92 317 /* 93 318 * Please preserve this code (it can be used to determine scancodes) … … 98 323 //keybuffer_push(keybuffer, ' '); 99 324 //*/ 325 100 326 101 327 if (scan_code) { … … 156 382 buf = count = 0; 157 383 } 158 159 384 return 1; 160 385 } 386 387 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) 388 { 389 printf("KBD Key pressed: %x(%c)\n",IPC_GET_ARG2(*call),IPC_GET_ARG2(*call)); 390 if(kbd_type==KBD_SKI) return kbd_ski_process(keybuffer,call); 391 if(kbd_type==KBD_NS16550) return kbd_ns16550_process(keybuffer,call); 392 393 394 } 395 396 161 397 162 398 /**
Note:
See TracChangeset
for help on using the changeset viewer.