summaryrefslogtreecommitdiff
path: root/kernel/drivers/keyboard.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-28 22:04:24 +0200
committerAnton Kling <anton@kling.gg>2024-04-28 22:11:04 +0200
commit528031e0e4c17f12b88f6773d31c7a56bf92b956 (patch)
treedeb6abaaafc7cea46efb0f08f99f5b50963898a4 /kernel/drivers/keyboard.c
parente1271970ae1c36c3bbe1cee215b8cd2f776f723a (diff)
Kernel: Use ringbuffer for keyboard and mouse events
Diffstat (limited to 'kernel/drivers/keyboard.c')
-rw-r--r--kernel/drivers/keyboard.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c
index ab61d58..770c8c5 100644
--- a/kernel/drivers/keyboard.c
+++ b/kernel/drivers/keyboard.c
@@ -7,6 +7,7 @@
#include <fs/vfs.h>
#include <sched/scheduler.h>
#include <typedefs.h>
+#include <lib/ringbuffer.h>
#define PS2_REG_DATA 0x60
#define PS2_REG_STATUS 0x64
@@ -27,8 +28,6 @@
u8 kb_scancodes[3] = {0x43, 0x41, 0x3f};
-FIFO_FILE *keyboard_fifo;
-
u8 ascii_table[] = {
'e', '\x1B', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8,
'\t',
@@ -154,24 +153,24 @@ void int_keyboard(reg_t *frame) {
ev.mode |= is_shift_down << 0;
ev.mode |= is_alt_down << 1;
ev.mode |= is_ctrl_down << 2;
- fifo_object_write((u8 *)&ev, 0, sizeof(ev), keyboard_fifo);
+ ringbuffer_write(kb_inode->internal_object, (u8 *)&ev, sizeof(ev));
}
int keyboard_has_data(vfs_inode_t *inode) {
- (void)inode;
- return keyboard_fifo->has_data;
+ const struct ringbuffer *rb = inode->internal_object;
+ return !ringbuffer_isempty(rb);
}
void install_keyboard(void) {
- keyboard_fifo = create_fifo_object();
install_handler(int_keyboard, INT_32_INTERRUPT_GATE(0x3), 0x21);
}
int keyboard_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
(void)offset;
- int rc = fifo_object_read(buffer, 0, len, keyboard_fifo);
- if (0 == rc) {
+ struct ringbuffer *rb = fd->inode->internal_object;
+ u32 rc = ringbuffer_read(rb, buffer, len);
+ if (0 == rc && len > 0) {
return -EAGAIN;
}
return rc;
@@ -180,4 +179,6 @@ int keyboard_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
void add_keyboard(void) {
kb_inode = devfs_add_file("/keyboard", keyboard_read, NULL, NULL,
keyboard_has_data, NULL, FS_TYPE_CHAR_DEVICE);
+ kb_inode->internal_object = kmalloc(sizeof(struct ringbuffer));
+ ringbuffer_init(kb_inode->internal_object, 128);
}