diff --git a/.gitignore b/.gitignore index f411b223b1031bca9ecbec333eee17f932585ac4..001d2285fefdc6cb37ed0d0b157a59996319a5c4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,6 @@ os/src/link_app.S os/src/linker.ld os/last-* os/.gdb_history +os/virt.out tools/ pushall.sh diff --git a/os/Cargo.toml b/os/Cargo.toml index f4b2d80c28ec0193f81c1441f2219e1c9522333d..2a923c96a7eec77e95ec414527b9e9e0153ea069 100644 --- a/os/Cargo.toml +++ b/os/Cargo.toml @@ -19,5 +19,6 @@ virtio-input-decoder = "0.1.4" embedded-graphics = "0.7.1" tinybmp = "0.3.1" + [profile.release] debug = true diff --git a/os/Makefile b/os/Makefile index b5725d4c834ea1e6690074f7ed30d14ce363ebc3..e02bc814ceeabd51b76ec131d407b886b2c4afc4 100644 --- a/os/Makefile +++ b/os/Makefile @@ -12,6 +12,12 @@ BOARD := qemu SBI ?= rustsbi BOOTLOADER := ../bootloader/$(SBI)-$(BOARD).bin +# GUI +GUI ?= off +ifeq ($(GUI), off) + GUI_OPTION := -display none +endif + # Building mode argument ifeq ($(MODE), release) MODE_ARG := --release @@ -67,27 +73,12 @@ disasm-vim: kernel run: run-inner -gui: build -ifeq ($(BOARD),qemu) - @qemu-system-riscv64 \ - -M 128m \ - -machine virt \ - -bios $(BOOTLOADER) \ - -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) \ - -drive file=$(FS_IMG),if=none,format=raw,id=x0 \ - -device virtio-blk-device,drive=x0 \ - -device virtio-gpu-device \ - -device virtio-keyboard-device \ - -device virtio-mouse-device \ - -serial stdio -endif - run-inner: build @qemu-system-riscv64 \ -M 128m \ -machine virt \ -bios $(BOOTLOADER) \ - -display none \ + $(GUI_OPTION) \ -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) \ -drive file=$(FS_IMG),if=none,format=raw,id=x0 \ -device virtio-blk-device,drive=x0 \ @@ -96,6 +87,10 @@ run-inner: build -device virtio-mouse-device \ -serial stdio +fdt: + @qemu-system-riscv64 -M 128m -machine virt,dumpdtb=virt.out + fdtdump virt.out + debug: build @tmux new-session -d \ "qemu-system-riscv64 -machine virt -nographic -bios $(BOOTLOADER) -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) -s -S" && \ @@ -109,4 +104,4 @@ gdbserver: build gdbclient: @riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234' -.PHONY: build env kernel clean disasm disasm-vim run-inner fs-img gdbserver gdbclient +.PHONY: build env kernel clean disasm disasm-vim run-inner fs-img gdbserver gdbclient fdt diff --git a/os/run-fdt.sh b/os/run-fdt.sh deleted file mode 100755 index c7c886d1431d343341bad97461bce211429e9d69..0000000000000000000000000000000000000000 --- a/os/run-fdt.sh +++ /dev/null @@ -1,11 +0,0 @@ -qemu-system-riscv64 -M 128m -machine virt,dumpdtb=virt.out \ --bios ../bootloader/rustsbi-qemu.bin \ --device loader,file=target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000 \ --drive file=../user/target/riscv64gc-unknown-none-elf/release/fs.img,if=none,format=raw,id=x0 \ --device virtio-blk-device,drive=x0 \ --device virtio-gpu-device \ --device virtio-keyboard-device \ --device virtio-mouse-device \ --serial stdio - -fdtdump virt.out \ No newline at end of file diff --git a/os/run-nodisp.sh b/os/run-nodisp.sh deleted file mode 100755 index 7f2a5bb4b9b31d1d1b850320ace934d66c5c8f1a..0000000000000000000000000000000000000000 --- a/os/run-nodisp.sh +++ /dev/null @@ -1,10 +0,0 @@ -qemu-system-riscv64 -M 128m -machine virt \ --bios ../bootloader/rustsbi-qemu.bin \ --display none \ --device loader,file=target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000 \ --drive file=../user/target/riscv64gc-unknown-none-elf/release/fs.img,if=none,format=raw,id=x0 \ --device virtio-blk-device,drive=x0 \ --device virtio-gpu-device \ --device virtio-keyboard-device \ --device virtio-mouse-device \ --serial stdio diff --git a/os/run.sh b/os/run.sh deleted file mode 100755 index f9e96d6cf2927d3cc6e77580b33aead31bf880b9..0000000000000000000000000000000000000000 --- a/os/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -qemu-system-riscv64 -M 128m -machine virt \ --bios ../bootloader/rustsbi-qemu.bin \ --device loader,file=target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000 \ --drive file=../user/target/riscv64gc-unknown-none-elf/release/fs.img,if=none,format=raw,id=x0 \ --device virtio-blk-device,drive=x0 \ --device virtio-gpu-device \ --device virtio-keyboard-device \ --device virtio-mouse-device \ --serial stdio diff --git a/os/src/boards/qemu.rs b/os/src/boards/qemu.rs index 1dae9f3dcebe1e5b57cb65d0c5552fcfa10a3aa4..ffabff6ae789a273cec4fd7ba67f70cde4afa968 100644 --- a/os/src/boards/qemu.rs +++ b/os/src/boards/qemu.rs @@ -14,6 +14,7 @@ pub const VIRT_PLIC: usize = 0xC00_0000; pub const VIRT_UART: usize = 0x1000_0000; pub const VIRTGPU_XRES: u32 = 1280; +#[allow(unused)] pub const VIRTGPU_YRES: u32 = 800; use crate::drivers::block::BLOCK_DEVICE; @@ -30,7 +31,7 @@ pub fn device_init() { plic.set_threshold(hart_id, supervisor, 0); plic.set_threshold(hart_id, machine, 1); //irq nums: 5 keyboard, 6 mouse, 8 block, 10 uart - for intr_src_id in [5usize, 6, 8 , 10] { + for intr_src_id in [5usize, 6, 8, 10] { plic.enable(hart_id, supervisor, intr_src_id); plic.set_priority(intr_src_id, 1); } diff --git a/os/src/drivers/block/virtio_blk.rs b/os/src/drivers/block/virtio_blk.rs index 2d853e0ccae07205833b4b993e4652250f4e0b71..fb89084d6757114a88901faae971e3ac3266ccda 100644 --- a/os/src/drivers/block/virtio_blk.rs +++ b/os/src/drivers/block/virtio_blk.rs @@ -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::::new(&mut *(VIRTIO0 as *mut VirtIOHeader)).unwrap()) + UPIntrFreeCell::new( + VirtIOBlk::::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 { } } } - diff --git a/os/src/drivers/bus/mod.rs b/os/src/drivers/bus/mod.rs index ab8f38fd1e4a3d4f49282fdfcacdd9efaa2c21f4..d43f3046462bd8edaa1f0f7397026ac80a97b249 100644 --- a/os/src/drivers/bus/mod.rs +++ b/os/src/drivers/bus/mod.rs @@ -1 +1 @@ -pub mod virtio; \ No newline at end of file +pub mod virtio; diff --git a/os/src/drivers/bus/virtio.rs b/os/src/drivers/bus/virtio.rs index fe7bc127aa82f616445ae5cdaf4314745fefd6ba..6871eb8774b3377944c2e648ad965b7e1f3ddc88 100644 --- a/os/src/drivers/bus/virtio.rs +++ b/os/src/drivers/bus/virtio.rs @@ -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 } -} \ No newline at end of file +} diff --git a/os/src/drivers/gpu/mod.rs b/os/src/drivers/gpu/mod.rs index 29028213da194f549fa03e2ecf15b9b2d494bfd9..759633ffa32099f952de77dc3356c5dd54a26180 100644 --- a/os/src/drivers/gpu/mod.rs +++ b/os/src/drivers/gpu/mod.rs @@ -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 = Arc::new(VirtIOGPU::new()); + pub static ref GPU_DEVICE: Arc = Arc::new(VirtIOGpuWrapper::new()); ); -pub struct VirtIOGPU { +pub struct VirtIOGpuWrapper { gpu: UPIntrFreeCell>, 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::::new(&mut *(VIRTIO7 as *mut VirtIOHeader)).unwrap(); + let mut virtio = + VirtIOGpu::::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()) diff --git a/os/src/drivers/input/mod.rs b/os/src/drivers/input/mod.rs index 1f2efc61d80221c9f0f0bcde8a708869506cf20a..cbe89334c8364c361b5beb9c83fab45fc5262838 100644 --- a/os/src/drivers/input/mod.rs +++ b/os/src/drivers/input/mod.rs @@ -1,74 +1,75 @@ +use crate::drivers::bus::virtio::VirtioHal; use crate::{ - gui::{Button, Component}, + gui::{move_rect, reset}, sync::UPIntrFreeCell, - syscall::PAD, }; -use alloc::{string::ToString, sync::Arc}; +use alloc::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 virtio_input_decoder::{Decoder, Key, KeyType}; -use super::GPU_DEVICE; - const VIRTIO5: usize = 0x10005000; const VIRTIO6: usize = 0x10006000; -struct VirtIOINPUT(UPIntrFreeCell>); +struct VirtIOInputWrapper(UPIntrFreeCell>); -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 = Arc::new(VirtIOINPUT::new(VIRTIO5)); - pub static ref MOUSE_DEVICE: Arc = Arc::new(VirtIOINPUT::new(VIRTIO6)); + pub static ref KEYBOARD_DEVICE: Arc = Arc::new(VirtIOInputWrapper::new(VIRTIO5)); + pub static ref MOUSE_DEVICE: Arc = Arc::new(VirtIOInputWrapper::new(VIRTIO6)); ); -impl VirtIOINPUT { +impl VirtIOInputWrapper { pub fn new(addr: usize) -> Self { Self(unsafe { - UPIntrFreeCell::new(VirtIOInput::::new(&mut *(addr as *mut VirtIOHeader)).unwrap()) + UPIntrFreeCell::new( + VirtIOInput::::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), } } } diff --git a/os/src/drivers/mod.rs b/os/src/drivers/mod.rs index a4cbfedd1fe8288e49f5575adecffba13800cc93..57a15f03c24252232f5e2fd74c96e48fc1089429 100644 --- a/os/src/drivers/mod.rs +++ b/os/src/drivers/mod.rs @@ -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::*; diff --git a/os/src/gui/button.rs b/os/src/gui/button.rs deleted file mode 100644 index dee2f7c262b76a7434ef307c274cf99e6d06811b..0000000000000000000000000000000000000000 --- a/os/src/gui/button.rs +++ /dev/null @@ -1,79 +0,0 @@ -use alloc::{string::String, sync::Arc}; -use embedded_graphics::{ - mono_font::{ - ascii::{FONT_10X20, FONT_6X10}, - MonoTextStyle, - }, - pixelcolor::Rgb888, - prelude::{Dimensions, Point, Primitive, RgbColor, Size}, - primitives::{PrimitiveStyle, Rectangle}, - text::{Alignment, Text}, - Drawable, -}; - -use crate::{drivers::GPU_DEVICE, sync::UPIntrFreeCell}; - -use super::{Component, Graphics}; - -pub struct Button { - inner: UPIntrFreeCell, -} - -pub struct ButtonInner { - graphic: Graphics, - text: String, - parent: Option>, -} - -impl Button { - pub fn new(size: Size, point: Point, parent: Option>, text: String) -> Self { - let point = match &parent { - Some(p) => { - let (_, p) = p.bound(); - Point::new(p.x + point.x, p.y + point.y) - } - None => point, - }; - Self { - inner: unsafe { - UPIntrFreeCell::new(ButtonInner { - graphic: Graphics { - size, - point, - drv: GPU_DEVICE.clone(), - }, - text, - parent, - }) - }, - } - } -} - -impl Component for Button { - fn paint(&self) { - let mut inner = self.inner.exclusive_access(); - let text = inner.text.clone(); - Text::with_alignment( - text.as_str(), - inner.graphic.bounding_box().center(), - MonoTextStyle::new(&FONT_10X20, Rgb888::BLACK), - Alignment::Center, - ) - .draw(&mut inner.graphic); - } - - fn add(&self, comp: alloc::sync::Arc) { - unreachable!() - } - - fn bound( - &self, - ) -> ( - embedded_graphics::prelude::Size, - embedded_graphics::prelude::Point, - ) { - let inner = self.inner.exclusive_access(); - (inner.graphic.size, inner.graphic.point) - } -} diff --git a/os/src/gui/graphic.rs b/os/src/gui/graphic.rs index cda752065d10ca4b64da0f9d8a8144e95261abe8..d13ad613c8e9be65b28fb32c50caaf8629d0cba7 100644 --- a/os/src/gui/graphic.rs +++ b/os/src/gui/graphic.rs @@ -5,14 +5,14 @@ use embedded_graphics::{ prelude::{OriginDimensions, Point, RgbColor, Size}, }; -use crate::drivers::{GPUDevice, GPU_DEVICE,}; -use crate::board::{VIRTGPU_XRES, VIRTGPU_YRES}; +use crate::board::VIRTGPU_XRES; +use crate::drivers::{GpuDevice, GPU_DEVICE}; #[derive(Clone)] pub struct Graphics { pub size: Size, pub point: Point, - pub drv: Arc, + pub drv: Arc, } impl Graphics { @@ -23,6 +23,10 @@ impl Graphics { drv: GPU_DEVICE.clone(), } } + pub fn reset(&self) { + let fb = self.drv.get_framebuffer(); + fb.fill(0u8); + } } impl OriginDimensions for Graphics { @@ -40,10 +44,12 @@ impl DrawTarget for Graphics { where I: IntoIterator>, { - let fb = self.drv.getfreambuffer(); + let fb = self.drv.get_framebuffer(); pixels.into_iter().for_each(|px| { - let idx = ((self.point.y + px.0.y) * VIRTGPU_XRES as i32 + self.point.x + px.0.x) as usize * 4; + let idx = ((self.point.y + px.0.y) * VIRTGPU_XRES as i32 + self.point.x + px.0.x) + as usize + * 4; if idx + 2 >= fb.len() { return; } diff --git a/os/src/gui/icon.rs b/os/src/gui/icon.rs deleted file mode 100644 index 8d78470929dfab536797c91dddc903e55c3afa49..0000000000000000000000000000000000000000 --- a/os/src/gui/icon.rs +++ /dev/null @@ -1,79 +0,0 @@ -use alloc::{string::String, sync::Arc, vec::Vec}; -use embedded_graphics::{ - image::Image, - mono_font::{ascii::FONT_10X20, iso_8859_13::FONT_6X12, MonoTextStyle}, - pixelcolor::Rgb888, - prelude::{Point, RgbColor, Size}, - text::Text, - Drawable, -}; -use tinybmp::Bmp; - -use crate::{drivers::GPU_DEVICE, sync::UPIntrFreeCell}; -use crate::board::{VIRTGPU_XRES, VIRTGPU_YRES}; -use super::{Component, Graphics, ImageComp}; - -static FILEICON: &[u8] = include_bytes!("../assert/file.bmp"); - -pub struct IconController { - inner: UPIntrFreeCell, -} - -pub struct IconControllerInner { - files: Vec, - graphic: Graphics, - parent: Option>, -} - -impl IconController { - pub fn new(files: Vec, parent: Option>) -> Self { - IconController { - inner: unsafe { - UPIntrFreeCell::new(IconControllerInner { - files, - graphic: Graphics { - size: Size::new(VIRTGPU_XRES, VIRTGPU_YRES), - point: Point::new(0, 0), - drv: GPU_DEVICE.clone(), - }, - parent, - }) - }, - } - } -} - -impl Component for IconController { - fn paint(&self) { - println!("demo"); - let mut inner = self.inner.exclusive_access(); - let mut x = 10; - let mut y = 10; - let v = inner.files.clone(); - for file in v { - println!("file"); - let bmp = Bmp::::from_slice(FILEICON).unwrap(); - Image::new(&bmp, Point::new(x, y)).draw(&mut inner.graphic); - let text = Text::new( - file.as_str(), - Point::new(x + 20, y + 80), - MonoTextStyle::new(&FONT_10X20, Rgb888::BLACK), - ); - text.draw(&mut inner.graphic); - if y >= 600 { - x = x + 70; - y = 10; - } else { - y = y + 90; - } - } - } - - fn add(&self, comp: Arc) { - todo!() - } - - fn bound(&self) -> (Size, Point) { - todo!() - } -} diff --git a/os/src/gui/image.rs b/os/src/gui/image.rs deleted file mode 100644 index aac5829a512aa9c27b7040212e9a97fb589fb69b..0000000000000000000000000000000000000000 --- a/os/src/gui/image.rs +++ /dev/null @@ -1,80 +0,0 @@ -use alloc::{sync::Arc, vec::Vec}; -use embedded_graphics::{ - image::Image, - pixelcolor::Rgb888, - prelude::{Point, Size}, - Drawable, -}; -use tinybmp::Bmp; - -use crate::{ - drivers::{BLOCK_DEVICE, GPU_DEVICE}, - sync::UPIntrFreeCell, -}; - -use super::{Component, Graphics}; - -pub struct ImageComp { - inner: UPIntrFreeCell, -} - -pub struct ImageInner { - image: &'static [u8], - graphic: Graphics, - parent: Option>, -} - -impl ImageComp { - pub fn new( - size: Size, - point: Point, - v: &'static [u8], - parent: Option>, - ) -> Self { - unsafe { - ImageComp { - inner: UPIntrFreeCell::new(ImageInner { - parent, - image: v, - graphic: Graphics { - size, - point, - drv: GPU_DEVICE.clone(), - }, - }), - } - } - } -} - -impl Component for ImageComp { - fn paint(&self) { - let mut inner = self.inner.exclusive_access(); - let b = unsafe { - let len = inner.image.len(); - let ptr = inner.image.as_ptr() as *const u8; - core::slice::from_raw_parts(ptr, len) - }; - let bmp = Bmp::::from_slice(b).unwrap(); - let point = match &inner.parent { - Some(parent) => { - let (_, point) = parent.bound(); - Point::new( - point.x + inner.graphic.point.x, - point.y + inner.graphic.point.y, - ) - } - None => inner.graphic.point, - }; - Image::new(&bmp, point).draw(&mut inner.graphic); - } - - fn add(&self, comp: alloc::sync::Arc) { - todo!() - } - - fn bound(&self) -> (Size, Point) { - let inner = self.inner.exclusive_access(); - (inner.graphic.size, inner.graphic.point) - } -} diff --git a/os/src/gui/mod.rs b/os/src/gui/mod.rs index f702aa0ff9157298fec044063a3fa4445e4e16bd..766ded827220c8cef7f53d1774a5a1d65c50b79a 100644 --- a/os/src/gui/mod.rs +++ b/os/src/gui/mod.rs @@ -1,22 +1,5 @@ -mod button; mod graphic; -mod icon; -mod image; -mod panel; -mod terminal; +mod paint; -use alloc::sync::Arc; -pub use button::*; -use core::any::Any; -use embedded_graphics::prelude::{Point, Size}; -pub use graphic::*; -pub use icon::*; -pub use image::*; -pub use panel::*; -pub use terminal::*; - -pub trait Component: Send + Sync + Any { - fn paint(&self); - fn add(&self, comp: Arc); - fn bound(&self) -> (Size, Point); -} +use graphic::Graphics; +pub use paint::{init_paint, move_rect, reset}; diff --git a/os/src/gui/paint.rs b/os/src/gui/paint.rs new file mode 100644 index 0000000000000000000000000000000000000000..0cdf60d348259dda3ef91b439121c21b71981da1 --- /dev/null +++ b/os/src/gui/paint.rs @@ -0,0 +1,62 @@ +use super::Graphics; +use crate::sync::UPIntrFreeCell; +use embedded_graphics::pixelcolor::Rgb888; +use embedded_graphics::prelude::{Drawable, Point, RgbColor, Size}; +use embedded_graphics::primitives::Primitive; +use embedded_graphics::primitives::{PrimitiveStyle, Rectangle}; +use lazy_static::*; + +const INIT_X: i32 = 640; +const INIT_Y: i32 = 400; +const RECT_SIZE: u32 = 40; + +pub struct DrawingBoard { + graphics: Graphics, + latest_pos: Point, +} + +impl DrawingBoard { + pub fn new() -> Self { + Self { + graphics: Graphics::new(Size::new(1280, 800), Point::new(0, 0)), + latest_pos: Point::new(INIT_X, INIT_Y), + } + } + fn paint(&mut self) { + Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE)) + .into_styled(PrimitiveStyle::with_stroke(Rgb888::WHITE, 1)) + .draw(&mut self.graphics) + .ok(); + } + pub fn move_rect(&mut self, dx: i32, dy: i32) { + self.latest_pos.x += dx; + self.latest_pos.y += dy; + self.paint(); + } + pub fn reset(&mut self) { + self.latest_pos = Point::new(INIT_X, INIT_Y); + self.graphics.reset(); + } +} + +lazy_static! { + pub static ref DRAWING_BOARD: UPIntrFreeCell = unsafe { UPIntrFreeCell::new(DrawingBoard::new()) }; +} + +pub fn init_paint() { + DRAWING_BOARD.exclusive_session(|ripple| { + ripple.paint(); + }); +} + +pub fn move_rect(dx: i32, dy: i32) { + DRAWING_BOARD.exclusive_session(|ripple| { + ripple.move_rect(dx, dy); + }); +} + +pub fn reset() { + DRAWING_BOARD.exclusive_session(|ripple| { + ripple.reset(); + }); +} diff --git a/os/src/gui/panel.rs b/os/src/gui/panel.rs deleted file mode 100644 index 2af2961aa49c3718501fe6fbbc0cdcc30e0cddbc..0000000000000000000000000000000000000000 --- a/os/src/gui/panel.rs +++ /dev/null @@ -1,66 +0,0 @@ -use alloc::{collections::VecDeque, rc::Weak, sync::Arc}; -use embedded_graphics::{ - pixelcolor::Rgb888, - prelude::{Point, Primitive, RgbColor, Size}, - primitives::{PrimitiveStyle, Rectangle}, - Drawable, -}; - -use crate::{drivers::GPU_DEVICE, sync::UPIntrFreeCell}; - -use super::{Component, Graphics}; - -pub struct Panel { - inner: UPIntrFreeCell, -} -struct PanelInner { - graphic: Graphics, - comps: VecDeque>, -} - -impl Panel { - pub fn new(size: Size, point: Point) -> Self { - Self { - inner: unsafe { - UPIntrFreeCell::new(PanelInner { - graphic: Graphics { - size, - point, - drv: GPU_DEVICE.clone(), - }, - comps: VecDeque::new(), - }) - }, - } - } -} - -impl Component for Panel { - fn paint(&self) { - let mut inner = self.inner.exclusive_access(); - - Rectangle::new(Point::new(0, 0), inner.graphic.size) - .into_styled(PrimitiveStyle::with_fill(Rgb888::WHITE)) - .draw(&mut inner.graphic) - .unwrap(); - - let len = inner.comps.len(); - drop(inner); - for i in 0..len { - let mut inner = self.inner.exclusive_access(); - let comp = Arc::downgrade(&inner.comps[i]); - drop(inner); - comp.upgrade().unwrap().paint(); - } - } - - fn add(&self, comp: alloc::sync::Arc) { - let mut inner = self.inner.exclusive_access(); - inner.comps.push_back(comp); - } - - fn bound(&self) -> (Size, Point) { - let inner = self.inner.exclusive_access(); - (inner.graphic.size, inner.graphic.point) - } -} diff --git a/os/src/gui/terminal.rs b/os/src/gui/terminal.rs deleted file mode 100644 index 8d233f568efd51cbadc1bcafc4bb6597a8c792e7..0000000000000000000000000000000000000000 --- a/os/src/gui/terminal.rs +++ /dev/null @@ -1,105 +0,0 @@ -use alloc::{ - collections::VecDeque, - string::{String, ToString}, - sync::Arc, -}; -use embedded_graphics::{ - mono_font::{ascii::FONT_10X20, MonoTextStyle}, - pixelcolor::Rgb888, - prelude::{Dimensions, Point, Primitive, RgbColor, Size}, - primitives::{PrimitiveStyle, Rectangle}, - text::{Alignment, Text}, - Drawable, -}; - -use crate::{drivers::GPU_DEVICE, sync::UPIntrFreeCell}; - -use super::{button::Button, Component, Graphics, Panel}; - -pub struct Terminal { - inner: UPIntrFreeCell, -} - -pub struct TerminalInner { - pub text: String, - titel: Option, - graphic: Graphics, - comps: VecDeque>, -} - -impl Terminal { - pub fn new( - size: Size, - point: Point, - parent: Option>, - titel: Option, - text: String, - ) -> Self { - Self { - inner: unsafe { - UPIntrFreeCell::new(TerminalInner { - text, - titel, - graphic: Graphics { - size, - point, - drv: GPU_DEVICE.clone(), - }, - comps: VecDeque::new(), - }) - }, - } - } - - pub fn repaint(&self, text: String) { - let mut inner = self.inner.exclusive_access(); - inner.text += text.as_str(); - Text::with_alignment( - inner.text.clone().as_str(), - Point::new(20, 50), - MonoTextStyle::new(&FONT_10X20, Rgb888::BLACK), - Alignment::Left, - ) - .draw(&mut inner.graphic); - } -} - -impl Component for Terminal { - fn paint(&self) { - let mut inner = self.inner.exclusive_access(); - let len = inner.comps.len(); - drop(inner); - for i in 0..len { - let mut inner = self.inner.exclusive_access(); - let comp = Arc::downgrade(&inner.comps[i]); - drop(inner); - comp.upgrade().unwrap().paint(); - } - let mut inner = self.inner.exclusive_access(); - let titel = inner.titel.get_or_insert("No Titel".to_string()).clone(); - let text = Text::new( - titel.as_str(), - Point::new(20, 20), - MonoTextStyle::new(&FONT_10X20, Rgb888::BLACK), - ); - text.draw(&mut inner.graphic); - - Text::with_alignment( - inner.text.clone().as_str(), - Point::new(20, 50), - MonoTextStyle::new(&FONT_10X20, Rgb888::BLACK), - Alignment::Left, - ) - .draw(&mut inner.graphic); - } - - fn add(&self, comp: Arc) { - let mut inner = self.inner.exclusive_access(); - inner.comps.push_back(comp); - } - - fn bound(&self) -> (Size, Point) { - let inner = self.inner.exclusive_access(); - (inner.graphic.size, inner.graphic.point) - } -} diff --git a/os/src/main.rs b/os/src/main.rs index ce7dcc19bf6a44a6ac34a0d40522cc3a5380fc9a..299e4cf2adf42b243820b32d73c72570f58127c3 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -28,7 +28,7 @@ mod task; mod timer; mod trap; -// use syscall::create_desktop; //for test +//use syscall::create_desktop; //for test core::arch::global_asm!(include_str!("entry.asm")); @@ -56,18 +56,18 @@ pub fn rust_main() -> ! { clear_bss(); mm::init(); println!("KERN: init gpu"); - GPU_DEVICE.clone(); + let _gpu = GPU_DEVICE.clone(); println!("KERN: init keyboard"); - KEYBOARD_DEVICE.clone(); + let _keyboard = KEYBOARD_DEVICE.clone(); println!("KERN: init mouse"); - MOUSE_DEVICE.clone(); + let _mouse = MOUSE_DEVICE.clone(); println!("KERN: init trap"); trap::init(); trap::enable_timer_interrupt(); timer::set_next_trigger(); board::device_init(); fs::list_apps(); - //syscall::create_desktop(); //for test + gui::init_paint(); task::add_initproc(); *DEV_NON_BLOCKING_ACCESS.exclusive_access() = true; task::run_tasks(); diff --git a/os/src/mm/frame_allocator.rs b/os/src/mm/frame_allocator.rs index 3c62324b27f027244724cf1ace330d5a6254cf2b..1ecfe9931b991a31763d4898ca17d8d0fe57bf88 100644 --- a/os/src/mm/frame_allocator.rs +++ b/os/src/mm/frame_allocator.rs @@ -48,7 +48,7 @@ impl StackFrameAllocator { pub fn init(&mut self, l: PhysPageNum, r: PhysPageNum) { self.current = l.0; self.end = r.0; - println!("last {} Physical Frames.", self.end - self.current); + // println!("last {} Physical Frames.", self.end - self.current); } } impl FrameAllocator for StackFrameAllocator { diff --git a/os/src/mm/memory_set.rs b/os/src/mm/memory_set.rs index 0862dc7a43dbb924410f17e28e6e0b4b168a8ad2..663b68d9159a316e64dde1462a9e21c01c8dface 100644 --- a/os/src/mm/memory_set.rs +++ b/os/src/mm/memory_set.rs @@ -92,14 +92,14 @@ impl MemorySet { // map trampoline memory_set.map_trampoline(); // map kernel sections - println!(".text [{:#x}, {:#x})", stext as usize, etext as usize); - println!(".rodata [{:#x}, {:#x})", srodata as usize, erodata as usize); - println!(".data [{:#x}, {:#x})", sdata as usize, edata as usize); - println!( - ".bss [{:#x}, {:#x})", - sbss_with_stack as usize, ebss as usize - ); - println!("mapping .text section"); + // println!(".text [{:#x}, {:#x})", stext as usize, etext as usize); + // println!(".rodata [{:#x}, {:#x})", srodata as usize, erodata as usize); + // println!(".data [{:#x}, {:#x})", sdata as usize, edata as usize); + // println!( + // ".bss [{:#x}, {:#x})", + // sbss_with_stack as usize, ebss as usize + // ); + // println!("mapping .text section"); memory_set.push( MapArea::new( (stext as usize).into(), @@ -109,7 +109,7 @@ impl MemorySet { ), None, ); - println!("mapping .rodata section"); + // println!("mapping .rodata section"); memory_set.push( MapArea::new( (srodata as usize).into(), @@ -119,7 +119,7 @@ impl MemorySet { ), None, ); - println!("mapping .data section"); + // println!("mapping .data section"); memory_set.push( MapArea::new( (sdata as usize).into(), @@ -129,7 +129,7 @@ impl MemorySet { ), None, ); - println!("mapping .bss section"); + // println!("mapping .bss section"); memory_set.push( MapArea::new( (sbss_with_stack as usize).into(), @@ -139,7 +139,7 @@ impl MemorySet { ), None, ); - println!("mapping physical memory"); + // println!("mapping physical memory"); memory_set.push( MapArea::new( (ekernel as usize).into(), @@ -149,7 +149,7 @@ impl MemorySet { ), None, ); - println!("mapping memory-mapped registers"); + //println!("mapping memory-mapped registers"); for pair in MMIO { memory_set.push( MapArea::new( diff --git a/os/src/syscall/gui.rs b/os/src/syscall/gui.rs deleted file mode 100644 index 82c42af42487c937997ff264cc731adfbcd3ac67..0000000000000000000000000000000000000000 --- a/os/src/syscall/gui.rs +++ /dev/null @@ -1,63 +0,0 @@ -use alloc::{string::ToString, sync::Arc, vec::Vec}; -use embedded_graphics::{ - prelude::{Point, Size}, - primitives::arc, -}; - -use crate::{ - fs::ROOT_INODE, - gui::{Button, Component, IconController, ImageComp, Panel, Terminal}, - sync::UPIntrFreeCell, -}; - -use crate::board::{VIRTGPU_XRES, VIRTGPU_YRES}; - -static DT: &[u8] = include_bytes!("../assert/desktop.bmp"); - -lazy_static::lazy_static!( - pub static ref DESKTOP:UPIntrFreeCell> = unsafe { - UPIntrFreeCell::new(Arc::new(Panel::new(Size::new(VIRTGPU_XRES, VIRTGPU_YRES), Point::new(0, 0)))) - }; - pub static ref PAD:UPIntrFreeCell>> = unsafe { - UPIntrFreeCell::new(None) - }; -); - -pub fn create_desktop() -> isize { - let mut p: Arc = - Arc::new(Panel::new(Size::new(VIRTGPU_XRES, VIRTGPU_YRES), Point::new(0, 0))); - let image = ImageComp::new(Size::new(VIRTGPU_XRES, VIRTGPU_YRES), Point::new(0, 0), DT, Some(p.clone())); - let icon = IconController::new(ROOT_INODE.ls(), Some(p.clone())); - p.add(Arc::new(image)); - p.add(Arc::new(icon)); - let mut desktop = DESKTOP.exclusive_access(); - *desktop = p; - desktop.paint(); - drop(desktop); - create_terminal(); - 1 -} - -pub fn create_terminal() { - let desktop = DESKTOP.exclusive_access(); - let arc_t = Arc::new(Terminal::new( - Size::new(400, 400), - Point::new(200, 100), - Some(desktop.clone()), - Some("demo.txt".to_string()), - "".to_string(), - )); - let text = Panel::new(Size::new(400, 400), Point::new(200, 100)); - let button = Button::new( - Size::new(20, 20), - Point::new(370, 10), - Some(arc_t.clone()), - "X".to_string(), - ); - arc_t.add(Arc::new(text)); - arc_t.add(Arc::new(button)); - arc_t.paint(); - desktop.add(arc_t.clone()); - let mut pad = PAD.exclusive_access(); - *pad = Some(arc_t); -} diff --git a/os/src/syscall/mod.rs b/os/src/syscall/mod.rs index dccb73b8d5a38836409b2e0230a7bc023bf649b9..fa4a4cf1385a91dc12967edfc08f941f85233f17 100644 --- a/os/src/syscall/mod.rs +++ b/os/src/syscall/mod.rs @@ -25,16 +25,13 @@ const SYSCALL_SEMAPHORE_DOWN: usize = 1022; const SYSCALL_CONDVAR_CREATE: usize = 1030; const SYSCALL_CONDVAR_SIGNAL: usize = 1031; const SYSCALL_CONDVAR_WAIT: usize = 1032; -const SYSCALL_CREATE_DESKTOP: usize = 2000; + mod fs; -mod gui; mod process; mod sync; mod thread; -pub use self::gui::create_desktop; -use fs::*; -pub use gui::PAD; +use fs::*; use process::*; use sync::*; use thread::*; @@ -68,8 +65,6 @@ pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize { SYSCALL_CONDVAR_CREATE => sys_condvar_create(args[0]), SYSCALL_CONDVAR_SIGNAL => sys_condvar_signal(args[0]), SYSCALL_CONDVAR_WAIT => sys_condvar_wait(args[0], args[1]), - SYSCALL_CREATE_DESKTOP => create_desktop(), _ => panic!("Unsupported syscall_id: {}", syscall_id), } } - diff --git a/os/src/timer.rs b/os/src/timer.rs index 06a70dea0548283679364c2745371aa0c5ba5444..7be2d012452a749c09f8da31bdbd8331f507dab3 100644 --- a/os/src/timer.rs +++ b/os/src/timer.rs @@ -61,13 +61,14 @@ pub fn add_timer(expire_ms: usize, task: Arc) { pub fn check_timer() { let current_ms = get_time_ms(); - let mut timers = TIMERS.exclusive_access(); - while let Some(timer) = timers.peek() { - if timer.expire_ms <= current_ms { - add_task(Arc::clone(&timer.task)); - timers.pop(); - } else { - break; + TIMERS.exclusive_session(|timers| { + while let Some(timer) = timers.peek() { + if timer.expire_ms <= current_ms { + add_task(Arc::clone(&timer.task)); + timers.pop(); + } else { + break; + } } - } + }); } diff --git a/os/src/trap/mod.rs b/os/src/trap/mod.rs index ce2aae8e453c066e636155c7916c8756f8b777a2..cb4a7add5485e6bfcbd1e18e7f024e39628b240d 100644 --- a/os/src/trap/mod.rs +++ b/os/src/trap/mod.rs @@ -61,7 +61,7 @@ pub fn trap_handler() -> ! { set_kernel_trap_entry(); let scause = scause::read(); let stval = stval::read(); - //println!("into {:?}", scause.cause()); + // println!("into {:?}", scause.cause()); match scause.cause() { Trap::Exception(Exception::UserEnvCall) => { // jump to next instruction anyway diff --git a/user/src/bin/gui.rs b/user/src/bin/gui.rs deleted file mode 100644 index e3f7ec2c8bcc7e189b05ae2b790bde3a0f1b152d..0000000000000000000000000000000000000000 --- a/user/src/bin/gui.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![no_std] -#![no_main] - -use user_lib::create_desktop; - -#[macro_use] -extern crate user_lib; - - - -#[no_mangle] -pub fn main() -> i32 { - println!("gui"); - create_desktop(); - println!("exit pass."); - loop{} - 0 -} - diff --git a/user/src/bin/huge_write_mt.rs b/user/src/bin/huge_write_mt.rs index 8ca7578349330822633394f5392757b14fba0705..0a60fd8a8269848b0975d6754c8902fed6b183b8 100644 --- a/user/src/bin/huge_write_mt.rs +++ b/user/src/bin/huge_write_mt.rs @@ -5,7 +5,7 @@ extern crate user_lib; extern crate alloc; -use alloc::{fmt::format, string::String, vec::Vec}; +use alloc::{fmt::format, vec::Vec}; use user_lib::{close, get_time, gettid, open, write, OpenFlags}; use user_lib::{exit, thread_create, waittid}; diff --git a/user/src/bin/peterson.rs b/user/src/bin/peterson.rs index 555199703eeb0938147cb951220ec8f702d0c693..089841d71c888942adce11d1c559ca390b7be68d 100644 --- a/user/src/bin/peterson.rs +++ b/user/src/bin/peterson.rs @@ -1,7 +1,6 @@ #![no_std] #![no_main] #![feature(core_intrinsics)] -#![feature(asm)] #[macro_use] extern crate user_lib; diff --git a/user/src/lib.rs b/user/src/lib.rs index 6f57edd4d2b4310899dc65c8565e1ac5057b2bab..729eaef3111b7c259455a3e169ce4d19ce0aa4be 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -198,9 +198,7 @@ pub fn condvar_signal(condvar_id: usize) { pub fn condvar_wait(condvar_id: usize, mutex_id: usize) { sys_condvar_wait(condvar_id, mutex_id); } -pub fn create_desktop() { - sys_create_desktop(); -} + #[macro_export] macro_rules! vstore { ($var_ref: expr, $value: expr) => { diff --git a/user/src/syscall.rs b/user/src/syscall.rs index 3f36f5337c981d747d033247b07610a969d78d63..b4bb67a02c5cc76b5346bafd74e17b82e5f30f29 100644 --- a/user/src/syscall.rs +++ b/user/src/syscall.rs @@ -154,6 +154,3 @@ pub fn sys_condvar_signal(condvar_id: usize) -> isize { pub fn sys_condvar_wait(condvar_id: usize, mutex_id: usize) -> isize { syscall(SYSCALL_CONDVAR_WAIT, [condvar_id, mutex_id, 0]) } -pub fn sys_create_desktop() -> isize { - syscall(2000, [0, 0, 0]) -} \ No newline at end of file