x86: fix ps/2 E0-keys not working on some devices
This commit is contained in:
parent
3291df4eeb
commit
aefa7a93fa
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user