From 0273c9a8c89f80b997be2e0c301c1b51753ef4f8 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 11 May 2019 14:52:00 +0200 Subject: [PATCH] keyboard irq --- README.md | 1 + run.sh | 5 +++ src/arch/x86/linker.ld | 3 +- src/console.zig | 13 +++--- src/ps2.zig | 92 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 src/ps2.zig diff --git a/README.md b/README.md index 956768a..5002e4b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ slowly porting from rust. ### features - vga frame buffer + - ps2 keyboard driver - interrupts - todo: terminal console - todo: memory mapping diff --git a/run.sh b/run.sh index d7e3ed2..cc61c40 100755 --- a/run.sh +++ b/run.sh @@ -5,6 +5,7 @@ KERNEL=build/bzImage qemu() { start() { + killqemu sudo qemu-system-i386\ -kernel ${KERNEL}\ -gdb tcp::${QEMU_GDB_PORT}\ @@ -18,6 +19,10 @@ qemu() { sudo ${QEMU_MONITOR} } + killqemu() { + sudo pkill -9 qemu + } + reload() { echo "stop" | ${QEMU_MONITOR} &>/dev/null echo "change ide1-cd0 ${KERNEL}" | ${QEMU_MONITOR} &>/dev/null diff --git a/src/arch/x86/linker.ld b/src/arch/x86/linker.ld index 37e3c08..c19f381 100644 --- a/src/arch/x86/linker.ld +++ b/src/arch/x86/linker.ld @@ -7,7 +7,8 @@ SECTIONS { . = 0xb8000; . += 80 * 25 * 2; - . = 1M; + . = 0x100000; + /* ensure that the multiboot header is at the beginning */ .multiboot : { diff --git a/src/console.zig b/src/console.zig index 4488c04..990bb15 100644 --- a/src/console.zig +++ b/src/console.zig @@ -1,15 +1,18 @@ const interrupt = @import("arch/x86/interrupt.zig"); +const x86 = @import("arch/x86/lib/index.zig"); +const ps2 = @import("ps2.zig"); use @import("vga.zig"); var vga = VGA.init(VRAM_ADDR); -pub fn keyboard_handler() void { - vga.writeString("hello"); +pub fn keypress(char: u8) void { + vga.writeChar(char); + if (char == '\n') + vga.writeString("> "); } pub fn initialize() void { vga.clear(); - vga.writeString("zzzzzzzzzzzzzzzz"); - interrupt.registerIRQ(1, keyboard_handler); - vga.writeString("aaaa"); + vga.writeString("> "); + interrupt.registerIRQ(1, ps2.keyboard_handler); } diff --git a/src/ps2.zig b/src/ps2.zig new file mode 100644 index 0000000..7010cce --- /dev/null +++ b/src/ps2.zig @@ -0,0 +1,92 @@ +const x86 = @import("arch/x86/lib/index.zig"); +const console = @import("console.zig"); + +const PS2_DATA = 0x60; +const PS2_STATUS = 0x64; +const KEYMAP_MAX = 59; +const KEYMAP_US = [][2]u8{ + "\x00\x00", + "\x00\x00", //escape + "1!", + "2@", + "3#", + "4$", + "5%", + "6^", + "7&", + "8*", + "9(", + "0)", + "-_", + "=+", + "\x00\x00", //backspace + "\x00\x00", //tab + "qQ", + "wW", + "eE", + "rR", + "tT", + "yY", + "uU", + "iI", + "oO", + "pP", + "[{", + "]}", + "\n\n", + "\x00\x00", //left_control + "aA", + "sS", + "dD", + "fF", + "gG", + "hH", + "jJ", + "kK", + "lL", + ";:", + "'\"", + "`~", + "\x00\x00", //left shift + "\\|", + "zZ", + "xX", + "cC", + "vV", + "bB", + "nN", + "mM", + ",<", + ".>", + "/?", + "\x00\x00", //right shift + "**", + "\x00\x00", //left alt + " ", + "\x00\x00", //capslock +}; + +fn ps2_scancode() u8 { + var scancode: u8 = 0; + while (true) { + if (x86.inb(PS2_DATA) != scancode) { + scancode = x86.inb(PS2_DATA); + if (scancode > 0) + return scancode; + } + } +} + +fn key_isrelease(scancode: u8) bool { + return (scancode & 1 << 7 != 0); +} + +pub fn keyboard_handler() void { + const scancode = ps2_scancode(); + const isrelease = key_isrelease(scancode); + if (isrelease) { + return; + } + const shift = false; + console.keypress(KEYMAP_US[scancode][if (shift) 1 else 0]); +}