summaryrefslogtreecommitdiff
path: root/kernel/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/drivers')
-rw-r--r--kernel/drivers/ahci.c7
-rw-r--r--kernel/drivers/keyboard.c17
-rw-r--r--kernel/drivers/mouse.c21
-rw-r--r--kernel/drivers/vbe.c10
4 files changed, 30 insertions, 25 deletions
diff --git a/kernel/drivers/ahci.c b/kernel/drivers/ahci.c
index 1fad0a3..34de443 100644
--- a/kernel/drivers/ahci.c
+++ b/kernel/drivers/ahci.c
@@ -485,6 +485,11 @@ int ahci_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
return rc;
}
+int ahci_has_data(vfs_inode_t *inode) {
+ (void)inode;
+ return 1;
+}
+
void add_devfs_drive_file(u8 port) {
static u8 num_drives_added = 0;
char *path = "/sda";
@@ -492,7 +497,7 @@ void add_devfs_drive_file(u8 port) {
num_drives_added++;
vfs_inode_t *inode =
devfs_add_file(path, ahci_read, ahci_write, NULL /*get_vm_object*/,
- 1 /*has_data*/, 0 /*can_write*/, FS_TYPE_BLOCK_DEVICE);
+ ahci_has_data, NULL /*can_write*/, FS_TYPE_BLOCK_DEVICE);
inode->inode_num = port;
}
diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c
index fe4fe16..ab61d58 100644
--- a/kernel/drivers/keyboard.c
+++ b/kernel/drivers/keyboard.c
@@ -155,9 +155,11 @@ void int_keyboard(reg_t *frame) {
ev.mode |= is_alt_down << 1;
ev.mode |= is_ctrl_down << 2;
fifo_object_write((u8 *)&ev, 0, sizeof(ev), keyboard_fifo);
- if (kb_inode) {
- kb_inode->has_data = keyboard_fifo->has_data;
- }
+}
+
+int keyboard_has_data(vfs_inode_t *inode) {
+ (void)inode;
+ return keyboard_fifo->has_data;
}
void install_keyboard(void) {
@@ -168,15 +170,14 @@ void install_keyboard(void) {
int keyboard_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
(void)offset;
- if (0 == fd->inode->has_data) {
+ int rc = fifo_object_read(buffer, 0, len, keyboard_fifo);
+ if (0 == rc) {
return -EAGAIN;
}
- int rc = fifo_object_read(buffer, 0, len, keyboard_fifo);
- fd->inode->has_data = keyboard_fifo->has_data;
return rc;
}
void add_keyboard(void) {
- kb_inode = devfs_add_file("/keyboard", keyboard_read, NULL, NULL, 0, 0,
- FS_TYPE_CHAR_DEVICE);
+ kb_inode = devfs_add_file("/keyboard", keyboard_read, NULL, NULL,
+ keyboard_has_data, NULL, FS_TYPE_CHAR_DEVICE);
}
diff --git a/kernel/drivers/mouse.c b/kernel/drivers/mouse.c
index 4b0696a..93e3be6 100644
--- a/kernel/drivers/mouse.c
+++ b/kernel/drivers/mouse.c
@@ -19,26 +19,25 @@ struct mouse_event {
u8 y;
};
+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) {
- int rc = fifo_object_write(buffer, offset, len, fd->inode->internal_object);
FIFO_FILE *f = fd->inode->internal_object;
- mouse_inode->has_data = f->has_data;
- return rc;
+ return fifo_object_write(buffer, offset, len, f);
}
int fs_mouse_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
FIFO_FILE *f = fd->inode->internal_object;
- if (!mouse_inode->has_data) {
- return 0;
- }
- int rc = fifo_object_read(buffer, offset, len, f);
- mouse_inode->has_data = f->has_data;
- return rc;
+ return fifo_object_read(buffer, offset, len, f);
}
void add_mouse(void) {
- mouse_inode = devfs_add_file("/mouse", fs_mouse_read, fs_mouse_write, NULL, 0,
- 0, FS_TYPE_CHAR_DEVICE);
+ 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);
diff --git a/kernel/drivers/vbe.c b/kernel/drivers/vbe.c
index e67a3d9..c0603d6 100644
--- a/kernel/drivers/vbe.c
+++ b/kernel/drivers/vbe.c
@@ -37,7 +37,7 @@ int display_driver_init(multiboot_info_t *mbi) {
framebuffer_physical = mbi->framebuffer_addr;
framebuffer =
mmu_map_frames((void *)(u32)mbi->framebuffer_addr, framebuffer_size);
- if(!framebuffer) {
+ if (!framebuffer) {
return 0;
}
@@ -68,8 +68,8 @@ int display_info_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
}
void add_vbe_device(void) {
- devfs_add_file("/vbe", NULL, NULL, vbe_get_vm_object, 1, 1,
- FS_TYPE_BLOCK_DEVICE);
- devfs_add_file("/display_info", display_info_read, NULL, NULL, 1, 0,
- FS_TYPE_BLOCK_DEVICE);
+ devfs_add_file("/vbe", NULL, NULL, vbe_get_vm_object, always_has_data,
+ always_can_write, FS_TYPE_BLOCK_DEVICE);
+ devfs_add_file("/display_info", display_info_read, NULL, NULL,
+ always_has_data, NULL, FS_TYPE_BLOCK_DEVICE);
}