From 5ff24ec6dfcb1210db7c4c1f6e78e12d4bbae012 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 25 Jan 2020 01:37:45 +0200 Subject: [PATCH] Fix PS/2 keyboard input --- include/sys/input.h | 1 + sys/amd64/hw/ps2.c | 30 +++++++++++------ sys/input.c | 78 ++++++++++++++++++++++++--------------------- 3 files changed, 63 insertions(+), 46 deletions(-) diff --git a/include/sys/input.h b/include/sys/input.h index 0c564eb..9e03100 100644 --- a/include/sys/input.h +++ b/include/sys/input.h @@ -16,3 +16,4 @@ extern struct chrdev *g_keyboard_tty; #define INPUT_KEY_END 0x85 void input_key(uint8_t byte, uint8_t mods, const char *map0, const char *map1); +void input_scan(uint8_t key); diff --git a/sys/amd64/hw/ps2.c b/sys/amd64/hw/ps2.c index 6779e0d..b429cb4 100644 --- a/sys/amd64/hw/ps2.c +++ b/sys/amd64/hw/ps2.c @@ -43,7 +43,7 @@ static struct chrdev _ps2_mouse = { static const char ps2_key_table_0[128] = { [0x00] = 0, - [0x01] = '\003', + [0x01] = '\033', [0x02] = '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', [0x0F] = '\t', [0x10] = 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', @@ -59,7 +59,7 @@ static const char ps2_key_table_0[128] = { static const char ps2_key_table_1[128] = { [0x00] = 0, - [0x01] = '\003', + [0x01] = '\033', [0x02] = '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', [0x0F] = '\t', [0x10] = 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', @@ -82,7 +82,24 @@ uint32_t ps2_irq_keyboard(void *ctx) { uint8_t key = inb(0x60); if (key == 0xE0) { - kinfo("0xE0 key\n"); + key = inb(0x60); + + switch (key) { + case 0x48: + input_scan(INPUT_KEY_UP); + break; + case 0x50: + input_scan(INPUT_KEY_DOWN); + break; + case 0x4B: + input_scan(INPUT_KEY_LEFT); + break; + case 0x4D: + input_scan(INPUT_KEY_RIGHT); + break; + } + + return IRQ_HANDLED; } if (key == PS2_KEY_LSHIFT_DOWN || key == PS2_KEY_RSHIFT_DOWN) { @@ -102,13 +119,8 @@ uint32_t ps2_irq_keyboard(void *ctx) { ps2_kbd_mods ^= INPUT_MOD_CAPS; } - if (!g_keyboard_tty) { - // No TTY to send strokes to - return IRQ_HANDLED; - } - if (!(key & 0x80)) { - input_key(ps2_kbd_mods, key, ps2_key_table_0, ps2_key_table_1); + input_key(key, ps2_kbd_mods, ps2_key_table_0, ps2_key_table_1); } return IRQ_HANDLED; diff --git a/sys/input.c b/sys/input.c index c5c47e1..669a555 100644 --- a/sys/input.c +++ b/sys/input.c @@ -5,6 +5,46 @@ struct chrdev *g_keyboard_tty = 0; +void input_scan(uint8_t c) { + switch (c) { + case INPUT_KEY_UP: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'A'); + break; + case INPUT_KEY_DOWN: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'B'); + break; + case INPUT_KEY_RIGHT: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'C'); + break; + case INPUT_KEY_LEFT: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'D'); + break; + case INPUT_KEY_HOME: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'H'); + break; + case INPUT_KEY_END: + tty_data_write(g_keyboard_tty, '\033'); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, '['); + tty_data_write(g_keyboard_tty, 'F'); + break; + default: + kdebug("Ignoring unhandled key: %02x\n", c); + break; + } +} + void input_key(uint8_t key, uint8_t mods, const char *map0, const char *map1) { if (!(mods & INPUT_MOD_CONTROL)) { const char *map = (mods & INPUT_MOD_SHIFT) ? map1 : map0; @@ -23,43 +63,7 @@ void input_key(uint8_t key, uint8_t mods, const char *map0, const char *map1) { tty_data_write(g_keyboard_tty, c); } else { // Special keys - switch (c) { - case INPUT_KEY_UP: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'A'); - break; - case INPUT_KEY_DOWN: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'B'); - break; - case INPUT_KEY_RIGHT: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'C'); - break; - case INPUT_KEY_LEFT: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'D'); - break; - case INPUT_KEY_HOME: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'H'); - break; - case INPUT_KEY_END: - tty_data_write(g_keyboard_tty, '\033'); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, '['); - tty_data_write(g_keyboard_tty, 'F'); - break; - default: - kdebug("Ignoring unhandled key: (scan %02x): %02x\n", key, c); - break; - } + input_scan(c); } } else { char c = map0[key];