diff options
Diffstat (limited to 'kernel/drivers')
-rw-r--r-- | kernel/drivers/ide.c | 4 | ||||
-rw-r--r-- | kernel/drivers/interrupts.c | 11 | ||||
-rw-r--r-- | kernel/drivers/keyboard.c | 41 | ||||
-rw-r--r-- | kernel/drivers/mouse.c | 147 |
4 files changed, 136 insertions, 67 deletions
diff --git a/kernel/drivers/ide.c b/kernel/drivers/ide.c index f3d0f6e..7dd2416 100644 --- a/kernel/drivers/ide.c +++ b/kernel/drivers/ide.c @@ -106,7 +106,7 @@ u8 ata_read_one(u8 *buf, u32 lba, struct device *dev) return 1; } -u32 ata_read(void *buf, u32 lba, u32 sector_count, struct device *dev) +s32 ata_read(void *buf, u32 lba, u32 sector_count, struct device *dev) { u8 *b = buf; // I love bytes, yk for (u32 i = 0; i < sector_count; i++) { @@ -147,8 +147,10 @@ void ata_probe(void) struct vfs *vfs = malloc(sizeof(*vfs)); vfs->type = VFS_EXT2; vfs->read = ext2_read; + vfs->ready = ext2_ready; vfs->stat = ext2_stat; dev->vfs = vfs; + dev->data = data; vfs_mount(dev, "/"); } } diff --git a/kernel/drivers/interrupts.c b/kernel/drivers/interrupts.c index 29ff55d..4c5c3b7 100644 --- a/kernel/drivers/interrupts.c +++ b/kernel/drivers/interrupts.c @@ -170,11 +170,7 @@ void isr_uninstall_handler(int isr) void isr_handler(struct regs *r) { - // Execute fault handler if exists - void (*handler)(struct regs * r) = isr_routines[r->int_no]; - if (handler) { - handler(r); - } else if (r->int_no <= 32) { + if (r->int_no <= 32) { printf("%s Exception, exiting!\n", isr_exceptions[r->int_no]); struct proc *proc = proc_current(); if (proc) @@ -182,6 +178,11 @@ void isr_handler(struct regs *r) else __asm__ volatile("cli\nhlt"); proc_yield(r); + } else { + // Execute fault handler if exists + void (*handler)(struct regs * r) = isr_routines[r->int_no]; + if (handler) + handler(r); } } diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c index ac97d36..0dd7219 100644 --- a/kernel/drivers/keyboard.c +++ b/kernel/drivers/keyboard.c @@ -2,13 +2,18 @@ #include <cpu.h> #include <def.h> -#include <event.h> +#include <fs.h> #include <interrupts.h> #include <mem.h> #include <print.h> +#include <proc.h> +#include <stack.h> +#include <str.h> #include <sys.h> static struct event_keyboard *event = NULL; +static struct stack *queue = NULL; +static u32 dev_id = 0; static int state = 0; static int merged = 0; @@ -34,10 +39,12 @@ void keyboard_handler() event->magic = KEYBOARD_MAGIC; event->press = (scancode & 0x80) == 0; event->scancode = event->press ? scancode : scancode & ~0x80; - event_trigger(EVENT_KEYBOARD, event); + stack_push_bot(queue, event); state = 0; merged = 0; + + proc_enable_waiting(dev_id); } void keyboard_acknowledge(void) @@ -53,8 +60,38 @@ void keyboard_rate(void) outb(0x60, 0x0); // Rate{00000} Delay{00} 0 } +s32 keyboard_read(void *buf, u32 offset, u32 count, struct device *dev) +{ + (void)dev; + if (stack_empty(queue)) + return -1; + + struct event *e = stack_pop(queue); + memcpy(buf, (u8 *)e + offset, count); + return count; +} + +u8 keyboard_ready(void) +{ + return !stack_empty(queue); +} + +void keyboard_reset(void) +{ + stack_clear(queue); +} + void keyboard_install(void) { //keyboard_rate(); TODO: Fix keyboard rate? irq_install_handler(1, keyboard_handler); + + queue = stack_new(); + struct device *dev = malloc(sizeof(*dev)); + dev->name = strdup("kbd"); + dev->type = DEV_CHAR; + dev->read = keyboard_read; + dev->ready = keyboard_ready; + device_add(dev); + dev_id = dev->id; } diff --git a/kernel/drivers/mouse.c b/kernel/drivers/mouse.c index d58fbfc..2e9ceae 100644 --- a/kernel/drivers/mouse.c +++ b/kernel/drivers/mouse.c @@ -2,14 +2,18 @@ #include <boot.h> #include <cpu.h> -#include <event.h> +#include <fs.h> #include <interrupts.h> #include <mem.h> #include <print.h> +#include <stack.h> +#include <str.h> #include <sys.h> static char mouse_cycle = 0; static char mouse_byte[3] = { 0 }; +static struct stack *queue = NULL; +static u32 dev_id = 0; static struct event_mouse *event = NULL; @@ -39,7 +43,7 @@ void mouse_handler() event->but1 = mouse_byte[0] & 1; event->but2 = (mouse_byte[0] >> 1) & 1; event->but3 = (mouse_byte[0] >> 2) & 1; - event_trigger(EVENT_MOUSE, event); + stack_push_bot(queue, event); mouse_cycle = 0; break; @@ -48,7 +52,7 @@ void mouse_handler() } } -void mouse_wait(u8 a_type) +void mouse_serial_wait(u8 a_type) { u32 time_out = 100000; if (a_type == 0) { @@ -64,96 +68,121 @@ void mouse_wait(u8 a_type) } } -void mouse_write(u8 a_write) +void mouse_serial_write(u8 a_write) { - mouse_wait(1); + mouse_serial_wait(1); outb(0x64, 0xD4); - mouse_wait(1); + mouse_serial_wait(1); outb(0x60, a_write); } -u8 mouse_read(void) +u8 mouse_serial_read(void) { - mouse_wait(0); + mouse_serial_wait(0); return inb(0x60); } +u8 mouse_ready(void) +{ + return !stack_empty(queue); +} + +s32 mouse_read(void *buf, u32 offset, u32 count, struct device *dev) +{ + (void)dev; + if (stack_empty(queue)) + return -1; + + struct event *e = stack_pop(queue); + memcpy(buf, (u8 *)e + offset, count); + return count; +} + void mouse_install(void) { u8 status; // Enable auxiliary mouse device - mouse_wait(1); + mouse_serial_wait(1); outb(0x64, 0xA8); // Enable interrupts - mouse_wait(1); + mouse_serial_wait(1); outb(0x64, 0x20); - mouse_wait(0); + mouse_serial_wait(0); status = (u8)(inb(0x60) | 3); - mouse_wait(1); + mouse_serial_wait(1); outb(0x64, 0x60); - mouse_wait(1); + mouse_serial_wait(1); outb(0x60, status); // Enable mousewheel - mouse_write(0xF2); - mouse_read(); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(200); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(100); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(80); - mouse_read(); - mouse_write(0xF2); - mouse_read(); - status = (u8)mouse_read(); + mouse_serial_write(0xF2); + mouse_serial_read(); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(200); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(100); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(80); + mouse_serial_read(); + mouse_serial_write(0xF2); + mouse_serial_read(); + status = (u8)mouse_serial_read(); if (status == 3) printf("Scrollwheel support!\n"); // Activate 4th and 5th mouse buttons - mouse_write(0xF2); - mouse_read(); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(200); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(200); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(80); - mouse_read(); - mouse_write(0xF2); - mouse_read(); - status = (u8)mouse_read(); + mouse_serial_write(0xF2); + mouse_serial_read(); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(200); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(200); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(80); + mouse_serial_read(); + mouse_serial_write(0xF2); + mouse_serial_read(); + status = (u8)mouse_serial_read(); if (status == 4) printf("4th and 5th mouse button support!\n"); /* TODO: Fix mouse laggyness - mouse_write(0xE8); - mouse_read(); - mouse_write(0x03); - mouse_read(); - mouse_write(0xF3); - mouse_read(); - mouse_write(200); - mouse_read(); */ + mouse_serial_write(0xE8); + mouse_serial_read(); + mouse_serial_write(0x03); + mouse_serial_read(); + mouse_serial_write(0xF3); + mouse_serial_read(); + mouse_serial_write(200); + mouse_serial_read(); */ // Enable mouse - mouse_write(0xF4); - mouse_read(); + mouse_serial_write(0xF4); + mouse_serial_read(); // Setup the mouse handler irq_install_handler(12, mouse_handler); + + queue = stack_new(); + struct device *dev = malloc(sizeof(*dev)); + dev->name = strdup("mouse"); + dev->type = DEV_CHAR; + dev->read = mouse_read; + dev->ready = mouse_ready; + device_add(dev); + dev_id = dev->id; } |