From bbf33c1f55be78698f9940adf4a77c3bc880f0fe Mon Sep 17 00:00:00 2001 From: Matheus Date: Fri, 30 Sep 2022 20:18:06 -0300 Subject: [PATCH] keyboard: /dev/keyboard --- src/include/kernel/devman.h | 1 + src/sys/keyboard.c | 41 ++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/include/kernel/devman.h b/src/include/kernel/devman.h index e387307c..8b132dee 100644 --- a/src/include/kernel/devman.h +++ b/src/include/kernel/devman.h @@ -8,6 +8,7 @@ #define MAJOR_NULL 3 #define MAJOR_FULL 4 #define MAJOR_FB 5 +#define MAJOR_KB 6 typedef struct{ int (*read)(int* error, int minor, void* buff, size_t count, size_t offset); diff --git a/src/sys/keyboard.c b/src/sys/keyboard.c index 512c414a..0c514095 100644 --- a/src/sys/keyboard.c +++ b/src/sys/keyboard.c @@ -1,6 +1,7 @@ #include #include #include +#include #define MAX_KEYBOARD_COUNT 32 @@ -18,6 +19,8 @@ static char asciitableupper[] = { static uint32_t kblist; static keyboard_t keyboards[MAX_KEYBOARD_COUNT]; +static ringbuffer_t devbuff; + void keyboard_packet(int kb, kbpacket_t packet){ switch(packet.keycode){ @@ -74,7 +77,7 @@ void keyboard_packet(int kb, kbpacket_t packet){ table = asciitableupper; packet.ascii = table[packet.keycode]; - + ringbuffer_write(&devbuff, &packet, sizeof(kbpacket_t)); ringbuffer_write(&keyboards[kb].buffer, &packet, sizeof(kbpacket_t)); event_signal(&keyboards[kb].event, false); } @@ -124,6 +127,37 @@ int keyboard_getnew(){ } +static int write(int *error, int minor, void* buff, size_t count){*error = EINVAL; return -1;} +static int read(int *error, int minor, void* buff, size_t count, size_t offset){ + count /= sizeof(kbpacket_t); + if(count == 0){ + *error = EINVAL; + return -1; + } + + arch_interrupt_disable(); + + count = ringbuffer_read(&devbuff, buff, count*sizeof(kbpacket_t)); + + arch_interrupt_enable(); + + *error = 0; + return count; + +} + +static int isatty(){ + return ENOTTY; +} + +static int seekable(){ + return 0; +} + +static devcalls calls = { + read, write, isatty, seekable +}; + void keyboard_init(){ for(size_t i = 0; i < MAX_KEYBOARD_COUNT; ++i){ @@ -131,4 +165,9 @@ void keyboard_init(){ _panic("Out of memory", NULL); } + if(ringbuffer_init(&devbuff, sizeof(kbpacket_t)*10)) _panic("Out of memory", NULL); + + if(devman_newdevice("keyboard", TYPE_CHARDEV, MAJOR_KB, 0, &calls)) + _panic("Failed to create keyboard device", 0); + }