diff options
Diffstat (limited to 'kernel/drivers')
-rw-r--r-- | kernel/drivers/ahci.c | 7 | ||||
-rw-r--r-- | kernel/drivers/keyboard.c | 17 | ||||
-rw-r--r-- | kernel/drivers/mouse.c | 21 | ||||
-rw-r--r-- | kernel/drivers/vbe.c | 10 |
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); } |