You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.1 KiB
35 lines
1.1 KiB
use lazy_static::lazy_static;
|
|
use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1};
|
|
use spin::Mutex;
|
|
use x86_64::instructions::port::Port;
|
|
|
|
pub fn init() {
|
|
use crate::arch::interrupt::consts;
|
|
use crate::arch::interrupt::enable_irq;
|
|
enable_irq(consts::Keyboard);
|
|
info!("keyboard: init end");
|
|
}
|
|
|
|
/// Receive character from keyboard
|
|
/// Should be called on every interrupt
|
|
pub fn receive() -> Option<DecodedKey> {
|
|
lazy_static! {
|
|
static ref KEYBOARD: Mutex<Keyboard<layouts::Us104Key, ScancodeSet1>> = Mutex::new(
|
|
Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore)
|
|
);
|
|
}
|
|
|
|
let mut keyboard = KEYBOARD.lock();
|
|
let data_port = Port::<u8>::new(0x60);
|
|
let status_port = Port::<u8>::new(0x64);
|
|
|
|
// Output buffer status = 1
|
|
if unsafe { status_port.read() } & (1 << 0) != 0 {
|
|
let scancode = unsafe { data_port.read() };
|
|
if let Ok(Some(key_event)) = keyboard.add_byte(scancode) {
|
|
return keyboard.process_keyevent(key_event);
|
|
}
|
|
}
|
|
None
|
|
}
|