From 04f941a625d225b3edcb5abca860b4047dd73ce8 Mon Sep 17 00:00:00 2001 From: Nigel Date: Fri, 28 May 2021 22:20:13 +0100 Subject: [PATCH] Kernel now responding to keyboard interrupts --- src/kernel/arch/i386/idt/idt.cpp | 52 ++++++++++++++++++++++++++++++-- src/kernel/kernel.cpp | 9 +++--- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/kernel/arch/i386/idt/idt.cpp b/src/kernel/arch/i386/idt/idt.cpp index 165e7a8..b81ace6 100644 --- a/src/kernel/arch/i386/idt/idt.cpp +++ b/src/kernel/arch/i386/idt/idt.cpp @@ -1,5 +1,5 @@ #include "idt.h" - +#include "Scancodes.h" IDT_entry idt_table[256]; IDT_ptr idt_ptr; @@ -17,7 +17,7 @@ void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags){ void irs_handler (registers regs) { kterm_writestring("received interrupt!\n"); - printf(" Interrupt number: %d \n", regs.int_no); + printf("(IRS) Interrupt number: %d \n", regs.int_no); if( regs.int_no == 13){ printf(" Error code: %d \n", regs.err_code); @@ -28,6 +28,52 @@ void irs_handler (registers regs) { +void irq_handler (registers regs) { + + + if ( regs.int_no != 0) { + kterm_writestring("received interrupt!\n"); + printf("(IRQ) Interrupt number: %d \n", regs.int_no); + + } + + if ( regs.int_no == 1 ){ + // Keyboard interrupt !! + + int scan; + register int i; + + // Read scancode + + scan = inb(0x60); + + // Send ack message! + i = inb(0x61); + outb(0x61, i|0x80); + outb(0x61, i); + kterm_writestring("A key was pressed/released\n"); + printf( "Scancode: %x\n", scan); + + + } + + + + outb(0x20, 0x20); // send end of interrupt to master + + if ( regs.int_no > 8 && regs.int_no <= 15) { + outb(0xA0, 0x20); // send end of interrupt to slave + } + + + if( regs.int_no == 13){ + printf(" Error code: %d \n", regs.err_code); + + } + +} + + @@ -39,7 +85,7 @@ void init_idt(){ // TODO: Set everything to zero first - set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8E); + set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8F); set_id_entry(1, (uint32_t) irs1 , 0x08, 0x8E); set_id_entry(2, (uint32_t) irs2 , 0x08, 0x8E); set_id_entry(3, (uint32_t) irs3 , 0x08, 0x8E); diff --git a/src/kernel/kernel.cpp b/src/kernel/kernel.cpp index d27944d..6764040 100644 --- a/src/kernel/kernel.cpp +++ b/src/kernel/kernel.cpp @@ -140,18 +140,17 @@ extern "C" { /** test interrupt handlers **/ - asm volatile ("int $0x03"); + //asm volatile ("int $0x03"); - asm volatile ("int $4"); + //asm volatile ("int $0x04"); - - while (true){ - // Read time indefinetely + //Read time indefinetely read_rtc(); printf( "UTC time: %2d-%2d-%2d %2d:%2d:%2d : (YY-MM-DD h:mm:ss)\r" ,year, month, day, hour, minute, second); delay(1000); } + /** Lets start using the serial port for debugging .. **/ // Hopefully once we go into realmode or do something that