From 8257d42a6c386f48f55fadf75e8eb8ecf92bd549 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Thu, 16 Sep 2021 12:25:15 -0500 Subject: [PATCH] Add support for keyboard interrupts --- src/interrupts.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/interrupts.rs b/src/interrupts.rs index ce7e31c..6fe352d 100644 --- a/src/interrupts.rs +++ b/src/interrupts.rs @@ -16,6 +16,8 @@ lazy_static! { } idt[InterruptIndex::Timer.as_usize()] .set_handler_fn(timer_interrupt_handler); + idt[InterruptIndex::Keyboard.as_usize()] + .set_handler_fn(keyboard_interrupt_handler); idt }; } @@ -42,6 +44,33 @@ extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFr } } +extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) { + use x86_64::instructions::port::Port; + + let mut port = Port::new(0x60); + let scancode: u8 = unsafe { port.read() }; + let key = match scancode { + 0x02 => Some('1'), + 0x03 => Some('2'), + 0x04 => Some('3'), + 0x05 => Some('4'), + 0x06 => Some('5'), + 0x07 => Some('6'), + 0x08 => Some('7'), + 0x09 => Some('8'), + 0x0a => Some('9'), + 0x0b => Some('0'), + _ => None, + }; + if let Some(key) = key { + print!("{}", key); + } + + unsafe { + PICS.lock().notify_end_of_interrupt(InterruptIndex::Keyboard.as_u8()); + } +} + pub const PIC_1_OFFSET: u8 = 32; pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; @@ -50,7 +79,8 @@ pub static PICS: Mutex = Mutex::new(unsafe { ChainedPics::new(PIC_1 #[derive(Debug, Clone, Copy)] #[repr(u8)] pub enum InterruptIndex { - Timer = PIC_1_OFFSET + Timer = PIC_1_OFFSET, + Keyboard } impl InterruptIndex {