增加/dev/fb0,能够在用户程序读写帧缓冲区 (#485)

This commit is contained in:
LoGin
2024-01-02 14:16:10 +08:00
committed by GitHub
parent e7071df6a4
commit 02343d0b5b
22 changed files with 230 additions and 53 deletions

View File

@ -295,6 +295,48 @@ impl FrameBufferOps for VesaFb {
fn fb_destroy(&self) {
todo!()
}
fn fb_read(&self, buf: &mut [u8], pos: usize) -> Result<usize, SystemError> {
let bp = boot_params().read();
let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
let size = self.current_fb_fix().smem_len;
drop(bp);
if pos >= size {
return Ok(0);
}
let pos = pos as i64;
let size = size as i64;
let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
let slice = unsafe { core::slice::from_raw_parts(vaddr.as_ptr::<u8>(), size as usize) };
buf[..len].copy_from_slice(&slice[pos as usize..(pos as usize + len)]);
return Ok(len);
}
fn fb_write(&self, buf: &[u8], pos: usize) -> Result<usize, SystemError> {
let bp = boot_params().read();
let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
let size = self.current_fb_fix().smem_len;
if pos >= size {
return Ok(0);
}
let pos = pos as i64;
let size = size as i64;
let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
let slice = unsafe { core::slice::from_raw_parts_mut(vaddr.as_ptr::<u8>(), size as usize) };
slice[pos as usize..(pos as usize + len)].copy_from_slice(&buf[..len]);
return Ok(len);
}
}
impl FrameBufferInfo for VesaFb {