diff --git a/kernel/drivers/ps2/ps2.c b/kernel/drivers/ps2/ps2.c index d72f0e3..6d74894 100644 --- a/kernel/drivers/ps2/ps2.c +++ b/kernel/drivers/ps2/ps2.c @@ -1,8 +1,13 @@ +#include "kbd.h" #include #include +#include +#include + #include +#include static const char scancode_to_ascii[] = { 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', @@ -18,6 +23,8 @@ extern void ps2_write_data(uint8_t); extern void ps2_flush_output_buffer(void); extern void io_wait(void); +void ps2_task(); + static uint8_t read_ccb() { ps2_write_command(CMD_READ_CCB); io_wait(); @@ -48,40 +55,7 @@ static void enable_port_1() { io_wait(); } -int init_ps2() { - ps2_write_command(CMD_DISABLE_P1); - ps2_write_command(CMD_DISABLE_P2); - - ps2_flush_output_buffer(); - - uint8_t ccb = read_ccb(); - ccb = ccb & 0xEC; - write_ccb(ccb); - - int result = perform_self_test(); - if (result != SELF_TEST_SUCCESS) { - return -1; - } - - result = test_port_1(); - if (result != PORT_TEST_SUCCESS) { - return -1; - } - - enable_port_1(); - - ccb = read_ccb(); - ccb |= 0x01; // this enables interrupts for port 1, which we want - write_ccb(ccb); - - return 0; -} - -void ps2_init_kbd(vfs_node_t* dev) { - -} - -char ps2_get_ascii(uint8_t scancode) { +static char ps2_get_ascii(uint8_t scancode) { if (scancode & 0x80) { return 0; } @@ -96,3 +70,59 @@ char ps2_get_ascii(uint8_t scancode) { return 0; } +static ring_buf_t scancode_buf; +static void push_scancode(uint8_t scancode) { + ring_buf_write(&scancode_buf, scancode); +} + +int init_ps2() { + ps2_write_command(CMD_DISABLE_P1); + ps2_write_command(CMD_DISABLE_P2); + + ps2_flush_output_buffer(); + + if (perform_self_test() != SELF_TEST_SUCCESS) { + return 0; + } + + uint8_t ccb = read_ccb(); + ccb &= ~(0x01 | 0x02); // Disable interrupts + ccb |= (1 << 6); // Enable translation + write_ccb(ccb); + + if (test_port_1() != PORT_TEST_SUCCESS) { + return 0; + } + + enable_port_1(); + + ccb = read_ccb(); + ccb |= 0x01; + write_ccb(ccb); + + ps2_flush_output_buffer(); + + // start the tasklet + ring_buf_init(&scancode_buf); + sched_create_ktask(ps2_task); + + return 1; +} + +void ps2_task() { + kprintf("started ps2 task\n"); + while (1) { + char sc; + ring_buf_read(&scancode_buf, &sc); + kprintf("ps2 read\n"); + if (sc == -1) yield(); continue; + kprintf("pushing char\n"); + kbd_push(ps2_get_ascii(sc)); + } +} + +void ps2_handle_scancode(uint8_t scancode) { + push_scancode(scancode); +} + + diff --git a/kernel/drivers/ps2/ps2.h b/kernel/drivers/ps2/ps2.h index fa70701..b98c748 100644 --- a/kernel/drivers/ps2/ps2.h +++ b/kernel/drivers/ps2/ps2.h @@ -24,7 +24,8 @@ int init_ps2(); void ps2_init_kbd(vfs_node_t* dev); uint8_t ps2_read_data(); -char ps2_get_ascii(uint8_t scancode); +void ps2_handle_scancode(uint8_t scancode); + #endif #endif \ No newline at end of file diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 7209d46..793c39d 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -192,16 +192,9 @@ void common_interrupt_handler(intr_regs_t *args) { kpanic(); break; } - case 32: { - - break; - } case 33: { - uint8_t data = ps2_read_data(); - char ascii = ps2_get_ascii(data); - if (ascii != 0) { - kbd_push(ascii); - } + uint8_t data = inb(PS2_DATA); + ps2_handle_scancode(data); send_eoi_master(); break; } diff --git a/kernel/kmain.c b/kernel/kmain.c index e1d9e38..f82ecf6 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -117,17 +117,17 @@ void kmain(multiboot_info* mbi) { init_gdt(); init_idt(); + + init_scheduler(); + init_pic(); init_pit(); + init_ps2(); uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000; init_pmm((void*)mmap_virtual_addr, mbi->mmap_length); init_page_tables(); - disable_interrupts(); - init_scheduler(); - enable_interrupts(); - vfs_node_t* vfs_root = vfs_create_root(); vfs_node_t* initrd_root = load_initrd(); @@ -170,4 +170,5 @@ void kmain(multiboot_info* mbi) { kprintf("starting rockos\n"); load_root_program("/usr/bin/rockterm"); + enable_interrupts(); } diff --git a/kernel/scheduler.c b/kernel/scheduler.c index b83ca16..1a3b1e3 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -200,4 +200,12 @@ process_t* get_task_by_pid(uint32_t pid) { cur = cur->sched_next; } return cur; +} + +void sched_create_ktask(void *addr) { + kprintf("sched_create_ktask called\n"); + process_t* task = kalloc(sizeof(process_t)); + void* cr3 = create_new_pd(); + init_task(task, (uint32_t)addr, (uint32_t)cr3, 0, 0); + add_task(task); } \ No newline at end of file diff --git a/kernel/scheduler.h b/kernel/scheduler.h index dc76995..f65ba4e 100644 --- a/kernel/scheduler.h +++ b/kernel/scheduler.h @@ -14,6 +14,7 @@ process_t* current_task(); process_t* get_task_by_pid(uint32_t pid); int get_next_pid(); +void sched_create_ktask(void* addr); void add_task(process_t* task); void sleep(uint32_t ms); diff --git a/rlibgui/rlibgui.a b/rlibgui/rlibgui.a new file mode 100644 index 0000000..5a10338 Binary files /dev/null and b/rlibgui/rlibgui.a differ