123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /* Minimal polling PC keyboard driver
- * - No interrupt
- * - No LED
- * - No special keys
- *
- * still Enough For Me to type a filename.
- *
- * 2003-07 by SONE Takesh
- * 2004-04 moved by LYH From filo to Etherboot
- * yhlu@tyan.com
- */
- #ifdef CONSOLE_PC_KBD
- #include "etherboot.h"
-
- static char key_map[][128] = {
- {
- "\0\x1b""1234567890-=\b\t"
- "qwertyuiop[]\r\0as"
- "dfghjkl;'`\0\\zxcv"
- "bnm,./\0*\0 \0\0\0\0\0\0"
- "\0\0\0\0\0\0\0""789-456+1"
- "230."
- },{
- "\0\x1b""!@#$%^&*()_+\b\t"
- "QWERTYUIOP{}\r\0AS"
- "DFGHJKL:\"~\0|ZXCV"
- "BNM<>?\0\0\0 \0\0\0\0\0\0"
- "\0\0\0\0\0\0\0""789-456+1"
- "230."
- }
- };
-
- static int cur_scan;
- static unsigned int shift_state;
- #define SHIFT 1
- #define CONTROL 2
- #define CAPS 4
-
- static int get_scancode(void)
- {
- int scan;
-
- if ((inb(0x64) & 1) == 0)
- return 0;
- scan = inb(0x60);
-
- switch (scan) {
- case 0x2a:
- case 0x36:
- shift_state |= SHIFT;
- break;
- case 0xaa:
- case 0xb6:
- shift_state &= ~SHIFT;
- break;
- case 0x1d:
- shift_state |= CONTROL;
- break;
- case 0x9d:
- shift_state &= ~CONTROL;
- break;
- case 0x3a:
- shift_state ^= CAPS;
- break;
- }
-
- if (scan & 0x80)
- return 0; /* ignore break code or 0xe0 etc! */
- return scan;
- }
-
- int kbd_havekey(void)
- {
- if (!cur_scan)
- cur_scan = get_scancode();
- return cur_scan != 0;
- }
-
- int kbd_ischar(void)
- {
- if (!kbd_havekey())
- return 0;
- if (!key_map[shift_state & SHIFT][cur_scan]) {
- cur_scan = 0;
- return 0;
- }
- return 1;
- }
-
- int kbd_getc(void)
- {
- int c;
-
- while (!kbd_ischar())
- ;
- c = key_map[shift_state & SHIFT][cur_scan];
- if (shift_state & (CONTROL | CAPS)) {
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
- if (shift_state & CONTROL)
- c &= 0x1f;
- else if (shift_state & CAPS)
- c ^= ('A' ^ 'a');
- }
- }
- cur_scan = 0;
- return c;
- }
- #endif
|