feat: simple drawing board GUI
This commit is contained in:
parent
206c09fe86
commit
932ae94711
33 changed files with 191 additions and 669 deletions
|
@ -1,10 +1,10 @@
|
|||
use super::BlockDevice;
|
||||
use crate::drivers::bus::virtio::VirtioHal;
|
||||
use crate::sync::{Condvar, UPIntrFreeCell};
|
||||
use crate::task::schedule;
|
||||
use crate::DEV_NON_BLOCKING_ACCESS;
|
||||
use alloc::collections::BTreeMap;
|
||||
use virtio_drivers::{BlkResp, RespStatus, VirtIOBlk, VirtIOHeader};
|
||||
use crate::drivers::bus::virtio::VirtioHal;
|
||||
|
||||
#[allow(unused)]
|
||||
const VIRTIO0: usize = 0x10008000;
|
||||
|
@ -69,7 +69,9 @@ impl BlockDevice for VirtIOBlock {
|
|||
impl VirtIOBlock {
|
||||
pub fn new() -> Self {
|
||||
let virtio_blk = unsafe {
|
||||
UPIntrFreeCell::new(VirtIOBlk::<VirtioHal>::new(&mut *(VIRTIO0 as *mut VirtIOHeader)).unwrap())
|
||||
UPIntrFreeCell::new(
|
||||
VirtIOBlk::<VirtioHal>::new(&mut *(VIRTIO0 as *mut VirtIOHeader)).unwrap(),
|
||||
)
|
||||
};
|
||||
let mut condvars = BTreeMap::new();
|
||||
let channels = virtio_blk.exclusive_access().virt_queue_size();
|
||||
|
@ -83,4 +85,3 @@ impl VirtIOBlock {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
pub mod virtio;
|
||||
pub mod virtio;
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
use alloc::vec::Vec;
|
||||
use crate::mm::{
|
||||
frame_alloc, frame_dealloc, kernel_token, FrameTracker, PageTable, PhysAddr, PhysPageNum,
|
||||
StepByOne, VirtAddr,
|
||||
};
|
||||
use crate::sync::UPIntrFreeCell;
|
||||
use alloc::vec::Vec;
|
||||
use lazy_static::*;
|
||||
use virtio_drivers::Hal;
|
||||
|
||||
|
@ -49,4 +49,4 @@ impl Hal for VirtioHal {
|
|||
.unwrap()
|
||||
.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,30 +1,31 @@
|
|||
use crate::drivers::bus::virtio::VirtioHal;
|
||||
use crate::sync::UPIntrFreeCell;
|
||||
use alloc::{sync::Arc, vec::Vec};
|
||||
use core::any::Any;
|
||||
use embedded_graphics::pixelcolor::Rgb888;
|
||||
use tinybmp::Bmp;
|
||||
use virtio_drivers::{VirtIOGpu, VirtIOHeader};
|
||||
use crate::drivers::bus::virtio::VirtioHal;
|
||||
const VIRTIO7: usize = 0x10007000;
|
||||
pub trait GPUDevice: Send + Sync + Any {
|
||||
pub trait GpuDevice: Send + Sync + Any {
|
||||
fn update_cursor(&self);
|
||||
fn getfreambuffer(&self) -> &mut [u8];
|
||||
fn get_framebuffer(&self) -> &mut [u8];
|
||||
fn flush(&self);
|
||||
}
|
||||
|
||||
lazy_static::lazy_static!(
|
||||
pub static ref GPU_DEVICE: Arc<dyn GPUDevice> = Arc::new(VirtIOGPU::new());
|
||||
pub static ref GPU_DEVICE: Arc<dyn GpuDevice> = Arc::new(VirtIOGpuWrapper::new());
|
||||
);
|
||||
|
||||
pub struct VirtIOGPU {
|
||||
pub struct VirtIOGpuWrapper {
|
||||
gpu: UPIntrFreeCell<VirtIOGpu<'static, VirtioHal>>,
|
||||
fb: &'static [u8],
|
||||
}
|
||||
static BMP_DATA: &[u8] = include_bytes!("../../assert/mouse.bmp");
|
||||
impl VirtIOGPU {
|
||||
impl VirtIOGpuWrapper {
|
||||
pub fn new() -> Self {
|
||||
unsafe {
|
||||
let mut virtio = VirtIOGpu::<VirtioHal>::new(&mut *(VIRTIO7 as *mut VirtIOHeader)).unwrap();
|
||||
let mut virtio =
|
||||
VirtIOGpu::<VirtioHal>::new(&mut *(VIRTIO7 as *mut VirtIOHeader)).unwrap();
|
||||
|
||||
let fbuffer = virtio.setup_framebuffer().unwrap();
|
||||
let len = fbuffer.len();
|
||||
|
@ -53,11 +54,11 @@ impl VirtIOGPU {
|
|||
}
|
||||
}
|
||||
|
||||
impl GPUDevice for VirtIOGPU {
|
||||
impl GpuDevice for VirtIOGpuWrapper {
|
||||
fn flush(&self) {
|
||||
self.gpu.exclusive_access().flush().unwrap();
|
||||
}
|
||||
fn getfreambuffer(&self) -> &mut [u8] {
|
||||
fn get_framebuffer(&self) -> &mut [u8] {
|
||||
unsafe {
|
||||
let ptr = self.fb.as_ptr() as *const _ as *mut u8;
|
||||
core::slice::from_raw_parts_mut(ptr, self.fb.len())
|
||||
|
|
|
@ -1,74 +1,75 @@
|
|||
use crate::{
|
||||
gui::{Button, Component},
|
||||
sync::UPIntrFreeCell,
|
||||
syscall::PAD,
|
||||
};
|
||||
use alloc::{string::ToString, sync::Arc};
|
||||
use core::any::Any;
|
||||
use embedded_graphics::{
|
||||
prelude::{Point, Size},
|
||||
text::Text,
|
||||
};
|
||||
use virtio_drivers::{VirtIOHeader, VirtIOInput};
|
||||
use crate::drivers::bus::virtio::VirtioHal;
|
||||
use crate::{
|
||||
gui::{move_rect, reset},
|
||||
sync::UPIntrFreeCell,
|
||||
};
|
||||
use alloc::sync::Arc;
|
||||
use core::any::Any;
|
||||
use virtio_drivers::{VirtIOHeader, VirtIOInput};
|
||||
use virtio_input_decoder::{Decoder, Key, KeyType};
|
||||
|
||||
use super::GPU_DEVICE;
|
||||
|
||||
const VIRTIO5: usize = 0x10005000;
|
||||
const VIRTIO6: usize = 0x10006000;
|
||||
|
||||
struct VirtIOINPUT(UPIntrFreeCell<VirtIOInput<'static, VirtioHal>>);
|
||||
struct VirtIOInputWrapper(UPIntrFreeCell<VirtIOInput<'static, VirtioHal>>);
|
||||
|
||||
pub trait INPUTDevice: Send + Sync + Any {
|
||||
pub trait InputDevice: Send + Sync + Any {
|
||||
fn handle_irq(&self);
|
||||
}
|
||||
|
||||
lazy_static::lazy_static!(
|
||||
pub static ref KEYBOARD_DEVICE: Arc<dyn INPUTDevice> = Arc::new(VirtIOINPUT::new(VIRTIO5));
|
||||
pub static ref MOUSE_DEVICE: Arc<dyn INPUTDevice> = Arc::new(VirtIOINPUT::new(VIRTIO6));
|
||||
pub static ref KEYBOARD_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO5));
|
||||
pub static ref MOUSE_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO6));
|
||||
);
|
||||
|
||||
impl VirtIOINPUT {
|
||||
impl VirtIOInputWrapper {
|
||||
pub fn new(addr: usize) -> Self {
|
||||
Self(unsafe {
|
||||
UPIntrFreeCell::new(VirtIOInput::<VirtioHal>::new(&mut *(addr as *mut VirtIOHeader)).unwrap())
|
||||
UPIntrFreeCell::new(
|
||||
VirtIOInput::<VirtioHal>::new(&mut *(addr as *mut VirtIOHeader)).unwrap(),
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl INPUTDevice for VirtIOINPUT {
|
||||
impl InputDevice for VirtIOInputWrapper {
|
||||
fn handle_irq(&self) {
|
||||
let mut input = self.0.exclusive_access();
|
||||
input.ack_interrupt();
|
||||
let event = input.pop_pending_event().unwrap();
|
||||
let dtype = match Decoder::decode(
|
||||
event.event_type as usize,
|
||||
event.code as usize,
|
||||
event.value as usize,
|
||||
) {
|
||||
Ok(dtype) => dtype,
|
||||
Err(_) => return,
|
||||
};
|
||||
match dtype {
|
||||
virtio_input_decoder::DecodeType::Key(key, r#type) => {
|
||||
println!("{:?} {:?}", key, r#type);
|
||||
if r#type == KeyType::Press {
|
||||
let mut inner = PAD.exclusive_access();
|
||||
let a = inner.as_ref().unwrap();
|
||||
match key.to_char() {
|
||||
Ok(mut k) => {
|
||||
if k == '\r' {
|
||||
a.repaint(k.to_string() + "\n")
|
||||
} else {
|
||||
a.repaint(k.to_string())
|
||||
while let Some(event) = input.pop_pending_event() {
|
||||
let dtype = match Decoder::decode(
|
||||
event.event_type as usize,
|
||||
event.code as usize,
|
||||
event.value as usize,
|
||||
) {
|
||||
Ok(dtype) => dtype,
|
||||
Err(_) => break,
|
||||
};
|
||||
match dtype {
|
||||
virtio_input_decoder::DecodeType::Key(key, r#type) => {
|
||||
if r#type == KeyType::Press {
|
||||
match key {
|
||||
Key::C | Key::MouseLeft => {
|
||||
reset();
|
||||
}
|
||||
Key::W => {
|
||||
move_rect(0, -10);
|
||||
}
|
||||
Key::S => {
|
||||
move_rect(0, 10);
|
||||
}
|
||||
Key::A => {
|
||||
move_rect(-10, 0);
|
||||
}
|
||||
Key::D => {
|
||||
move_rect(10, 0);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
Err(_) => {}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
virtio_input_decoder::DecodeType::Mouse(mouse) => println!("{:?}", mouse),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
pub mod block;
|
||||
pub mod bus;
|
||||
pub mod chardev;
|
||||
pub mod gpu;
|
||||
pub mod input;
|
||||
pub mod bus;
|
||||
pub mod plic;
|
||||
|
||||
pub use block::BLOCK_DEVICE;
|
||||
pub use bus::*;
|
||||
pub use chardev::UART;
|
||||
pub use gpu::*;
|
||||
pub use input::*;
|
||||
pub use bus::*;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue