diff options
author | Anton Kling <anton@kling.gg> | 2024-04-28 22:04:24 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-28 22:11:04 +0200 |
commit | 528031e0e4c17f12b88f6773d31c7a56bf92b956 (patch) | |
tree | deb6abaaafc7cea46efb0f08f99f5b50963898a4 /kernel/drivers/keyboard.c | |
parent | e1271970ae1c36c3bbe1cee215b8cd2f776f723a (diff) |
Kernel: Use ringbuffer for keyboard and mouse events
Diffstat (limited to 'kernel/drivers/keyboard.c')
-rw-r--r-- | kernel/drivers/keyboard.c | 17 |
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); } |