x86: fix ps/2 E0-keys not working on some devices

This commit is contained in:
Mark Poliakov 2025-03-01 23:26:22 +02:00
parent 3291df4eeb
commit aefa7a93fa

View File

@ -22,6 +22,8 @@ mod codeset;
struct Inner {
command: IoPort<u8>,
data: IoPort<u8>,
e0: bool,
}
/// PS/2 controller driver
@ -79,7 +81,6 @@ impl InterruptHandler for PS2Controller {
fn handle_irq(self: Arc<Self>, _vector: IrqVector) -> bool {
let mut count = 0;
let mut inner = self.inner.lock();
let mut e0 = false;
loop {
let Some(mut scancode) = inner.try_recv() else {
@ -89,7 +90,7 @@ impl InterruptHandler for PS2Controller {
count += 1;
if scancode == 0xE0 {
e0 = true;
inner.e0 = true;
continue;
}
let release = scancode >= 0x80;
@ -98,14 +99,14 @@ impl InterruptHandler for PS2Controller {
scancode -= 0x80;
}
let key = translate(e0, scancode);
let key = translate(inner.e0, scancode);
let event = if release {
KeyboardKeyEvent::Released(key)
} else {
KeyboardKeyEvent::Pressed(key)
};
e0 = false;
inner.e0 = false;
ygg_driver_input::send_event(event);
}
@ -156,6 +157,7 @@ impl PS2Controller {
let inner = Inner {
command: IoPort::new(cmd_port),
data: IoPort::new(data_port),
e0: false,
};
Self {