simple gui app can run now!

This commit is contained in:
Yu Chen 2023-01-07 16:11:41 +08:00
parent 944f114cf8
commit beaef1f304
11 changed files with 119 additions and 3 deletions

View file

@ -10,6 +10,7 @@ edition = "2018"
buddy_system_allocator = "0.6"
bitflags = "1.2.1"
riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] }
embedded-graphics = "0.7.1"
[profile.release]
debug = true

View file

@ -0,0 +1,35 @@
#![no_std]
#![no_main]
use user_lib::{framebuffer, framebuffer_flush};
#[macro_use]
extern crate user_lib;
// 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 embedded_graphics::{
// draw_target::DrawTarget,
// prelude::{OriginDimensions},
// };
pub const VIRTGPU_XRES: usize = 1280;
pub const VIRTGPU_YRES: usize = 800;
#[no_mangle]
pub fn main() -> i32 {
let fb_ptr =framebuffer() as *mut u8;
println!("Hello world from user mode program! 0x{:X} , len {}", fb_ptr as usize, VIRTGPU_XRES*VIRTGPU_YRES*4);
let fb= unsafe {core::slice::from_raw_parts_mut(fb_ptr as *mut u8, VIRTGPU_XRES*VIRTGPU_YRES*4 as usize)};
for y in 0..800 {
for x in 0..1280 {
let idx = (y * 1280 + x) * 4;
fb[idx] = x as u8;
fb[idx + 1] = y as u8;
fb[idx + 2] = (x + y) as u8;
}
}
framebuffer_flush();
0
}

View file

@ -198,6 +198,12 @@ 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 framebuffer() -> isize {
sys_framebuffer()
}
pub fn framebuffer_flush() -> isize {
sys_framebuffer_flush()
}
#[macro_export]
macro_rules! vstore {

View file

@ -25,6 +25,8 @@ 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_FRAMEBUFFER: usize = 2000;
const SYSCALL_FRAMEBUFFER_FLUSH: usize = 2001;
fn syscall(id: usize, args: [usize; 3]) -> isize {
let mut ret: isize;
@ -154,3 +156,12 @@ 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_framebuffer() -> isize {
syscall(SYSCALL_FRAMEBUFFER, [0, 0, 0])
}
pub fn sys_framebuffer_flush() -> isize {
syscall(SYSCALL_FRAMEBUFFER_FLUSH, [0, 0, 0])
}