summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/drivers/keyboard.c17
-rw-r--r--kernel/drivers/mouse.c33
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(&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;
}
}