From b1be646e46ab3e6989af4fd882eff4d1b573cd6e Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 27 Mar 2020 13:25:43 +0100 Subject: [PATCH] Add an `add_scancode` function and call it from keyboard interrupt handler --- src/interrupts.rs | 19 +------------------ src/task/keyboard.rs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/interrupts.rs b/src/interrupts.rs index 846447c8..07d8e054 100644 --- a/src/interrupts.rs +++ b/src/interrupts.rs @@ -80,28 +80,11 @@ extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: &mut InterruptSt } extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: &mut InterruptStackFrame) { - use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; - use spin::Mutex; use x86_64::instructions::port::Port; - 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() }; - 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), - } - } - } + crate::task::keyboard::add_scancode(scancode); unsafe { PICS.lock() diff --git a/src/task/keyboard.rs b/src/task/keyboard.rs index 68f0029a..f5910454 100644 --- a/src/task/keyboard.rs +++ b/src/task/keyboard.rs @@ -1,4 +1,18 @@ +use crate::println; use conquer_once::spin::OnceCell; use crossbeam_queue::ArrayQueue; static SCANCODE_QUEUE: OnceCell> = OnceCell::uninit(); + +/// Called by the keyboard interrupt handler +/// +/// Must not block or allocate. +pub(crate) fn add_scancode(scancode: u8) { + if let Ok(queue) = SCANCODE_QUEUE.try_get() { + if let Err(_) = queue.push(scancode) { + println!("WARNING: scancode queue full; dropping keyboard input"); + } + } else { + println!("WARNING: scancode queue uninitialized"); + } +}