You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
6.4 KiB

use rcore_fs::vfs::*;
use crate::arch::board::fb::FRAME_BUFFER;
use crate::memory::phys_to_virt;
use alloc::{string::String, sync::Arc, vec::Vec};
use core::any::Any;
#[derive(Default)]
pub struct Vga;
macro_rules! impl_inode {
() => {
fn set_metadata(&self, _metadata: &Metadata) -> Result<()> { Ok(()) }
fn sync_all(&self) -> Result<()> { Ok(()) }
fn sync_data(&self) -> Result<()> { Ok(()) }
fn resize(&self, _len: usize) -> Result<()> { Err(FsError::NotSupported) }
fn create(&self, _name: &str, _type_: FileType, _mode: u32) -> Result<Arc<INode>> { Err(FsError::NotDir) }
fn unlink(&self, _name: &str) -> Result<()> { Err(FsError::NotDir) }
fn link(&self, _name: &str, _other: &Arc<INode>) -> Result<()> { Err(FsError::NotDir) }
fn move_(&self, _old_name: &str, _target: &Arc<INode>, _new_name: &str) -> Result<()> { Err(FsError::NotDir) }
fn find(&self, _name: &str) -> Result<Arc<INode>> { Err(FsError::NotDir) }
fn get_entry(&self, _id: usize) -> Result<String> { Err(FsError::NotDir) }
fn fs(&self) -> Arc<FileSystem> { unimplemented!() }
fn as_any_ref(&self) -> &Any { self }
};
}
impl INode for Vga {
fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize> {
Err(FsError::NotSupported)
}
fn write_at(&self, _offset: usize, _buf: &[u8]) -> Result<usize> {
info!("the _offset is {} {}", _offset, _buf[0]);
use core::slice;
let frame_buffer_data = unsafe {
slice::from_raw_parts_mut(
phys_to_virt(0xfd00_0000) as *mut u8,
(1024 * 768 * 3) as usize,
)
};
frame_buffer_data.copy_from_slice(&_buf);
return Ok(1024 * 768 * 3);
}
fn poll(&self) -> Result<PollStatus> {
Ok(PollStatus {
// TOKNOW and TODO
read: true,
write: false,
error: false,
})
}
fn metadata(&self) -> Result<Metadata> {
Ok(Metadata {
dev: 0,
inode: 0,
size: 0x24000,
blk_size: 0,
blocks: 0,
atime: Timespec { sec: 0, nsec: 0 },
mtime: Timespec { sec: 0, nsec: 0 },
ctime: Timespec { sec: 0, nsec: 0 },
type_: FileType::SymLink,
mode: 0,
nlinks: 0,
uid: 0,
gid: 0,
})
}
fn io_control(&self, cmd: u32, data: usize) -> Result<()> {
info!("cmd {:#x} , data {:#x} vga not support ioctl !", cmd, data);
match cmd {
FBIOGET_FSCREENINFO => {
let fb_fix_info = unsafe{ &mut *(data as *mut fb_fix_screeninfo) };
fb_fix_info.line_length = 100;
Ok(())
},
FBIOGET_VSCREENINFO => {
let fb_var_info = unsafe{ &mut *(data as *mut fb_var_screeninfo) };
if let Some(fb) = FRAME_BUFFER.lock().as_ref() {
fb.fill_var_screeninfo(fb_var_info);
}
Ok(())
},
_ => {
warn!("use never support ioctl !");
Err(FsError::NotSupported)
}
}
//let fb_fix_info = unsafe{ &mut *(data as *mut fb_fix_screeninfo) };
//Ok(())
}
impl_inode!();
}
const FBIOGET_FSCREENINFO : u32 = 0x4602;
const FBIOGET_VSCREENINFO : u32 = 0x4600;
#[repr(C)]
struct fb_fix_screeninfo {
pub id : [u8;16], /* identification string eg "TT Builtin" */
pub smem_start : u64, /* Start of frame buffer mem */
/* (physical address) */
pub smem_len : u32, /* Length of frame buffer mem */
pub _type : u32, /* see FB_TYPE_* */
pub type_aux : u32, /* Interleave for interleaved Planes */
pub visual : u32, /* see FB_VISUAL_* */
pub xpanstep : u16, /* zero if no hardware panning */
pub ypanstep : u16, /* zero if no hardware panning */
pub ywrapstep : u16, /* zero if no hardware ywrap */
pub line_length : u32, /* length of a line in bytes */
pub mmio_start : u64, /* Start of Memory Mapped I/O */
/* (physical address) */
pub mmio_len : u32, /* Length of Memory Mapped I/O */
pub accel : u32, /* Indicate to driver which */
/* specific chip/card we have */
pub capabilities : u16, /* see FB_CAP_* */
pub reserved : [u16;2], /* Reserved for future compatibility */
}
#[repr(C)]
pub struct fb_var_screeninfo {
pub xres : u32, /* visible resolution */
pub yres : u32,
pub xres_virtual : u32, /* virtual resolution */
pub yres_virtual : u32,
pub xoffset : u32, /* offset from virtual to visible */
pub yoffset : u32, /* resolution */
pub bits_per_pixel : u32, /* guess what */
pub grayscale : u32, /* 0 = color, 1 = grayscale, */
/* >1 = FOURCC */
pub red : fb_bitfield , /* bitfield in fb mem if true color, */
pub green : fb_bitfield , /* else only length is significant */
pub blue : fb_bitfield ,
pub transp : fb_bitfield , /* transparency */
pub nonstd : u32, /* != 0 Non standard pixel format */
pub activate : u32, /* see FB_ACTIVATE_* */
pub height : u32, /* height of picture in mm */
pub width : u32, /* width of picture in mm */
pub accel_flags : u32, /* (OBSOLETE) see fb_info.flags */
/* Timing: All values in pixclocks, except pixclock (of course) */
pub pixclock : u32, /* pixel clock in ps (pico seconds) */
pub left_margin : u32, /* time from sync to picture */
pub right_margin : u32, /* time from picture to sync */
pub upper_margin : u32, /* time from sync to picture */
pub lower_margin : u32,
pub hsync_len : u32, /* length of horizontal sync */
pub vsync_len : u32, /* length of vertical sync */
pub sync : u32, /* see FB_SYNC_* */
pub vmode : u32, /* see FB_VMODE_* */
pub rotate : u32, /* angle we rotate counter clockwise */
pub colorspace : u32, /* colorspace for FOURCC-based modes */
pub reserved : [u32;4], /* Reserved for future compatibility */
}
#[repr(C)]
pub struct fb_bitfield {
pub offset : u32, /* beginning of bitfield */
pub length : u32, /* length of bitfield */
pub msb_right : u32, /* != 0 : Most significant bit is */
/* right */
}