Fix PS/2 keyboard input

This commit is contained in:
Mark
2020-01-25 01:37:45 +02:00
parent 0ab205579f
commit 5ff24ec6df
3 changed files with 63 additions and 46 deletions
+1
View File
@@ -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);
+21 -9
View File
@@ -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;
+41 -37
View File
@@ -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];