Color video works!!!!!!!!!!!!!!!!!!!
This commit is contained in:
parent
08b2d22662
commit
4349fe9c6e
2
build.sh
2
build.sh
|
@ -131,7 +131,7 @@ case $1 in
|
||||||
build_dev
|
build_dev
|
||||||
;;
|
;;
|
||||||
run-qemu-gdb)
|
run-qemu-gdb)
|
||||||
build
|
build_dev
|
||||||
run_qemu_gdb
|
run_qemu_gdb
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|
|
@ -42,7 +42,7 @@ extern "C" fn kmain(mb2p: *const BootInformationHeader) -> ! {
|
||||||
|
|
||||||
let vc = std::vga::video::VideoControler::new(mb2p);
|
let vc = std::vga::video::VideoControler::new(mb2p);
|
||||||
// vc.set_px(0, 0, Color::new(0xFF, 0xFF, 0x0));
|
// vc.set_px(0, 0, Color::new(0xFF, 0xFF, 0x0));
|
||||||
// vc.fill_screen(Color::new(0xFF, 0x0, 0x0));
|
vc.fill_screen(Color::new(0xFF, 0x0, 0x66));
|
||||||
|
|
||||||
log::info!("end of work");
|
log::info!("end of work");
|
||||||
loop {
|
loop {
|
||||||
|
|
|
@ -152,7 +152,7 @@ impl MemInfo<'_> {
|
||||||
let mb_end = boot_info.end_address();
|
let mb_end = boot_info.end_address();
|
||||||
let vv_info = boot_info.framebuffer_tag().unwrap().unwrap();
|
let vv_info = boot_info.framebuffer_tag().unwrap().unwrap();
|
||||||
let vv_start = vv_info.address();
|
let vv_start = vv_info.address();
|
||||||
let vv_size = vv_info.width() * vv_info.height();
|
let vv_size = vv_info.pitch() * vv_info.height();
|
||||||
|
|
||||||
//log::debug!("Kernel: start: 0x{:x} sz: 0x{:x}", mi.kernel_start, mi.kernel_end - mi.kernel_start);
|
//log::debug!("Kernel: start: 0x{:x} sz: 0x{:x}", mi.kernel_start, mi.kernel_end - mi.kernel_start);
|
||||||
//log::debug!("Multiboot: start: 0x{:x} sz: 0x{:x}", mi.mb_start, mi.mb_end - mi.mb_start);
|
//log::debug!("Multiboot: start: 0x{:x} sz: 0x{:x}", mi.mb_start, mi.mb_end - mi.mb_start);
|
||||||
|
|
|
@ -206,12 +206,14 @@ pub fn remap_the_kernel<A>(allocator: &mut A, mem_info: &MemInfo) -> ActivePageT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let vga_text_buffer_frame = Frame::containing_address(0xb8000);
|
let vga_text_buffer_frame = Frame::containing_address(0xb8000);
|
||||||
let vga_video_buffer_frame_start = Frame::containing_address(mem_info.vga_vide_start);
|
|
||||||
let vga_video_buffer_frame_end = Frame::containing_address((mem_info.vga_vide_start + mem_info.vga_vide_size*3));
|
|
||||||
for frame in Frame::range_inclusive(vga_video_buffer_frame_start, vga_video_buffer_frame_end) {
|
|
||||||
mapper.identity_map(frame, EntryFlags::PRESENT | EntryFlags::WRITABLE, allocator);
|
|
||||||
}
|
|
||||||
mapper.identity_map(vga_text_buffer_frame, EntryFlags::WRITABLE, allocator);
|
mapper.identity_map(vga_text_buffer_frame, EntryFlags::WRITABLE, allocator);
|
||||||
|
|
||||||
|
let vga_video_buffer_frame_start = Frame::containing_address(mem_info.vga_vide_start);
|
||||||
|
let vga_video_buffer_frame_end = Frame::containing_address(mem_info.vga_vide_start + (mem_info.vga_vide_size*4));
|
||||||
|
for frame in Frame::range_inclusive(vga_video_buffer_frame_start, vga_video_buffer_frame_end) {
|
||||||
|
mapper.identity_map(frame, EntryFlags::WRITABLE | EntryFlags::WRITE_THROUGH, allocator);
|
||||||
|
}
|
||||||
|
|
||||||
let multiboot_start = Frame::containing_address(mem_info.boot_info.start_address());
|
let multiboot_start = Frame::containing_address(mem_info.boot_info.start_address());
|
||||||
let multiboot_end = Frame::containing_address(mem_info.boot_info.end_address() - 1);
|
let multiboot_end = Frame::containing_address(mem_info.boot_info.end_address() - 1);
|
||||||
for frame in Frame::range_inclusive(multiboot_start, multiboot_end) {
|
for frame in Frame::range_inclusive(multiboot_start, multiboot_end) {
|
||||||
|
|
|
@ -28,7 +28,9 @@ pub struct VideoControler{
|
||||||
g_ofs: u8,
|
g_ofs: u8,
|
||||||
b_ofs: u8,
|
b_ofs: u8,
|
||||||
buf_addr: u64,
|
buf_addr: u64,
|
||||||
|
pitch: usize,
|
||||||
size: Vector2<usize>,
|
size: Vector2<usize>,
|
||||||
|
bpp: u8
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VideoControler {
|
impl VideoControler {
|
||||||
|
@ -38,32 +40,37 @@ impl VideoControler {
|
||||||
let FramebufferType::RGB { red, green, blue } = fbt.buffer_type().unwrap() else {
|
let FramebufferType::RGB { red, green, blue } = fbt.buffer_type().unwrap() else {
|
||||||
panic!();
|
panic!();
|
||||||
};
|
};
|
||||||
|
|
||||||
assert!(red.size == green.size && green.size == blue.size);
|
assert!(red.size == green.size && green.size == blue.size);
|
||||||
log::info!("VGA VIDEO adddr: {:x}", fbt.address());
|
log::info!("VGA VIDEO addr: {:x}", fbt.address());
|
||||||
log::info!("VGA VIDEO FB TYPE: {:?}", fbt.buffer_type());
|
log::info!("{fbt:#?}");
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
component_size: red.size,
|
component_size: red.size,
|
||||||
r_ofs: red.position,
|
r_ofs: red.position,
|
||||||
g_ofs: green.position,
|
g_ofs: green.position,
|
||||||
b_ofs: blue.position,
|
b_ofs: blue.position,
|
||||||
buf_addr: fbt.address(),
|
buf_addr: fbt.address(),
|
||||||
size: Vector2::new(fbt.width() as usize, fbt.height() as usize)
|
size: Vector2::new(fbt.width() as usize, fbt.height() as usize),
|
||||||
|
pitch: fbt.pitch() as usize,
|
||||||
|
bpp: fbt.bpp(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_px(&self, x: usize, y: usize, c: Color) {
|
pub fn set_px(&self, x: usize, y: usize, c: Color) {
|
||||||
|
assert!(x <= self.size.x && y <= self.size.x);
|
||||||
let ptr = self.buf_addr as *mut () as *mut u8;
|
let ptr = self.buf_addr as *mut () as *mut u8;
|
||||||
let px = ptr.wrapping_add(x * self.size.x + y);
|
let px = ptr.wrapping_add((self.bpp / 8) as usize * x + self.pitch * y);
|
||||||
unsafe {
|
unsafe {
|
||||||
*px.wrapping_add((self.r_ofs % 8) as usize) = c.r;
|
*px.wrapping_add((self.r_ofs / 8) as usize) = c.r;
|
||||||
*px.wrapping_add((self.g_ofs % 8) as usize) = c.g;
|
*px.wrapping_add((self.g_ofs / 8) as usize) = c.g;
|
||||||
*px.wrapping_add((self.b_ofs % 8) as usize) = c.b;
|
*px.wrapping_add((self.b_ofs / 8) as usize) = c.b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fill_screen(&self, c: Color) {
|
pub fn fill_screen(&self, c: Color) {
|
||||||
for x in 0..100 {
|
for x in 0..self.size.x {
|
||||||
for y in 0..100 {
|
for y in 0..self.size.y {
|
||||||
self.set_px(x, y, c);
|
self.set_px(x, y, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user