|
@@ -3,6 +3,7 @@ use crate::transport::Transport;
|
|
use crate::volatile::{volread, volwrite, ReadOnly, WriteOnly};
|
|
use crate::volatile::{volread, volwrite, ReadOnly, WriteOnly};
|
|
use alloc::boxed::Box;
|
|
use alloc::boxed::Box;
|
|
use bitflags::*;
|
|
use bitflags::*;
|
|
|
|
+use core::ptr::NonNull;
|
|
use log::*;
|
|
use log::*;
|
|
|
|
|
|
/// Virtual human interface devices such as keyboards, mice and tablets.
|
|
/// Virtual human interface devices such as keyboards, mice and tablets.
|
|
@@ -15,6 +16,7 @@ pub struct VirtIOInput<H: Hal, T: Transport> {
|
|
event_queue: VirtQueue<H>,
|
|
event_queue: VirtQueue<H>,
|
|
status_queue: VirtQueue<H>,
|
|
status_queue: VirtQueue<H>,
|
|
event_buf: Box<[InputEvent; 32]>,
|
|
event_buf: Box<[InputEvent; 32]>,
|
|
|
|
+ config: NonNull<Config>,
|
|
}
|
|
}
|
|
|
|
|
|
impl<H: Hal, T: Transport> VirtIOInput<H, T> {
|
|
impl<H: Hal, T: Transport> VirtIOInput<H, T> {
|
|
@@ -29,6 +31,8 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
|
|
(features & supported_features).bits()
|
|
(features & supported_features).bits()
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ let config = transport.config_space::<Config>()?;
|
|
|
|
+
|
|
let mut event_queue = VirtQueue::new(&mut transport, QUEUE_EVENT, QUEUE_SIZE as u16)?;
|
|
let mut event_queue = VirtQueue::new(&mut transport, QUEUE_EVENT, QUEUE_SIZE as u16)?;
|
|
let status_queue = VirtQueue::new(&mut transport, QUEUE_STATUS, QUEUE_SIZE as u16)?;
|
|
let status_queue = VirtQueue::new(&mut transport, QUEUE_STATUS, QUEUE_SIZE as u16)?;
|
|
for (i, event) in event_buf.as_mut().iter_mut().enumerate() {
|
|
for (i, event) in event_buf.as_mut().iter_mut().enumerate() {
|
|
@@ -43,6 +47,7 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
|
|
event_queue,
|
|
event_queue,
|
|
status_queue,
|
|
status_queue,
|
|
event_buf,
|
|
event_buf,
|
|
|
|
+ config,
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
@@ -75,15 +80,14 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
|
|
subsel: u8,
|
|
subsel: u8,
|
|
out: &mut [u8],
|
|
out: &mut [u8],
|
|
) -> u8 {
|
|
) -> u8 {
|
|
- let config = self.transport.config_space().cast::<Config>();
|
|
|
|
let size;
|
|
let size;
|
|
let data;
|
|
let data;
|
|
// Safe because config points to a valid MMIO region for the config space.
|
|
// Safe because config points to a valid MMIO region for the config space.
|
|
unsafe {
|
|
unsafe {
|
|
- volwrite!(config, select, select as u8);
|
|
|
|
- volwrite!(config, subsel, subsel);
|
|
|
|
- size = volread!(config, size);
|
|
|
|
- data = volread!(config, data);
|
|
|
|
|
|
+ volwrite!(self.config, select, select as u8);
|
|
|
|
+ volwrite!(self.config, subsel, subsel);
|
|
|
|
+ size = volread!(self.config, size);
|
|
|
|
+ data = volread!(self.config, data);
|
|
}
|
|
}
|
|
out[..size as usize].copy_from_slice(&data[..size as usize]);
|
|
out[..size as usize].copy_from_slice(&data[..size as usize]);
|
|
size
|
|
size
|