aboutsummaryrefslogtreecommitdiff
path: root/kernel/drivers/keyboard.c
diff options
context:
space:
mode:
authorMarvin Borner2021-04-14 13:39:42 +0200
committerMarvin Borner2021-04-14 13:39:42 +0200
commit212582f69dea4c99c292081b15ea526014b9ad44 (patch)
treec4fc1643c5acb8821fc0cfbd1b9c0983a50afe97 /kernel/drivers/keyboard.c
parent9ded3a2bde80eede5fd887812d70c2f834b53c84 (diff)
Even more I/O - started new PS/2 driver
Diffstat (limited to 'kernel/drivers/keyboard.c')
-rw-r--r--kernel/drivers/keyboard.c96
1 files changed, 0 insertions, 96 deletions
diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c
deleted file mode 100644
index 6b4b0fa..0000000
--- a/kernel/drivers/keyboard.c
+++ /dev/null
@@ -1,96 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <cpu.h>
-#include <def.h>
-#include <errno.h>
-#include <fs.h>
-#include <interrupts.h>
-#include <keyboard.h>
-#include <mem.h>
-#include <print.h>
-#include <proc.h>
-#include <stack.h>
-#include <str.h>
-#include <sys.h>
-
-PROTECTED static struct stack *queue = NULL;
-PROTECTED static u32 dev_id = 0;
-
-static struct event_keyboard *event = NULL;
-static int state = 0;
-static int merged = 0;
-static void keyboard_handler(struct regs *r)
-{
- UNUSED(r);
- int scancode = inb(0x60);
-
- // TODO: Support more than two-byte scancodes
- if (scancode == 0xe0) {
- merged = 0xe0;
- state = 1;
- return;
- } else {
- merged = scancode << 8 | merged;
- }
-
- // TODO: "Merge" scancode to linux keycode?
- /* printf("%x %x = %x\n", scancode, state ? 0xe0 : 0, merged); */
-
- event = malloc(sizeof(*event));
- event->magic = KEYBOARD_MAGIC;
- event->press = (scancode & 0x80) == 0;
- event->scancode = event->press ? scancode : scancode & ~0x80;
- stack_push_bot(queue, event);
-
- state = 0;
- merged = 0;
-}
-
-/*static void keyboard_acknowledge(void)
-{
- while (inb(0x60) != 0xfa)
- ;
-}
-
-static void keyboard_rate(void)
-{
- outb(0x60, 0xF3);
- keyboard_acknowledge();
- outb(0x60, 0x0); // Rate{00000} Delay{00} 0
-}*/
-
-static res keyboard_read(void *buf, u32 offset, u32 count, struct vfs_dev *dev)
-{
- UNUSED(dev);
- if (stack_empty(queue))
- return -EINVAL;
-
- struct event_keyboard *e = stack_pop(queue);
- memcpy_user(buf, (u8 *)e + offset, MIN(count, sizeof(*e)));
- free(e);
- return MIN(count, sizeof(*e));
-}
-
-static res keyboard_ready(void)
-{
- return !stack_empty(queue);
-}
-
-CLEAR void keyboard_reset(void)
-{
- stack_clear(queue);
-}
-
-CLEAR void keyboard_install(void)
-{
- //keyboard_rate(); TODO: Fix keyboard rate?
- irq_install_handler(1, keyboard_handler);
-
- queue = stack_new();
- struct vfs_dev *dev = zalloc(sizeof(*dev));
- dev->name = strdup("kbd");
- dev->type = DEV_CHAR;
- dev->read = keyboard_read;
- /* device_add(dev); */
- dev_id = dev->id;
-}