diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/drivers/ps2.c | 62 | ||||
-rw-r--r-- | kernel/include/comus/drivers/ps2.h | 22 | ||||
-rw-r--r-- | kernel/include/comus/input.h | 36 | ||||
-rw-r--r-- | kernel/include/comus/keycodes.h | 5 | ||||
-rw-r--r-- | kernel/include/comus/limits.h | 4 | ||||
-rw-r--r-- | kernel/input.c | 93 |
6 files changed, 150 insertions, 72 deletions
diff --git a/kernel/drivers/ps2.c b/kernel/drivers/ps2.c index 5c18b5b..e260f6b 100644 --- a/kernel/drivers/ps2.c +++ b/kernel/drivers/ps2.c @@ -1,5 +1,6 @@ #include <comus/drivers/ps2.h> #include <comus/keycodes.h> +#include <comus/input.h> #include <comus/asm.h> #include <lib.h> @@ -78,22 +79,10 @@ static bool has_kbd = false; static bool has_mouse = false; // kbd -static struct keycode last_keycode = { - .key = KEY_NONE, - .flags = 0, -}; static bool state_keyup = false; static bool state_ext = false; // mouse -static struct mouse_event last_mouse_ev = { - .updated = false, - .lmb = false, - .mmb = false, - .rmb = false, - .relx = 0, - .rely = 0, -}; static uint8_t first_b, second_b, third_b; static uint8_t ps2ctrl_in_status(void) @@ -170,6 +159,7 @@ static int ps2mouse_init(void) void ps2kb_recv(void) { + static struct keycode keycode; uint8_t code; if (!has_kbd) @@ -177,40 +167,28 @@ void ps2kb_recv(void) code = ps2ctrl_in(); if (code == 0x00 || code == 0x0F) { - last_keycode.key = KEY_NONE; - last_keycode.flags = KC_FLAG_ERROR; + keycode.key = KEY_NONE; + keycode.flags = KC_FLAG_ERROR; } else if (code == 0xF0) { state_keyup = true; } else if (code == 0xE0) { state_ext = true; } else if (code <= 0x84) { uint8_t *scancode_table = state_ext ? scancodes_ext : scancodes; - uint8_t keycode = scancode_table[code]; - if (keycode != KEY_NONE) { - last_keycode.key = keycode; - last_keycode.flags = state_keyup ? KC_FLAG_KEY_UP : - KC_FLAG_KEY_DOWN; + uint8_t kcode = scancode_table[code]; + if (kcode != KEY_NONE) { + keycode.key = kcode; + keycode.flags = state_keyup ? KC_FLAG_KEY_UP : KC_FLAG_KEY_DOWN; + keycode_push(&keycode); } state_keyup = false; state_ext = false; } } -struct keycode ps2kb_get(void) -{ - struct keycode code; - - if (!has_kbd) - return last_keycode; - - code = last_keycode; - last_keycode.key = KEY_NONE; - last_keycode.flags = 0; - return code; -} - void ps2mouse_recv(void) { + static struct mouse_event mouse_ev; static uint8_t packet_num = 0; uint8_t code; @@ -231,14 +209,15 @@ void ps2mouse_recv(void) third_b = code; state = first_b; d = second_b; - last_mouse_ev.relx = d - ((state << 4) & 0x100); + mouse_ev.relx = d - ((state << 4) & 0x100); d = third_b; - last_mouse_ev.rely = d - ((state << 3) & 0x100); + mouse_ev.rely = d - ((state << 3) & 0x100); - last_mouse_ev.lmb = first_b & 0x01; - last_mouse_ev.rmb = first_b & 0x02; - last_mouse_ev.mmb = first_b & 0x04; - last_mouse_ev.updated = true; + mouse_ev.lmb = first_b & 0x01; + mouse_ev.rmb = first_b & 0x02; + mouse_ev.mmb = first_b & 0x04; + mouse_ev.updated = true; + mouse_event_push(&mouse_ev); break; } } @@ -247,13 +226,6 @@ void ps2mouse_recv(void) packet_num %= 3; } -struct mouse_event ps2mouse_get(void) -{ - struct mouse_event event = last_mouse_ev; - last_mouse_ev.updated = false; - return event; -} - int ps2_init(void) { uint8_t result; diff --git a/kernel/include/comus/drivers/ps2.h b/kernel/include/comus/drivers/ps2.h index 6e594e9..7634e5f 100644 --- a/kernel/include/comus/drivers/ps2.h +++ b/kernel/include/comus/drivers/ps2.h @@ -9,18 +9,6 @@ #ifndef PS2_H_ #define PS2_H_ -#include <comus/keycodes.h> -#include <stdbool.h> - -struct mouse_event { - bool updated; - bool lmb; - bool rmb; - bool mmb; - int relx; - int rely; -}; - /** * Initalize the ps2 controller */ @@ -32,18 +20,8 @@ int ps2_init(void); void ps2kb_recv(void); /** - * Return last read keycode - */ -struct keycode ps2kb_get(void); - -/** * Recieve input from ps2 mouse during interrupt */ void ps2mouse_recv(void); -/** - * Return last read mouse event - */ -struct mouse_event ps2mouse_get(void); - #endif /* ps2.h */ diff --git a/kernel/include/comus/input.h b/kernel/include/comus/input.h new file mode 100644 index 0000000..b2b3053 --- /dev/null +++ b/kernel/include/comus/input.h @@ -0,0 +1,36 @@ +/** + * @file input.h + */ + +#ifndef INPUT_H_ +#define INPUT_H_ + +#include <comus/keycodes.h> +#include <comus/limits.h> +#include <stdbool.h> +#include <stddef.h> + +struct keycode { + char key; + char flags; +}; + +struct mouse_event { + bool updated; + bool lmb; + bool rmb; + bool mmb; + int relx; + int rely; +}; + +void keycode_push(struct keycode *ev); +int keycode_pop(struct keycode *ev); +size_t keycode_len(void); +char keycode_to_char(struct keycode *ev); + +void mouse_event_push(struct mouse_event *ev); +int mouse_event_pop(struct mouse_event *ev); +size_t mouse_event_len(void); + +#endif /* input.h */ diff --git a/kernel/include/comus/keycodes.h b/kernel/include/comus/keycodes.h index 8930937..ebf296a 100644 --- a/kernel/include/comus/keycodes.h +++ b/kernel/include/comus/keycodes.h @@ -9,11 +9,6 @@ #ifndef KEYCODES_H_ #define KEYCODES_H_ -struct keycode { - char key; - char flags; -}; - #define KC_FLAG_KEY_DOWN 0x01 #define KC_FLAG_KEY_UP 0x02 #define KC_FLAG_ERROR 0x04 diff --git a/kernel/include/comus/limits.h b/kernel/include/comus/limits.h index cadfc93..732873e 100644 --- a/kernel/include/comus/limits.h +++ b/kernel/include/comus/limits.h @@ -25,6 +25,10 @@ /// elf limits #define N_ELF_SEGMENTS 16 +/// input buffer +#define N_KEYCODE 64 +#define N_MOUSEEV 64 + /// length of terminal buffer #define TERM_MAX_WIDTH 1920 #define TERM_MAX_HEIGHT 1080 diff --git a/kernel/input.c b/kernel/input.c new file mode 100644 index 0000000..2073950 --- /dev/null +++ b/kernel/input.c @@ -0,0 +1,93 @@ +#include <comus/input.h> + +struct mouse_event_buf { + struct mouse_event data[N_MOUSEEV]; + size_t start; + size_t end; + size_t len; +}; + +struct keycode_buf { + struct keycode data[N_KEYCODE]; + size_t start; + size_t end; + size_t len; +}; + +static struct keycode_buf keycode_buffer = { + .start = 0, + .end = 0, + .len = 0, +}; + +static struct mouse_event_buf mouse_event_buffer = { + .start = 0, + .end = 0, + .len = 0, +}; + +void keycode_push(struct keycode *ev) +{ + // save keycode + keycode_buffer.data[keycode_buffer.end] = *ev; + + // update pointers + keycode_buffer.end++; + keycode_buffer.end %= N_KEYCODE; + if (keycode_buffer.len < N_KEYCODE) { + keycode_buffer.len++; + } else { + keycode_buffer.start++; + keycode_buffer.start %= N_KEYCODE; + } +} + +int keycode_pop(struct keycode *ev) +{ + if (keycode_buffer.len < 1) + return 1; + + *ev = keycode_buffer.data[keycode_buffer.start]; + keycode_buffer.len--; + keycode_buffer.start++; + keycode_buffer.start %= N_KEYCODE; + return 0; +} + +size_t keycode_len(void) +{ + return keycode_buffer.len; +} + +void mouse_event_push(struct mouse_event *ev) +{ + // save mouse_event + mouse_event_buffer.data[mouse_event_buffer.end] = *ev; + + // update pointers + mouse_event_buffer.end++; + mouse_event_buffer.end %= N_KEYCODE; + if (mouse_event_buffer.len < N_KEYCODE) { + mouse_event_buffer.len++; + } else { + mouse_event_buffer.start++; + mouse_event_buffer.start %= N_KEYCODE; + } +} + +int mouse_event_pop(struct mouse_event *ev) +{ + if (mouse_event_buffer.len < 1) + return 1; + + *ev = mouse_event_buffer.data[mouse_event_buffer.start]; + mouse_event_buffer.len--; + mouse_event_buffer.start++; + mouse_event_buffer.start %= N_KEYCODE; + return 0; +} + +size_t mouse_event_len(void) +{ + return mouse_event_buffer.len; +} |