summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kernel/drivers/ps2.c62
-rw-r--r--kernel/include/comus/drivers/ps2.h22
-rw-r--r--kernel/include/comus/input.h36
-rw-r--r--kernel/include/comus/keycodes.h5
-rw-r--r--kernel/include/comus/limits.h4
-rw-r--r--kernel/input.c93
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;
+}