Changeset 801579fe in mainline for uspace/kbd/arch/ia32/src/kbd.c
- Timestamp:
- 2006-09-07T19:46:23Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 253f35a1
- Parents:
- 9141377
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/kbd/arch/ia32/src/kbd.c
r9141377 r801579fe 42 42 #include <kbd.h> 43 43 #include <keys.h> 44 #include <genarch/kbd.h> 44 45 45 46 /* Interesting bits for status register */ … … 63 64 #define MOUSE_ACK 0xfa 64 65 65 66 #define SPECIAL 25567 66 #define KEY_RELEASE 0x80 68 69 /**70 * These codes read from i8042 data register are silently ignored.71 */72 #define IGNORE_CODE 0x7f73 74 #define PRESSED_SHIFT (1<<0)75 #define PRESSED_CAPSLOCK (1<<1)76 #define LOCKED_CAPSLOCK (1<<0)77 78 /** Scancodes. */79 #define SC_ESC 0x0180 #define SC_BACKSPACE 0x0e81 #define SC_LSHIFT 0x2a82 #define SC_RSHIFT 0x3683 #define SC_CAPSLOCK 0x3a84 #define SC_SPEC_ESCAPE 0xe085 #define SC_LEFTARR 0x4b86 #define SC_RIGHTARR 0x4d87 #define SC_UPARR 0x4888 #define SC_DOWNARR 0x5089 #define SC_DELETE 0x5390 #define SC_HOME 0x4791 #define SC_END 0x4f92 93 #define FUNCTION_KEYS 0x10094 67 95 68 static volatile int keyflags; /**< Tracking of multiple keypresses. */ 96 69 static volatile int lockflags; /**< Tracking of multiple keys lockings. */ 97 98 /** Primary meaning of scancodes. */99 static int sc_primary_map[] = {100 SPECIAL, /* 0x00 */101 SPECIAL, /* 0x01 - Esc */102 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=',103 '\b', /* 0x0e - Backspace */104 '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',105 SPECIAL, /* 0x1d - LCtrl */106 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'',107 '`',108 SPECIAL, /* 0x2a - LShift */109 '\\',110 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',111 SPECIAL, /* 0x36 - RShift */112 '*',113 SPECIAL, /* 0x38 - LAlt */114 ' ',115 SPECIAL, /* 0x3a - CapsLock */116 (FUNCTION_KEYS | 1), /* 0x3b - F1 */117 (FUNCTION_KEYS | 2), /* 0x3c - F2 */118 (FUNCTION_KEYS | 3), /* 0x3d - F3 */119 (FUNCTION_KEYS | 4), /* 0x3e - F4 */120 (FUNCTION_KEYS | 5), /* 0x3f - F5 */121 (FUNCTION_KEYS | 6), /* 0x40 - F6 */122 (FUNCTION_KEYS | 7), /* 0x41 - F7 */123 (FUNCTION_KEYS | 8), /* 0x42 - F8 */124 (FUNCTION_KEYS | 9), /* 0x43 - F9 */125 (FUNCTION_KEYS | 10), /* 0x44 - F10 */126 SPECIAL, /* 0x45 - NumLock */127 SPECIAL, /* 0x46 - ScrollLock */128 '7', '8', '9', '-',129 '4', '5', '6', '+',130 '1', '2', '3',131 '0', '.',132 SPECIAL, /* 0x54 - Alt-SysRq */133 SPECIAL, /* 0x55 - F11/F12/PF1/FN */134 SPECIAL, /* 0x56 - unlabelled key next to LAlt */135 (FUNCTION_KEYS | 11), /* 0x57 - F11 */136 (FUNCTION_KEYS | 12), /* 0x58 - F12 */137 SPECIAL, /* 0x59 */138 SPECIAL, /* 0x5a */139 SPECIAL, /* 0x5b */140 SPECIAL, /* 0x5c */141 SPECIAL, /* 0x5d */142 SPECIAL, /* 0x5e */143 SPECIAL, /* 0x5f */144 SPECIAL, /* 0x60 */145 SPECIAL, /* 0x61 */146 SPECIAL, /* 0x62 */147 SPECIAL, /* 0x63 */148 SPECIAL, /* 0x64 */149 SPECIAL, /* 0x65 */150 SPECIAL, /* 0x66 */151 SPECIAL, /* 0x67 */152 SPECIAL, /* 0x68 */153 SPECIAL, /* 0x69 */154 SPECIAL, /* 0x6a */155 SPECIAL, /* 0x6b */156 SPECIAL, /* 0x6c */157 SPECIAL, /* 0x6d */158 SPECIAL, /* 0x6e */159 SPECIAL, /* 0x6f */160 SPECIAL, /* 0x70 */161 SPECIAL, /* 0x71 */162 SPECIAL, /* 0x72 */163 SPECIAL, /* 0x73 */164 SPECIAL, /* 0x74 */165 SPECIAL, /* 0x75 */166 SPECIAL, /* 0x76 */167 SPECIAL, /* 0x77 */168 SPECIAL, /* 0x78 */169 SPECIAL, /* 0x79 */170 SPECIAL, /* 0x7a */171 SPECIAL, /* 0x7b */172 SPECIAL, /* 0x7c */173 SPECIAL, /* 0x7d */174 SPECIAL, /* 0x7e */175 SPECIAL, /* 0x7f */176 };177 178 /** Secondary meaning of scancodes. */179 static int sc_secondary_map[] = {180 SPECIAL, /* 0x00 */181 0x1b, /* 0x01 - Esc */182 '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+',183 SPECIAL, /* 0x0e - Backspace */184 '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n',185 SPECIAL, /* 0x1d - LCtrl */186 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"',187 '~',188 SPECIAL, /* 0x2a - LShift */189 '|',190 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',191 SPECIAL, /* 0x36 - RShift */192 '*',193 SPECIAL, /* 0x38 - LAlt */194 ' ',195 SPECIAL, /* 0x3a - CapsLock */196 SPECIAL, /* 0x3b - F1 */197 SPECIAL, /* 0x3c - F2 */198 SPECIAL, /* 0x3d - F3 */199 SPECIAL, /* 0x3e - F4 */200 SPECIAL, /* 0x3f - F5 */201 SPECIAL, /* 0x40 - F6 */202 SPECIAL, /* 0x41 - F7 */203 SPECIAL, /* 0x42 - F8 */204 SPECIAL, /* 0x43 - F9 */205 SPECIAL, /* 0x44 - F10 */206 SPECIAL, /* 0x45 - NumLock */207 SPECIAL, /* 0x46 - ScrollLock */208 '7', '8', '9', '-',209 '4', '5', '6', '+',210 '1', '2', '3',211 '0', '.',212 SPECIAL, /* 0x54 - Alt-SysRq */213 SPECIAL, /* 0x55 - F11/F12/PF1/FN */214 SPECIAL, /* 0x56 - unlabelled key next to LAlt */215 SPECIAL, /* 0x57 - F11 */216 SPECIAL, /* 0x58 - F12 */217 SPECIAL, /* 0x59 */218 SPECIAL, /* 0x5a */219 SPECIAL, /* 0x5b */220 SPECIAL, /* 0x5c */221 SPECIAL, /* 0x5d */222 SPECIAL, /* 0x5e */223 SPECIAL, /* 0x5f */224 SPECIAL, /* 0x60 */225 SPECIAL, /* 0x61 */226 SPECIAL, /* 0x62 */227 SPECIAL, /* 0x63 */228 SPECIAL, /* 0x64 */229 SPECIAL, /* 0x65 */230 SPECIAL, /* 0x66 */231 SPECIAL, /* 0x67 */232 SPECIAL, /* 0x68 */233 SPECIAL, /* 0x69 */234 SPECIAL, /* 0x6a */235 SPECIAL, /* 0x6b */236 SPECIAL, /* 0x6c */237 SPECIAL, /* 0x6d */238 SPECIAL, /* 0x6e */239 SPECIAL, /* 0x6f */240 SPECIAL, /* 0x70 */241 SPECIAL, /* 0x71 */242 SPECIAL, /* 0x72 */243 SPECIAL, /* 0x73 */244 SPECIAL, /* 0x74 */245 SPECIAL, /* 0x75 */246 SPECIAL, /* 0x76 */247 SPECIAL, /* 0x77 */248 SPECIAL, /* 0x78 */249 SPECIAL, /* 0x79 */250 SPECIAL, /* 0x7a */251 SPECIAL, /* 0x7b */252 SPECIAL, /* 0x7c */253 SPECIAL, /* 0x7d */254 SPECIAL, /* 0x7e */255 SPECIAL, /* 0x7f */256 };257 70 258 71 irq_cmd_t i8042_cmds[2] = { … … 265 78 i8042_cmds 266 79 }; 267 268 static void key_released(keybuffer_t *keybuffer, unsigned char key)269 {270 switch (key) {271 case SC_LSHIFT:272 case SC_RSHIFT:273 keyflags &= ~PRESSED_SHIFT;274 break;275 case SC_CAPSLOCK:276 keyflags &= ~PRESSED_CAPSLOCK;277 if (lockflags & LOCKED_CAPSLOCK)278 lockflags &= ~LOCKED_CAPSLOCK;279 else280 lockflags |= LOCKED_CAPSLOCK;281 break;282 default:283 break;284 }285 }286 287 static void key_pressed(keybuffer_t *keybuffer, unsigned char key)288 {289 int *map = sc_primary_map;290 int ascii = sc_primary_map[key];291 int shift, capslock;292 int letter = 0;293 294 static int esc_count=0;295 296 297 if ( key == SC_ESC ) {298 esc_count++;299 if ( esc_count == 3 ) {300 __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE);301 }302 } else {303 esc_count=0;304 }305 306 307 308 switch (key) {309 case SC_LSHIFT:310 case SC_RSHIFT:311 keyflags |= PRESSED_SHIFT;312 break;313 case SC_CAPSLOCK:314 keyflags |= PRESSED_CAPSLOCK;315 break;316 case SC_SPEC_ESCAPE:317 break;318 /* case SC_LEFTARR:319 if (keybuffer_available(keybuffer) >= 3) {320 keybuffer_push(keybuffer, 0x1b);321 keybuffer_push(keybuffer, 0x5b);322 keybuffer_push(keybuffer, 0x44);323 }324 break;325 case SC_RIGHTARR:326 if (keybuffer_available(keybuffer) >= 3) {327 keybuffer_push(keybuffer, 0x1b);328 keybuffer_push(keybuffer, 0x5b);329 keybuffer_push(keybuffer, 0x43);330 }331 break;332 case SC_UPARR:333 if (keybuffer_available(keybuffer) >= 3) {334 keybuffer_push(keybuffer, 0x1b);335 keybuffer_push(keybuffer, 0x5b);336 keybuffer_push(keybuffer, 0x41);337 }338 break;339 case SC_DOWNARR:340 if (keybuffer_available(keybuffer) >= 3) {341 keybuffer_push(keybuffer, 0x1b);342 keybuffer_push(keybuffer, 0x5b);343 keybuffer_push(keybuffer, 0x42);344 }345 break;346 case SC_HOME:347 if (keybuffer_available(keybuffer) >= 3) {348 keybuffer_push(keybuffer, 0x1b);349 keybuffer_push(keybuffer, 0x4f);350 keybuffer_push(keybuffer, 0x48);351 }352 break;353 case SC_END:354 if (keybuffer_available(keybuffer) >= 3) {355 keybuffer_push(keybuffer, 0x1b);356 keybuffer_push(keybuffer, 0x4f);357 keybuffer_push(keybuffer, 0x46);358 }359 break;360 case SC_DELETE:361 if (keybuffer_available(keybuffer) >= 4) {362 keybuffer_push(keybuffer, 0x1b);363 keybuffer_push(keybuffer, 0x5b);364 keybuffer_push(keybuffer, 0x33);365 keybuffer_push(keybuffer, 0x7e);366 }367 break;368 */ default:369 letter = ((ascii >= 'a') && (ascii <= 'z'));370 capslock = (keyflags & PRESSED_CAPSLOCK) || (lockflags & LOCKED_CAPSLOCK);371 shift = keyflags & PRESSED_SHIFT;372 if (letter && capslock)373 shift = !shift;374 if (shift)375 map = sc_secondary_map;376 if (map[key] != SPECIAL)377 keybuffer_push(keybuffer, map[key]);378 break;379 }380 }381 382 80 383 81 static void wait_ready(void) { … … 462 160 int scan_code = IPC_GET_ARG2(*call); 463 161 464 if (scan_code != IGNORE_CODE) { 465 if (scan_code & KEY_RELEASE) 466 key_released(keybuffer, scan_code ^ KEY_RELEASE); 467 else 468 key_pressed(keybuffer, scan_code); 469 } 162 if (scan_code & KEY_RELEASE) 163 key_released(keybuffer, scan_code ^ KEY_RELEASE); 164 else 165 key_pressed(keybuffer, scan_code); 470 166 return 1; 471 167 } … … 474 170 * @} 475 171 */ 476
Note:
See TracChangeset
for help on using the changeset viewer.