diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/include/ps2_keymaps.h | 28 | ||||
| -rw-r--r-- | drivers/ps2_keymaps.c | 314 | ||||
| -rw-r--r-- | drivers/ps2kbd.c | 62 |
3 files changed, 294 insertions, 110 deletions
diff --git a/drivers/include/ps2_keymaps.h b/drivers/include/ps2_keymaps.h index 0e71cc5..91688c8 100644 --- a/drivers/include/ps2_keymaps.h +++ b/drivers/include/ps2_keymaps.h @@ -1,26 +1,8 @@ #include <stdint.h> -#define PS2_KEY_UNKNOWN 0xFF00 -#define PS2_KEY_ESCAPE 0xFF01 -#define PS2_KEY_NUMLOCK 0xFF02 -#define PS2_KEY_CAPSLOCK 0xFF03 -#define PS2_KEY_SCRLLOCK 0xFF04 -#define PS2_KEY_CONTROL 0xFF05 -#define PS2_KEY_BKSP 0xFF06 -#define PS2_KEY_F1 0xFF07 -#define PS2_KEY_F2 0xFF08 -#define PS2_KEY_F3 0xFF09 -#define PS2_KEY_F4 0xFF0A -#define PS2_KEY_F5 0xFF0B -#define PS2_KEY_F6 0xFF0C -#define PS2_KEY_F7 0xFF0D -#define PS2_KEY_F8 0xFF0E -#define PS2_KEY_F9 0xFF0F -#define PS2_KEY_F10 0xFF10 -#define PS2_KEY_F11 0xFF11 -#define PS2_KEY_F12 0xFF12 -#define PS2_KEY_ALT 0xFF13 -#define PS2_KEY_GUI 0xFF14 -#define PS2_KEY_SHIFT 0xFF15 +#define ERROR_KEY 0x00 +#define PRINTING_KEY 0x01 +#define SPECIAL_KEY 0x02 -extern uint16_t ps2_keymap_set1[128]; +extern uint8_t ps2_scancodes_set1[128]; +extern char ps2_set1_ascii[128]; diff --git a/drivers/ps2_keymaps.c b/drivers/ps2_keymaps.c index 9a92452..cd7fd08 100644 --- a/drivers/ps2_keymaps.c +++ b/drivers/ps2_keymaps.c @@ -1,45 +1,289 @@ #include <stdint.h> #include "ps2_keymaps.h" -uint16_t ps2_keymap_set1[128] = { - PS2_KEY_UNKNOWN, - PS2_KEY_ESCAPE, - '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', PS2_KEY_BKSP, - '\t','q', 'w', 'e', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', - PS2_KEY_CONTROL, - 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', - PS2_KEY_SHIFT, +uint8_t ps2_scancodes_set1[128] = { + ERROR_KEY, /* error */ + SPECIAL_KEY, /* esc */ + PRINTING_KEY, /* 1 */ + PRINTING_KEY, /* 2 */ + PRINTING_KEY, /* 3 */ + PRINTING_KEY, /* 4 */ + PRINTING_KEY, /* 5 */ + PRINTING_KEY, /* 6 */ + PRINTING_KEY, /* 7 */ + PRINTING_KEY, /* 8 */ + PRINTING_KEY, /* 9 */ + PRINTING_KEY, /* 0 */ + PRINTING_KEY, /* - */ + PRINTING_KEY, /* = */ + SPECIAL_KEY, /* backspace */ + PRINTING_KEY, /* tab */ + PRINTING_KEY, /* Q */ + PRINTING_KEY, /* W */ + PRINTING_KEY, /* E */ + PRINTING_KEY, /* R */ + PRINTING_KEY, /* T */ + PRINTING_KEY, /* Y */ + PRINTING_KEY, /* U */ + PRINTING_KEY, /* I */ + PRINTING_KEY, /* O */ + PRINTING_KEY, /* P */ + PRINTING_KEY, /* [ */ + PRINTING_KEY, /* ] */ + PRINTING_KEY, /* enter */ + SPECIAL_KEY, /* left ctrl */ + PRINTING_KEY, /* A */ + PRINTING_KEY, /* S */ + PRINTING_KEY, /* D */ + PRINTING_KEY, /* F */ + PRINTING_KEY, /* G */ + PRINTING_KEY, /* H */ + PRINTING_KEY, /* J */ + PRINTING_KEY, /* K */ + PRINTING_KEY, /* L */ + PRINTING_KEY, /* ; */ + PRINTING_KEY, /* ' */ + PRINTING_KEY, /* ` */ + SPECIAL_KEY, /* left shift */ + PRINTING_KEY, /* \ (backslash) */ + PRINTING_KEY, /* Z */ + PRINTING_KEY, /* X */ + PRINTING_KEY, /* C */ + PRINTING_KEY, /* V */ + PRINTING_KEY, /* B */ + PRINTING_KEY, /* N */ + PRINTING_KEY, /* M */ + PRINTING_KEY, /* , */ + PRINTING_KEY, /* . */ + PRINTING_KEY, /* / */ + SPECIAL_KEY, /* right shift */ + PRINTING_KEY, /* keypad * */ + SPECIAL_KEY, /* right alt */ + PRINTING_KEY, /* space */ + SPECIAL_KEY, /* caps lock */ + SPECIAL_KEY, /* F1 */ + SPECIAL_KEY, /* F2 */ + SPECIAL_KEY, /* F3 */ + SPECIAL_KEY, /* F4 */ + SPECIAL_KEY, /* F5 */ + SPECIAL_KEY, /* F6 */ + SPECIAL_KEY, /* F7 */ + SPECIAL_KEY, /* F8 */ + SPECIAL_KEY, /* F9 */ + SPECIAL_KEY, /* F10 */ + SPECIAL_KEY, /* num lock */ + SPECIAL_KEY, /* scroll lock */ + PRINTING_KEY, /* keypad 7 */ + PRINTING_KEY, /* keypad 8 */ + PRINTING_KEY, /* keypad 9 */ + PRINTING_KEY, /* keypad - */ + PRINTING_KEY, /* keypad 4 */ + PRINTING_KEY, /* keypad 5 */ + PRINTING_KEY, /* keypad 6 */ + PRINTING_KEY, /* keypad + */ + PRINTING_KEY, /* keypad 1 */ + PRINTING_KEY, /* keypad 2 */ + PRINTING_KEY, /* keypad 3 */ + PRINTING_KEY, /* keypad 0 */ + PRINTING_KEY, /* keypad . */ + ERROR_KEY, /* 0x54 */ + ERROR_KEY, /* 0x55 */ + ERROR_KEY, /* 0x56 */ + SPECIAL_KEY, /* F11 */ + SPECIAL_KEY, /* F12 */ + ERROR_KEY, + ERROR_KEY, + ERROR_KEY, + ERROR_KEY +}; + +char ps2_set1_ascii[128] = { + '\0', + '\0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0', + '-', + '=', + '\0', + '\t', + 'q', + 'w', + 'e', + 'r', + 't', + 'y', + 'u', + 'i', + 'o', + 'p', + '[', + ']', + '\n', + '\0', + 'a', + 's', + 'd', + 'f', + 'g', + 'h', + 'j', + 'k', + 'l', + ';', + '\'', + '`', + '\0', '\\', - 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', PS2_KEY_SHIFT, + 'z', + 'x', + 'c', + 'v', + 'b', + 'n', + 'm', + ',', + '.', + '/', + '\0', + '*', + '\0', + ' ', + '\0', /* caps lock */ + '\0', /* F1 */ + '\0', /* F2 */ + '\0', /* F3 */ + '\0', /* F4 */ + '\0', /* F5 */ + '\0', /* F6 */ + '\0', /* F7 */ + '\0', /* F8 */ + '\0', /* F9 */ + '\0', /* F10 */ + '\0', /* num lock */ + '\0', /* scroll lock */ + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', +}; +char ps2_set1_shift[128] = { + '\0', + '\0', + '!', + '@', + '#', + '$', + '%', + '^', + '&', + '*', + '(', + ')', + '_', + '+', + '\0', + '\t', + 'Q', + 'w', + 'E', + 'R', + 'T', + 'Y', + 'U', + 'I', + 'O', + 'P', + '{', + '}', + '\n', + '\0', + 'A', + 'S', + 'D', + 'F', + 'G', + 'H', + 'J', + 'K', + 'L', + ':', + '"', + '~', + '\0', + '|', + 'Z', + 'X', + 'C', + 'V', + 'B', + 'N', + 'M', + '<', + '>', + '?', + '\0', '*', - PS2_KEY_ALT, - ' ', PS2_KEY_CAPSLOCK, - PS2_KEY_F1, - PS2_KEY_F2, - PS2_KEY_F3, - PS2_KEY_F4, - PS2_KEY_F5, - PS2_KEY_F6, - PS2_KEY_F7, - PS2_KEY_F8, - PS2_KEY_F9, - PS2_KEY_F10, - PS2_KEY_NUMLOCK, - PS2_KEY_SCRLLOCK, - '7', '8', '9', + '\0', + ' ', + '\0', /* caps lock */ + '\0', /* F1 */ + '\0', /* F2 */ + '\0', /* F3 */ + '\0', /* F4 */ + '\0', /* F5 */ + '\0', /* F6 */ + '\0', /* F7 */ + '\0', /* F8 */ + '\0', /* F9 */ + '\0', /* F10 */ + '\0', /* num lock */ + '\0', /* scroll lock */ + '7', + '8', + '9', '-', - '4', '5', '6', + '4', + '5', + '6', '+', - '1', '2', '3', + '1', + '2', + '3', '0', '.', - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_F11, - PS2_KEY_F12, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', }; diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c index 30fe762..73b75d1 100644 --- a/drivers/ps2kbd.c +++ b/drivers/ps2kbd.c @@ -61,59 +61,17 @@ static void key_handler(struct regs_t *regs) { (void) regs; uint8_t scancode = inb(0x60); - switch(scancode) + if(scancode == 0xE0) + /* extended, forget it! */ + return; + /* AND by 0x7F to get in the range of [0,128) */ + int type = ps2_scancodes_set1[scancode & 0x7F]; + int release = (scancode & 0x80) >> 7; + switch(type) { - case 0x2A: - ps2_shift = 1; - break; - case 0xAA: - ps2_shift = 0; - break; - case 0x1D: - ps2_ctrl = 1; - break; - case 0x9D: - ps2_ctrl = 0; - break; - case 0x38: - ps2_alt = 1; - break; - case 0xB8: - ps2_alt = 0; - break; - case 0xE0: - { - uint8_t spec = inb(0x60); - switch(spec) - { - case 0x48: - ps2_arrowkeys[IDX_UP] = 1; - break; - case 0x4B: - ps2_arrowkeys[IDX_LEFT] = 1; - break; - case 0x50: - ps2_arrowkeys[IDX_DOWN] = 1; - break; - case 0x4D: - ps2_arrowkeys[IDX_RIGHT] = 1; - break; - case 0xC8: - ps2_arrowkeys[IDX_UP] = 0; - break; - case 0xCB: - ps2_arrowkeys[IDX_LEFT] = 0; - break; - case 0xD0: - ps2_arrowkeys[IDX_DOWN] = 0; - break; - case 0xCD: - ps2_arrowkeys[IDX_RIGHT] = 0; - break; - } - break; - } - default: + case PRINTING_KEY: + if(!release) + putchar(ps2_set1_ascii[scancode]); break; } } |