summaryrefslogtreecommitdiff
path: root/kernel/drivers/mouse.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/mouse.c
parente1271970ae1c36c3bbe1cee215b8cd2f776f723a (diff)
Kernel: Use ringbuffer for keyboard and mouse events
Diffstat (limited to 'kernel/drivers/mouse.c')
-rw-r--r--kernel/drivers/mouse.c33
1 files changed, 15 insertions, 18 deletions
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(&current_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;
}
}