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 | |
parent | e1271970ae1c36c3bbe1cee215b8cd2f776f723a (diff) |
Kernel: Use ringbuffer for keyboard and mouse events
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/drivers/keyboard.c | 17 | ||||
-rw-r--r-- | kernel/drivers/mouse.c | 33 |
2 files changed, 24 insertions, 26 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); } diff --git a/kernel/drivers/mouse.c b/kernel/drivers/mouse.c index af13b44..f9c3d0e 100644 --- a/kernel/drivers/mouse.c +++ b/kernel/drivers/mouse.c @@ -1,5 +1,6 @@ #include <cpu/idt.h> #include <drivers/mouse.h> +#include <errno.h> #include <fs/devfs.h> #include <fs/fifo.h> #include <fs/vfs.h> @@ -11,7 +12,6 @@ u8 mouse_u8[3]; u8 mouse_x = 0; u8 mouse_y = 0; vfs_inode_t *mouse_inode; -vfs_fd_t *mouse_fd; struct mouse_event { u8 buttons; @@ -20,29 +20,25 @@ struct mouse_event { }; int fs_mouse_has_data(vfs_inode_t *inode) { - FIFO_FILE *f = inode->internal_object; - return f->has_data; -} - -int fs_mouse_write(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) { - FIFO_FILE *f = fd->inode->internal_object; - return fifo_object_write(buffer, offset, len, f); + const struct ringbuffer *rb = inode->internal_object; + return !ringbuffer_isempty(rb); } int fs_mouse_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) { - FIFO_FILE *f = fd->inode->internal_object; - return fifo_object_read(buffer, offset, len, f); + struct ringbuffer *rb = fd->inode->internal_object; + u32 rc = ringbuffer_read(rb, buffer, len); + if (0 == rc && len > 0) { + return -EAGAIN; + } + return rc; } void add_mouse(void) { mouse_inode = - devfs_add_file("/mouse", fs_mouse_read, fs_mouse_write, NULL, - fs_mouse_has_data, always_can_write, FS_TYPE_CHAR_DEVICE); - mouse_inode->internal_object = create_fifo_object(); - // Don't look at this - int fd = vfs_open("/dev/mouse", O_RDWR, 0); - mouse_fd = get_vfs_fd(fd, NULL); - relist_remove(¤t_task->file_descriptors, fd); + devfs_add_file("/mouse", fs_mouse_read, NULL, NULL, fs_mouse_has_data, + always_can_write, FS_TYPE_CHAR_DEVICE); + mouse_inode->internal_object = kmalloc(sizeof(struct ringbuffer)); + ringbuffer_init(mouse_inode->internal_object, 4096); } void what(registers_t *r) { @@ -74,7 +70,8 @@ void int_mouse(reg_t *r) { e.buttons = mouse_u8[0]; e.x = mouse_x; e.y = mouse_y; - raw_vfs_pwrite(mouse_fd, &e, sizeof(e), 0); + struct ringbuffer *rb = mouse_inode->internal_object; + ringbuffer_write(rb, (u8 *)&e, sizeof(e)); break; } } |