From 02abf375d39b5bb4409e48077c6731ec1e83644e Mon Sep 17 00:00:00 2001 From: c0repwn3r Date: Sun, 15 May 2022 19:02:09 -0400 Subject: [PATCH] keyboard --- Makefile | 14 +- bin/shade.bin | Bin 31848 -> 36456 bytes bin/shade.iso | Bin 26613760 -> 26617856 bytes include/shade/platform/drivers/keyboard.h | 6 + include/shade/platform/interrupts/isr.h | 77 +++----- include/shade/platform/interrupts/pic.h | 16 ++ include/shade/version.h | 4 +- obj/kernel/kernel.o | Bin 3360 -> 3928 bytes src/kernel/kernel.c | 17 +- src/kernel/platform/drivers/keyboard.c | 209 ++++++++++++++++++++++ src/kernel/platform/interrupts/isr.c | 24 +++ src/kernel/platform/interrupts/pic.c | 5 + 12 files changed, 311 insertions(+), 61 deletions(-) create mode 100644 include/shade/platform/drivers/keyboard.h create mode 100644 src/kernel/platform/drivers/keyboard.c diff --git a/Makefile b/Makefile index 35e3688..ff90bb0 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,12 @@ default: run .FORCE: -include/shade/version.h: .FORCE +bin/shade.iso: bin/shade.bin + cp bin/shade.bin src/iso/boot/shade.bin + grub-mkrescue src/iso/ -o $@ + rm src/iso/boot/shade.bin + +bin/shade.bin: $(sboot_object_files) $(kernel_object_files) $(libc_object_files) echo "#ifndef VERSION_H" > include/shade/version.h echo "#define VERSION_H" >> include/shade/version.h echo "// This file was autogenerated by the shadeOS build system. It should not be modified." >> include/shade/version.h @@ -53,13 +58,6 @@ include/shade/version.h: .FORCE echo "#define SHADE_OS_COMPILE_DATE \"$(date)\"" >> include/shade/version.h echo "#define SHADE_OS_CODENAME \"$(codename)\"" >> include/shade/version.h echo "#endif" >> include/shade/version.h - -bin/shade.iso: bin/shade.bin - cp bin/shade.bin src/iso/boot/shade.bin - grub-mkrescue src/iso/ -o $@ - rm src/iso/boot/shade.bin - -bin/shade.bin: $(sboot_object_files) $(kernel_object_files) $(libc_object_files) mkdir -p "$(@D)" $(LD) $(LDFLAGS) -n -T $(shade_bin_ldfile) $^ -o $@ grub-file --is-x86-multiboot2 $@ diff --git a/bin/shade.bin b/bin/shade.bin index 67dff2af2b8007707f9cdd00194671b49a62f271..612328a20db83d5b6e550993c57decb6f16f4fc3 100755 GIT binary patch delta 10841 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 delta 7758 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

wu1vu+aF&nj6QDptY{NH&cS+s`V2 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 WXQRVudEs3Xtu?NX!RUL#$S zP|vq}oifSs8nl1=Uy=r@HT^QvTs9g(f`z^jc&Qlhr0+PhU2cym73$+UY$_(aQ;g(p z((&(|VBO|ppd;J^9mT{^2uBWsp&Gkdf~G@}ur&Y8$N^@baodgLfh_$-bQ8ynH~`pZ^drYqBFyT?eNMqrl{~oZ^g}laF%h z19g7|ld4?$yj)1C-%l5#WH*AR7fXmvS>RGV)EX zQz%+Rmj~S!i #include #include +#include #include +#include +#include #include #include #include @@ -37,8 +40,20 @@ void kmain() { kprintf("The full license can be found at /sys/LICENCE on this system or ./LICENCE in the source tree.\n"); pic_remap(0x20, 0x28); + fill_isr(); // ISR must be filled before interrupts are enabled idt_assemble(); - kmsg_ok("Enabled interrupts\n"); + kmsg_ok("Enabled interrupts"); + + init_keyboard(); + + idt_disable_interrupts(); + outb(0x21,0xfd); + outb(0xa1,0xff); + idt_enable_interrupts(); + + kmsg_ok("Enabled keyboard"); + + __asm__ __volatile__ ("int $2"); for (;;) {} } \ No newline at end of file diff --git a/src/kernel/platform/drivers/keyboard.c b/src/kernel/platform/drivers/keyboard.c new file mode 100644 index 0000000..31a4569 --- /dev/null +++ b/src/kernel/platform/drivers/keyboard.c @@ -0,0 +1,209 @@ +#include +#include +#include +#include +#include +#include + +void keyboard_callback(uint8_t vector, uint16_t err) { + // PIC leaves scancode in port 0x60 + uint8_t scancode = inb(0x60); + print_letter(scancode); +} + +void init_keyboard() { + register_interrupt_handler(IRQ1, keyboard_callback); + pic_unmask_irq(IRQ_KEYBOARD); +} + +void print_letter(uint8_t scancode) { + switch (scancode) { + case 0x0: + kprintf("ERROR"); + break; + case 0x1: + kprintf("ESC"); + break; + case 0x2: + kprintf("1"); + break; + case 0x3: + kprintf("2"); + break; + case 0x4: + kprintf("3"); + break; + case 0x5: + kprintf("4"); + break; + case 0x6: + kprintf("5"); + break; + case 0x7: + kprintf("6"); + break; + case 0x8: + kprintf("7"); + break; + case 0x9: + kprintf("8"); + break; + case 0x0A: + kprintf("9"); + break; + case 0x0B: + kprintf("0"); + break; + case 0x0C: + kprintf("-"); + break; + case 0x0D: + kprintf("+"); + break; + case 0x0E: + kprintf("Backspace"); + break; + case 0x0F: + kprintf("Tab"); + break; + case 0x10: + kprintf("Q"); + break; + case 0x11: + kprintf("W"); + break; + case 0x12: + kprintf("E"); + break; + case 0x13: + kprintf("R"); + break; + case 0x14: + kprintf("T"); + break; + case 0x15: + kprintf("Y"); + break; + case 0x16: + kprintf("U"); + break; + case 0x17: + kprintf("I"); + break; + case 0x18: + kprintf("O"); + break; + case 0x19: + kprintf("P"); + break; + case 0x1A: + kprintf("["); + break; + case 0x1B: + kprintf("]"); + break; + case 0x1C: + kprintf("ENTER"); + break; + case 0x1D: + kprintf("LCtrl"); + break; + case 0x1E: + kprintf("A"); + break; + case 0x1F: + kprintf("S"); + break; + case 0x20: + kprintf("D"); + break; + case 0x21: + kprintf("F"); + break; + case 0x22: + kprintf("G"); + break; + case 0x23: + kprintf("H"); + break; + case 0x24: + kprintf("J"); + break; + case 0x25: + kprintf("K"); + break; + case 0x26: + kprintf("L"); + break; + case 0x27: + kprintf(";"); + break; + case 0x28: + kprintf("'"); + break; + case 0x29: + kprintf("`"); + break; + case 0x2A: + kprintf("LShift"); + break; + case 0x2B: + kprintf("\\"); + break; + case 0x2C: + kprintf("Z"); + break; + case 0x2D: + kprintf("X"); + break; + case 0x2E: + kprintf("C"); + break; + case 0x2F: + kprintf("V"); + break; + case 0x30: + kprintf("B"); + break; + case 0x31: + kprintf("N"); + break; + case 0x32: + kprintf("M"); + break; + case 0x33: + kprintf(","); + break; + case 0x34: + kprintf("."); + break; + case 0x35: + kprintf("/"); + break; + case 0x36: + kprintf("Rshift"); + break; + case 0x37: + kprintf("Keypad *"); + break; + case 0x38: + kprintf("LAlt"); + break; + case 0x39: + kprintf("Spc"); + break; + default: + /* 'keuyp' event corresponds to the 'keydown' + 0x80 + * it may still be a scancode we haven't implemented yet, or + * maybe a control/escape sequence */ + /* + if (scancode <= 0x7f) { + kprintf("Unknown key down"); + } else if (scancode <= 0x39 + 0x80) { + kprintf("key up "); + print_letter(scancode - 0x80); + } else kprintf("Unknown key up"); + */ + break; + } +} \ No newline at end of file diff --git a/src/kernel/platform/interrupts/isr.c b/src/kernel/platform/interrupts/isr.c index 2790c63..c94bcf1 100644 --- a/src/kernel/platform/interrupts/isr.c +++ b/src/kernel/platform/interrupts/isr.c @@ -1,11 +1,35 @@ #include #include +#include void exception_handler(uint8_t vector, uint16_t err) { + (*interrupt_handlers[vector])(vector, err); + if (vector >= IRQ_MIN && vector <= IRQ_MAX) { + // needs EOI + pic_send_eoi(vector); + } +} + +int register_interrupt_handler(int vector, void (*handler)(uint8_t, uint16_t)) { + interrupt_handlers[vector] = handler; +} + +int unregister_interrupt_handler(int vector) { + interrupt_handlers[vector] = default_handler; +} + +void default_handler(uint8_t vector, uint16_t err) { kprintf(" %i: cpu: check_exception 0x%x err_code => %x\n", err_count, vector, err); + kprintf(" %i: cpu: no irq for vector 0x%x\n", err_count, vector); err_count++; if (err_count > ERR_MAX) { kprintf("cpu: ierr hit err_max, halt\n"); __asm__ __volatile__("cli; hlt"); } +} + +void fill_isr() { + for (int i = 0; i < 256; i++) { + register_interrupt_handler(i, default_handler); + } } \ No newline at end of file diff --git a/src/kernel/platform/interrupts/pic.c b/src/kernel/platform/interrupts/pic.c index e312c8a..542c913 100644 --- a/src/kernel/platform/interrupts/pic.c +++ b/src/kernel/platform/interrupts/pic.c @@ -1,5 +1,6 @@ #include #include +#include void pic_send_eoi(uint8_t irq) { if (irq >= 8) { @@ -37,6 +38,7 @@ void pic_remap(int offset1, int offset2) { } void pic_mask_irq(uint8_t irq) { + idt_disable_interrupts(); uint16_t port; uint8_t value; @@ -48,9 +50,11 @@ void pic_mask_irq(uint8_t irq) { } value = inb(port) | (1 << irq); outb(port, value); + idt_enable_interrupts(); } void pic_unmask_irq(uint8_t irq) { + idt_disable_interrupts(); uint16_t port; uint8_t value; @@ -62,6 +66,7 @@ void pic_unmask_irq(uint8_t irq) { } value = inb(port) & ~(1 << irq); outb(port, value); + idt_enable_interrupts(); } static uint16_t __pic_get_irq_reg(int ocw3) {