From 2586acc14f28a18813df9149f13bbf68982c4996 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 7 Sep 2022 16:11:24 -0300 Subject: [PATCH] keyboard: stub --- src/arch/x86_64/main.c | 3 ++ src/include/kernel/keyboard.h | 23 ++++++++++++ src/sys/keyboard.c | 67 +++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 src/include/kernel/keyboard.h create mode 100644 src/sys/keyboard.c diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index bf75c68d..61c6deda 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -17,6 +17,7 @@ #include #include #include +#include void kmain(){ @@ -70,6 +71,8 @@ void kmain(){ smp_init(); + keyboard_init(); + sched_runinit(); _panic("End of kmain()", 0); diff --git a/src/include/kernel/keyboard.h b/src/include/kernel/keyboard.h new file mode 100644 index 00000000..80e698b6 --- /dev/null +++ b/src/include/kernel/keyboard.h @@ -0,0 +1,23 @@ +#ifndef _KEYBOARD_H_INCLUDE +#define _KEYBOARD_H_INCLUDE + +#include +#include + +typedef struct { + ringbuffer_t buffer; + event_t event; + int flags; +} keyboard_t; + +typedef struct { + char ascii; + uintmax_t keycode; + int flags; +} kbpacket_t; + +void keyboard_init(); +int keyboard_getnew(); + + +#endif diff --git a/src/sys/keyboard.c b/src/sys/keyboard.c new file mode 100644 index 00000000..c227659c --- /dev/null +++ b/src/sys/keyboard.c @@ -0,0 +1,67 @@ +#include +#include +#include + +#define MAX_KEYBOARD_COUNT 32 + +static uint32_t kblist; +static keyboard_t keyboards[MAX_KEYBOARD_COUNT]; + +void keyboard_packet(int kb, kbpacket_t packet){ + ringbuffer_write(&keyboards[kb].buffer, &packet, sizeof(kbpacket_t)); + event_signal(&keyboards[kb].event, false); +} + +int keyboard_getandwait(int kb, kbpacket_t* buff){ + for(;;){ + + arch_interrupt_disable(); + + size_t readc = ringbuffer_read(&keyboards[kb].buffer, buff, sizeof(kbpacket_t)); + + arch_interrupt_enable(); + + if(readc) + return 0; + + // interruptible wait + + int ret = event_wait(&keyboards[kb].event, true); + if(ret) + return ret; + } +} + +int keyboard_get(int kb, kbpacket_t* buff){ + + arch_interrupt_disable(); + + int readc = ringbuffer_read(&keyboards[kb].buffer, buff, sizeof(kbpacket_t)); + + arch_interrupt_enable(); + + return readc == 0; + +} + +int keyboard_getnew(){ + + for(size_t i = 0; i < MAX_KEYBOARD_COUNT; ++i){ + if((kblist & (1 << i)) == 0){ + kblist |= 1 << i; + return i; + } + } + + return -1; + +} + +void keyboard_init(){ + + for(size_t i = 0; i < MAX_KEYBOARD_COUNT; ++i){ + if(ringbuffer_init(&keyboards[i].buffer, sizeof(kbpacket_t)*50)) + _panic("Out of memory", NULL); + } + +}