From 3f946b95b21a52691d8324882b784f2f224e5081 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Thu, 16 Sep 2021 12:34:53 -0500 Subject: [PATCH] Convert scancodes to letters --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/interrupts.rs | 33 ++++++++++++++++----------------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index abfc02b..78178a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,7 @@ version = "0.1.0" dependencies = [ "bootloader", "lazy_static", + "pc-keyboard", "pic8259", "spin", "volatile 0.2.7", @@ -41,6 +42,12 @@ dependencies = [ "spin", ] +[[package]] +name = "pc-keyboard" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6f2d937e3b8d63449b01401e2bae4041bc9dd1129c2e3e0d239407cf6635ac" + [[package]] name = "pic8259" version = "0.10.2" diff --git a/Cargo.toml b/Cargo.toml index 53de89f..fd53aa9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ volatile = "0.2.6" spin = "0.5.2" x86_64 = "0.14.2" pic8259 = "0.10.1" +pc-keyboard = "0.5.0" [dependencies.lazy_static] version = "1.0" diff --git a/src/interrupts.rs b/src/interrupts.rs index 6fe352d..303b5ee 100644 --- a/src/interrupts.rs +++ b/src/interrupts.rs @@ -37,8 +37,6 @@ extern "x86-interrupt" fn double_fault_handler(stack_frame: InterruptStackFrame, } extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) { - print!("."); - unsafe { PICS.lock().notify_end_of_interrupt(InterruptIndex::Timer.as_u8()); } @@ -46,24 +44,25 @@ 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; + use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; + lazy_static! { + static ref KEYBOARD: Mutex> = { + Mutex::new(Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore)) + }; + } + + let mut keyboard = KEYBOARD.lock(); 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); + if let Ok(Some(key_event)) = keyboard.add_byte(scancode) { + if let Some(key) = keyboard.process_keyevent(key_event) { + match key { + DecodedKey::Unicode(character) => print!("{}", character), + DecodedKey::RawKey(key) => print!("{:?}", key), + } + } } unsafe {