mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-11 06:16:49 +00:00
Remove virtio-input-decoder dependence
This commit is contained in:
parent
2437fba0d9
commit
2d605e04d1
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -189,15 +189,16 @@ dependencies = [
|
|||||||
name = "aster-input"
|
name = "aster-input"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ascii",
|
||||||
"aster-frame",
|
"aster-frame",
|
||||||
"aster-rights",
|
"aster-rights",
|
||||||
"aster-util",
|
"aster-util",
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"component",
|
"component",
|
||||||
|
"int-to-c-enum",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"spin 0.9.8",
|
"spin 0.9.8",
|
||||||
"virtio-input-decoder",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -342,7 +343,6 @@ dependencies = [
|
|||||||
"smoltcp",
|
"smoltcp",
|
||||||
"spin 0.9.8",
|
"spin 0.9.8",
|
||||||
"typeflags-util",
|
"typeflags-util",
|
||||||
"virtio-input-decoder",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -12,8 +12,9 @@ aster-frame = { path = "../../../framework/aster-frame" }
|
|||||||
aster-util = { path = "../../libs/aster-util" }
|
aster-util = { path = "../../libs/aster-util" }
|
||||||
aster-rights = { path = "../../libs/aster-rights" }
|
aster-rights = { path = "../../libs/aster-rights" }
|
||||||
component = { path = "../../libs/comp-sys/component" }
|
component = { path = "../../libs/comp-sys/component" }
|
||||||
virtio-input-decoder = "0.1.4"
|
int-to-c-enum = { path = "../../libs/int-to-c-enum" }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
ascii = { version = "1.1", default-features = false, features = ["alloc"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
||||||
|
128
services/comps/input/src/key.rs
Normal file
128
services/comps/input/src/key.rs
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
use int_to_c_enum::TryFromInt;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, TryFromInt)]
|
||||||
|
#[repr(u16)]
|
||||||
|
pub enum Key {
|
||||||
|
Reserved = 0,
|
||||||
|
ESC = 1,
|
||||||
|
One = 2,
|
||||||
|
Two = 3,
|
||||||
|
Three = 4,
|
||||||
|
Four = 5,
|
||||||
|
Five = 6,
|
||||||
|
Six = 7,
|
||||||
|
Seven = 8,
|
||||||
|
Eight = 9,
|
||||||
|
Nine = 10,
|
||||||
|
Zero = 11,
|
||||||
|
Minus = 12,
|
||||||
|
Equal = 13,
|
||||||
|
BackSpace = 14,
|
||||||
|
Tab = 15,
|
||||||
|
Q = 16,
|
||||||
|
W = 17,
|
||||||
|
E = 18,
|
||||||
|
R = 19,
|
||||||
|
T = 20,
|
||||||
|
Y = 21,
|
||||||
|
U = 22,
|
||||||
|
I = 23,
|
||||||
|
O = 24,
|
||||||
|
P = 25,
|
||||||
|
/// Symbol: [
|
||||||
|
LeftBrace = 26,
|
||||||
|
/// Symbol: ]
|
||||||
|
RightBrace = 27,
|
||||||
|
Enter = 28,
|
||||||
|
LeftCtrl = 29,
|
||||||
|
A = 30,
|
||||||
|
S = 31,
|
||||||
|
D = 32,
|
||||||
|
F = 33,
|
||||||
|
G = 34,
|
||||||
|
H = 35,
|
||||||
|
J = 36,
|
||||||
|
K = 37,
|
||||||
|
L = 38,
|
||||||
|
/// Symbol: ;
|
||||||
|
SemiColon = 39,
|
||||||
|
/// Symbol: '
|
||||||
|
Apostrophe = 40,
|
||||||
|
/// Symbol: `
|
||||||
|
Grave = 41,
|
||||||
|
LeftShift = 42,
|
||||||
|
/// Symbol: \
|
||||||
|
BackSlash = 43,
|
||||||
|
Z = 44,
|
||||||
|
X = 45,
|
||||||
|
C = 46,
|
||||||
|
V = 47,
|
||||||
|
B = 48,
|
||||||
|
N = 49,
|
||||||
|
M = 50,
|
||||||
|
Comma = 51,
|
||||||
|
Dot = 52,
|
||||||
|
// Symbol: /
|
||||||
|
Slash = 53,
|
||||||
|
RightShift = 54,
|
||||||
|
/// Keypad asterisk, Symbol: *
|
||||||
|
KpAsterisk = 55,
|
||||||
|
LeftAlt = 56,
|
||||||
|
Space = 57,
|
||||||
|
Capslock = 58,
|
||||||
|
F1 = 59,
|
||||||
|
F2 = 60,
|
||||||
|
F3 = 61,
|
||||||
|
F4 = 62,
|
||||||
|
F5 = 63,
|
||||||
|
F6 = 64,
|
||||||
|
F7 = 65,
|
||||||
|
F8 = 66,
|
||||||
|
F9 = 67,
|
||||||
|
F10 = 68,
|
||||||
|
NumLock = 69,
|
||||||
|
ScrollLock = 70,
|
||||||
|
Kp7 = 71,
|
||||||
|
Kp8 = 72,
|
||||||
|
Kp9 = 73,
|
||||||
|
KpMinus = 74,
|
||||||
|
Kp4 = 75,
|
||||||
|
Kp5 = 76,
|
||||||
|
Kp6 = 77,
|
||||||
|
KpPlus = 78,
|
||||||
|
Kp1 = 79,
|
||||||
|
Kp2 = 80,
|
||||||
|
Kp3 = 81,
|
||||||
|
Kp0 = 82,
|
||||||
|
KpDot = 83,
|
||||||
|
|
||||||
|
F11 = 87,
|
||||||
|
F12 = 88,
|
||||||
|
|
||||||
|
KpEnter = 96,
|
||||||
|
RightCtrl = 97,
|
||||||
|
KpSlash = 98,
|
||||||
|
|
||||||
|
RightAlt = 100,
|
||||||
|
LineFeed = 101,
|
||||||
|
Home = 102,
|
||||||
|
Up = 103,
|
||||||
|
PageUp = 104,
|
||||||
|
Left = 105,
|
||||||
|
Right = 106,
|
||||||
|
End = 107,
|
||||||
|
Down = 108,
|
||||||
|
PageDown = 109,
|
||||||
|
Insert = 110,
|
||||||
|
Delete = 111,
|
||||||
|
|
||||||
|
LeftMeta = 125,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub enum KeyStatus {
|
||||||
|
Pressed,
|
||||||
|
Released,
|
||||||
|
}
|
@ -6,6 +6,9 @@
|
|||||||
#![feature(fn_traits)]
|
#![feature(fn_traits)]
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
|
pub mod key;
|
||||||
|
|
||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
|
|
||||||
@ -18,11 +21,18 @@ use component::ComponentInitError;
|
|||||||
|
|
||||||
use aster_frame::sync::SpinLock;
|
use aster_frame::sync::SpinLock;
|
||||||
use spin::Once;
|
use spin::Once;
|
||||||
use virtio_input_decoder::DecodeType;
|
|
||||||
|
use key::Key;
|
||||||
|
use key::KeyStatus;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub enum InputEvent {
|
||||||
|
KeyBoard(Key, KeyStatus),
|
||||||
|
}
|
||||||
|
|
||||||
pub trait InputDevice: Send + Sync + Any + Debug {
|
pub trait InputDevice: Send + Sync + Any + Debug {
|
||||||
fn handle_irq(&self) -> Option<()>;
|
fn handle_irq(&self) -> Option<()>;
|
||||||
fn register_callbacks(&self, function: &'static (dyn Fn(DecodeType) + Send + Sync));
|
fn register_callbacks(&self, function: &'static (dyn Fn(InputEvent) + Send + Sync));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn register_device(name: String, device: Arc<dyn InputDevice>) {
|
pub fn register_device(name: String, device: Arc<dyn InputDevice>) {
|
||||||
|
@ -8,7 +8,6 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.3"
|
bitflags = "1.3"
|
||||||
spin = "0.9.4"
|
spin = "0.9.4"
|
||||||
virtio-input-decoder = "0.1.4"
|
|
||||||
bytes = { version = "1.4.0", default-features = false }
|
bytes = { version = "1.4.0", default-features = false }
|
||||||
align_ext = { path = "../../../framework/libs/align_ext" }
|
align_ext = { path = "../../../framework/libs/align_ext" }
|
||||||
aster-input = { path = "../input" }
|
aster-input = { path = "../input" }
|
||||||
|
@ -10,13 +10,16 @@ use alloc::{
|
|||||||
vec::Vec,
|
vec::Vec,
|
||||||
};
|
};
|
||||||
use aster_frame::{io_mem::IoMem, offset_of, sync::SpinLock, trap::TrapFrame};
|
use aster_frame::{io_mem::IoMem, offset_of, sync::SpinLock, trap::TrapFrame};
|
||||||
|
use aster_input::{
|
||||||
|
key::{Key, KeyStatus},
|
||||||
|
InputEvent,
|
||||||
|
};
|
||||||
use aster_util::{field_ptr, safe_ptr::SafePtr};
|
use aster_util::{field_ptr, safe_ptr::SafePtr};
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
use log::{debug, info};
|
use log::{debug, info};
|
||||||
use pod::Pod;
|
use pod::Pod;
|
||||||
use virtio_input_decoder::{DecodeType, Decoder};
|
|
||||||
|
|
||||||
use super::{InputConfigSelect, InputEvent, VirtioInputConfig, QUEUE_EVENT, QUEUE_STATUS};
|
use super::{InputConfigSelect, VirtioInputConfig, VirtioInputEvent, QUEUE_EVENT, QUEUE_STATUS};
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
/// The properties of input device.
|
/// The properties of input device.
|
||||||
@ -64,9 +67,9 @@ pub struct InputDevice {
|
|||||||
config: SafePtr<VirtioInputConfig, IoMem>,
|
config: SafePtr<VirtioInputConfig, IoMem>,
|
||||||
event_queue: SpinLock<VirtQueue>,
|
event_queue: SpinLock<VirtQueue>,
|
||||||
status_queue: VirtQueue,
|
status_queue: VirtQueue,
|
||||||
event_buf: SpinLock<Box<[InputEvent; QUEUE_SIZE as usize]>>,
|
event_buf: SpinLock<Box<[VirtioInputEvent; QUEUE_SIZE as usize]>>,
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
callbacks: SpinLock<Vec<Arc<dyn Fn(DecodeType) + Send + Sync + 'static>>>,
|
callbacks: SpinLock<Vec<Arc<dyn Fn(InputEvent) + Send + Sync + 'static>>>,
|
||||||
transport: Box<dyn VirtioTransport>,
|
transport: Box<dyn VirtioTransport>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +77,7 @@ impl InputDevice {
|
|||||||
/// Create a new VirtIO-Input driver.
|
/// Create a new VirtIO-Input driver.
|
||||||
/// msix_vector_left should at least have one element or n elements where n is the virtqueue amount
|
/// msix_vector_left should at least have one element or n elements where n is the virtqueue amount
|
||||||
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
|
pub fn init(mut transport: Box<dyn VirtioTransport>) -> Result<(), VirtioDeviceError> {
|
||||||
let mut event_buf = Box::new([InputEvent::default(); QUEUE_SIZE as usize]);
|
let mut event_buf = Box::new([VirtioInputEvent::default(); QUEUE_SIZE as usize]);
|
||||||
let mut event_queue = VirtQueue::new(QUEUE_EVENT, QUEUE_SIZE, transport.as_mut())
|
let mut event_queue = VirtQueue::new(QUEUE_EVENT, QUEUE_SIZE, transport.as_mut())
|
||||||
.expect("create event virtqueue failed");
|
.expect("create event virtqueue failed");
|
||||||
let status_queue = VirtQueue::new(QUEUE_STATUS, QUEUE_SIZE, transport.as_mut())
|
let status_queue = VirtQueue::new(QUEUE_STATUS, QUEUE_SIZE, transport.as_mut())
|
||||||
@ -139,7 +142,7 @@ impl InputDevice {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Pop the pending event.
|
/// Pop the pending event.
|
||||||
pub fn pop_pending_event(&self) -> Option<InputEvent> {
|
pub fn pop_pending_event(&self) -> Option<VirtioInputEvent> {
|
||||||
let mut lock = self.event_queue.lock();
|
let mut lock = self.event_queue.lock();
|
||||||
if let Ok((token, _)) = lock.pop_used() {
|
if let Ok((token, _)) = lock.pop_used() {
|
||||||
if token >= QUEUE_SIZE {
|
if token >= QUEUE_SIZE {
|
||||||
@ -192,31 +195,29 @@ impl aster_input::InputDevice for InputDevice {
|
|||||||
let Some(event) = self.pop_pending_event() else {
|
let Some(event) = self.pop_pending_event() else {
|
||||||
return Some(());
|
return Some(());
|
||||||
};
|
};
|
||||||
let dtype = match Decoder::decode(
|
match event.event_type {
|
||||||
event.event_type as usize,
|
0 => return Some(()),
|
||||||
event.code as usize,
|
// Keyboard
|
||||||
event.value as usize,
|
1 => {}
|
||||||
) {
|
// TODO: Support mouse device.
|
||||||
Ok(dtype) => dtype,
|
_ => continue,
|
||||||
Err(_) => return Some(()),
|
|
||||||
};
|
|
||||||
let lock = self.callbacks.lock();
|
|
||||||
for callback in lock.iter() {
|
|
||||||
callback.call((dtype,));
|
|
||||||
}
|
}
|
||||||
match dtype {
|
let status = match event.value {
|
||||||
virtio_input_decoder::DecodeType::Key(key, r#type) => {
|
1 => KeyStatus::Pressed,
|
||||||
info!("{:?} {:?}", key, r#type);
|
0 => KeyStatus::Released,
|
||||||
}
|
_ => return Some(()),
|
||||||
virtio_input_decoder::DecodeType::Mouse(mouse) => info!("{:?}", mouse),
|
};
|
||||||
|
let event = InputEvent::KeyBoard(Key::try_from(event.code).unwrap(), status);
|
||||||
|
info!("Input Event:{:?}", event);
|
||||||
|
|
||||||
|
let callbacks = self.callbacks.lock();
|
||||||
|
for callback in callbacks.iter() {
|
||||||
|
callback.call((event,));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn register_callbacks(
|
fn register_callbacks(&self, function: &'static (dyn Fn(InputEvent) + Send + Sync)) {
|
||||||
&self,
|
|
||||||
function: &'static (dyn Fn(virtio_input_decoder::DecodeType) + Send + Sync),
|
|
||||||
) {
|
|
||||||
self.callbacks.lock().push(Arc::new(function))
|
self.callbacks.lock().push(Arc::new(function))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ struct DevIDs {
|
|||||||
/// are filled according to the Linux input layer (evdev) interface.
|
/// are filled according to the Linux input layer (evdev) interface.
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy, Debug, Default, Pod)]
|
#[derive(Clone, Copy, Debug, Default, Pod)]
|
||||||
pub struct InputEvent {
|
pub struct VirtioInputEvent {
|
||||||
/// Event type.
|
/// Event type.
|
||||||
pub event_type: u16,
|
pub event_type: u16,
|
||||||
/// Event code.
|
/// Event code.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user