asdfasdfasdf
This commit is contained in:
parent
82109dc98e
commit
8ce377784c
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -142,7 +142,6 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aligned-vec",
|
"aligned-vec",
|
||||||
"embedded-graphics",
|
"embedded-graphics",
|
||||||
"log",
|
|
||||||
"tinygif",
|
"tinygif",
|
||||||
"uefi",
|
"uefi",
|
||||||
"uefi-graphics2",
|
"uefi-graphics2",
|
||||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -3,16 +3,16 @@ members = ["efi-bin", "xtask"]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
#strip = true
|
strip = true
|
||||||
#opt-level = "z"
|
opt-level = "z"
|
||||||
#lto = true
|
lto = true
|
||||||
#codegen-units = 1
|
codegen-units = 1
|
||||||
#panic = "abort"
|
panic = "abort"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
|
aligned-vec = { version = "0.5.0", default-features = false }
|
||||||
fatfs = { path = "rust-fatfs", default-features = false, features = ["alloc", "chrono"] }
|
fatfs = { path = "rust-fatfs", default-features = false, features = ["alloc", "chrono"] }
|
||||||
embedded-graphics = "0.8.1"
|
embedded-graphics = "0.8.1"
|
||||||
log = "0.4.21"
|
|
||||||
mbrs = "0.3.1"
|
mbrs = "0.3.1"
|
||||||
tinygif = { version = "0.0.4", features = ["8k"] }
|
tinygif = { version = "0.0.4", features = ["8k"] }
|
||||||
uefi = { version = "0.28.0", features = ["global_allocator", "panic_handler", "alloc"] }
|
uefi = { version = "0.28.0", features = ["global_allocator", "panic_handler", "alloc"] }
|
||||||
|
|
BIN
bad-apple.gif
Normal file
BIN
bad-apple.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 MiB |
|
@ -6,9 +6,8 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
aligned-vec = { version = "0.5.0", default-features = false }
|
aligned-vec.workspace = true
|
||||||
embedded-graphics.workspace = true
|
embedded-graphics.workspace = true
|
||||||
log.workspace = true
|
|
||||||
tinygif.workspace = true
|
tinygif.workspace = true
|
||||||
uefi.workspace = true
|
uefi.workspace = true
|
||||||
uefi-graphics2.workspace = true
|
uefi-graphics2.workspace = true
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 22 MiB After Width: | Height: | Size: 24 B |
1
efi-bin/src/bad-apple.gif
Symbolic link
1
efi-bin/src/bad-apple.gif
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../kirby_angy_sit.gif
|
Before Width: | Height: | Size: 22 MiB After Width: | Height: | Size: 24 B |
|
@ -4,31 +4,23 @@
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
use aligned_vec::{AVec, ConstAlign};
|
use aligned_vec::{AVec, ConstAlign};
|
||||||
use alloc::borrow::ToOwned;
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::time::Duration;
|
|
||||||
use uefi::proto::device_path::build::media::HardDrive;
|
use uefi::proto::device_path::build::media::HardDrive;
|
||||||
use uefi::proto::device_path::build::DevicePathBuilder;
|
use uefi::proto::device_path::build::DevicePathBuilder;
|
||||||
use uefi::proto::device_path::media::{PartitionFormat, PartitionSignature};
|
use uefi::proto::device_path::media::{PartitionFormat, PartitionSignature};
|
||||||
|
|
||||||
use uefi::{prelude::*, println, CStr16};
|
use uefi::{prelude::*, println};
|
||||||
|
|
||||||
use uefi::proto::console::gop::GraphicsOutput;
|
use uefi::proto::console::gop::GraphicsOutput;
|
||||||
use uefi::proto::device_path::{DeviceType, LoadedImageDevicePath};
|
use uefi::proto::device_path::{DeviceType, LoadedImageDevicePath};
|
||||||
use uefi::proto::loaded_image::LoadedImage;
|
use uefi::proto::media::block::{BlockIO, Lba};
|
||||||
use uefi::proto::media::block::{BlockIO, BlockIOMedia, Lba};
|
|
||||||
use uefi::proto::media::disk::DiskIo;
|
|
||||||
use uefi::proto::media::file::{File, FileSystemVolumeLabel};
|
|
||||||
use uefi::proto::media::fs::SimpleFileSystem;
|
|
||||||
use uefi::proto::media::partition::PartitionInfo;
|
|
||||||
use uefi::proto::misc::Timestamp;
|
|
||||||
use uefi::table::boot::{OpenProtocolAttributes, OpenProtocolParams};
|
use uefi::table::boot::{OpenProtocolAttributes, OpenProtocolParams};
|
||||||
|
|
||||||
use uefi_graphics2::embedded_graphics::{pixelcolor::Rgb888, prelude::*};
|
use uefi_graphics2::embedded_graphics::{pixelcolor::Rgb888, prelude::*};
|
||||||
use uefi_graphics2::UefiDisplay;
|
use uefi_graphics2::UefiDisplay;
|
||||||
|
|
||||||
const GIF_SIZE: usize = ((include_bytes!("bad-apple.gif").len() + 511) / 512) * 512;
|
const GIF_SIZE: usize = ((include_bytes!("bad-apple.gif").len() + 511) / 512) * 512;
|
||||||
const VOLUME_LABEL: &CStr16 = cstr16!("EFIGIFEDEMO");
|
//const VOLUME_LABEL: &CStr16 = cstr16!("EFIGIFEDEMO");
|
||||||
|
|
||||||
#[entry]
|
#[entry]
|
||||||
fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Status {
|
fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Status {
|
||||||
|
@ -42,36 +34,35 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
|
|
||||||
let boot_services = boot_system_table.boot_services();
|
let boot_services = boot_system_table.boot_services();
|
||||||
|
|
||||||
boot_services.stall(1_000_000);
|
|
||||||
|
|
||||||
let img_handle = boot_services.image_handle();
|
let img_handle = boot_services.image_handle();
|
||||||
let loaded_image = boot_services
|
// let loaded_image = boot_services
|
||||||
.open_protocol_exclusive::<LoadedImage>(img_handle)
|
// .open_protocol_exclusive::<LoadedImage>(img_handle)
|
||||||
.expect("loaded image");
|
// .expect("loaded image");
|
||||||
let loaded_image_dev_path = boot_services
|
let loaded_image_dev_path = boot_services
|
||||||
.open_protocol_exclusive::<LoadedImageDevicePath>(img_handle)
|
.open_protocol_exclusive::<LoadedImageDevicePath>(img_handle)
|
||||||
.expect("loaded image dev path");
|
.expect("loaded image dev path");
|
||||||
|
|
||||||
println!("{:?}", loaded_image.file_path());
|
/*
|
||||||
|
{
|
||||||
for dev_path_inst in loaded_image_dev_path.instance_iter() {
|
let fat_dev = loaded_image.device().expect("loaded image device");
|
||||||
println!("inst: {:?}", dev_path_inst);
|
let fat_block = unsafe {
|
||||||
}
|
boot_services.open_protocol::<BlockIO>(
|
||||||
|
OpenProtocolParams {
|
||||||
|
handle: fat_dev,
|
||||||
|
agent: img_handle,
|
||||||
|
controller: None,
|
||||||
|
},
|
||||||
|
OpenProtocolAttributes::GetProtocol,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.expect("fat block io");
|
||||||
|
let fat_start_lba = fat_block.media().lowest_aligned_lba();
|
||||||
|
assert_eq!(fat_start_lba, GIF_SIZE);
|
||||||
|
}
|
||||||
|
*/
|
||||||
let mut dev_path_buf = Vec::new();
|
let mut dev_path_buf = Vec::new();
|
||||||
let mut dev_path_builder = DevicePathBuilder::with_vec(&mut dev_path_buf);
|
let mut dev_path_builder = DevicePathBuilder::with_vec(&mut dev_path_buf);
|
||||||
for dev_path_node in loaded_image_dev_path.node_iter() {
|
for dev_path_node in loaded_image_dev_path.node_iter() {
|
||||||
println!("node: {:?}", dev_path_node);
|
|
||||||
println!(
|
|
||||||
"{}",
|
|
||||||
dev_path_node
|
|
||||||
.to_string(
|
|
||||||
&boot_services,
|
|
||||||
uefi::proto::device_path::text::DisplayOnly(false),
|
|
||||||
uefi::proto::device_path::text::AllowShortcuts(false),
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
);
|
|
||||||
if dev_path_node.device_type() == DeviceType::MEDIA {
|
if dev_path_node.device_type() == DeviceType::MEDIA {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -92,35 +83,9 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
.expect("push hard drive");
|
.expect("push hard drive");
|
||||||
let mut dev_path = dev_path_builder.finalize().expect("finalize dev path");
|
let mut dev_path = dev_path_builder.finalize().expect("finalize dev path");
|
||||||
let device_handle = boot_services
|
let device_handle = boot_services
|
||||||
.locate_device_path::<DiskIo>(&mut dev_path)
|
.locate_device_path::<BlockIO>(&mut dev_path)
|
||||||
.expect("locate dev path");
|
.expect("locate dev path");
|
||||||
|
|
||||||
//let mut device_handle = loaded_image.device().expect("device handle");
|
|
||||||
|
|
||||||
let disk_io = boot_services
|
|
||||||
.open_protocol_exclusive::<DiskIo>(device_handle)
|
|
||||||
.expect("disk io");
|
|
||||||
/*
|
|
||||||
let handles = boot_services
|
|
||||||
.find_handles::<uefi::proto::media::fs::SimpleFileSystem>()
|
|
||||||
.expect("sfs handle");
|
|
||||||
for handle in handles {
|
|
||||||
let mut sfs = boot_services
|
|
||||||
.open_protocol_exclusive::<SimpleFileSystem>(handle)
|
|
||||||
.expect("sfs proto");
|
|
||||||
let mut root_dir = sfs.open_volume().expect("open volume");
|
|
||||||
let vol_info = root_dir
|
|
||||||
.get_boxed_info::<FileSystemVolumeLabel>()
|
|
||||||
.expect("root dir label");
|
|
||||||
if vol_info.volume_label() == VOLUME_LABEL {
|
|
||||||
assert_eq!(device_handle, handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TODO boot_services.locate_device_path()
|
|
||||||
// FIXME we currently have the fat partition, need the parent disk
|
|
||||||
|
|
||||||
let block_io = unsafe {
|
let block_io = unsafe {
|
||||||
boot_services.open_protocol::<BlockIO>(
|
boot_services.open_protocol::<BlockIO>(
|
||||||
OpenProtocolParams {
|
OpenProtocolParams {
|
||||||
|
@ -135,18 +100,12 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
|
|
||||||
let mut gif_buf: AVec<u8, ConstAlign<512>> = AVec::with_capacity(512, GIF_SIZE);
|
let mut gif_buf: AVec<u8, ConstAlign<512>> = AVec::with_capacity(512, GIF_SIZE);
|
||||||
for _ in 0..GIF_SIZE {
|
for _ in 0..GIF_SIZE {
|
||||||
//for _ in 0..512 {
|
|
||||||
gif_buf.push(0u8);
|
gif_buf.push(0u8);
|
||||||
}
|
}
|
||||||
|
|
||||||
disk_io
|
|
||||||
.read_disk(block_io.media().media_id(), 0, &mut gif_buf)
|
|
||||||
.expect("read disk");
|
|
||||||
/*
|
|
||||||
block_io
|
block_io
|
||||||
.read_blocks(block_io.media().media_id(), Lba::from(0u64), &mut gif_buf)
|
.read_blocks(block_io.media().media_id(), Lba::from(0u64), &mut gif_buf)
|
||||||
.expect("read blocks");
|
.expect("read blocks");
|
||||||
*/
|
|
||||||
|
|
||||||
let gif = tinygif::Gif::<Rgb888>::from_slice(&gif_buf).expect("gif from slice");
|
let gif = tinygif::Gif::<Rgb888>::from_slice(&gif_buf).expect("gif from slice");
|
||||||
|
|
||||||
|
@ -160,6 +119,7 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
|
|
||||||
// Create UefiDisplay
|
// Create UefiDisplay
|
||||||
for mode in gop.modes(&boot_services).collect::<Vec<_>>() {
|
for mode in gop.modes(&boot_services).collect::<Vec<_>>() {
|
||||||
|
println!("{:?}", mode.info());
|
||||||
let (w, h) = mode.info().resolution();
|
let (w, h) = mode.info().resolution();
|
||||||
if w >= gif.width() as usize && h >= gif.height() as usize {
|
if w >= gif.width() as usize && h >= gif.height() as usize {
|
||||||
match mode.info().pixel_format() {
|
match mode.info().pixel_format() {
|
||||||
|
@ -182,6 +142,11 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
// Tint the entire screen cyan
|
// Tint the entire screen cyan
|
||||||
display.fill_entire(Rgb888::BLACK).expect("fill black");
|
display.fill_entire(Rgb888::BLACK).expect("fill black");
|
||||||
|
|
||||||
|
let translation = Point::new(
|
||||||
|
(res_w as i32 - gif.width() as i32) / 2,
|
||||||
|
(res_h as i32 - gif.height() as i32) / 2,
|
||||||
|
);
|
||||||
|
/*
|
||||||
let timer_handle = boot_services
|
let timer_handle = boot_services
|
||||||
.get_handle_for_protocol::<Timestamp>()
|
.get_handle_for_protocol::<Timestamp>()
|
||||||
.expect("timestamp handle");
|
.expect("timestamp handle");
|
||||||
|
@ -198,34 +163,40 @@ fn main(_image_handle: Handle, mut boot_system_table: SystemTable<Boot>) -> Stat
|
||||||
|| Duration::from_secs_f64((timer.get_timestamp() - start_timestamp) as f64 / timer_hz);
|
|| Duration::from_secs_f64((timer.get_timestamp() - start_timestamp) as f64 / timer_hz);
|
||||||
|
|
||||||
let mut skipped_flushes = 0;
|
let mut skipped_flushes = 0;
|
||||||
let translation = Point::new(
|
*/
|
||||||
(res_w as i32 - gif.width() as i32) / 2,
|
loop {
|
||||||
(res_h as i32 / gif.height() as i32) / 2,
|
for frame in gif.frames() {
|
||||||
);
|
frame
|
||||||
for frame in gif.frames() {
|
.draw(&mut display.translated(translation))
|
||||||
frame
|
.expect("frame draw");
|
||||||
.draw(&mut display.translated(translation))
|
|
||||||
.expect("frame draw");
|
|
||||||
gif_elapsed += Duration::from_millis(frame.delay_centis as u64 * 10);
|
|
||||||
|
|
||||||
// skip flush to catch up
|
|
||||||
if gif_elapsed > get_real_elapsed() {
|
|
||||||
display.flush();
|
display.flush();
|
||||||
if let Some(time_diff) = get_real_elapsed().checked_sub(gif_elapsed) {
|
boot_services.stall(frame.delay_centis as usize * 10);
|
||||||
boot_services.stall(time_diff.as_micros() as usize);
|
/*
|
||||||
}
|
gif_elapsed += Duration::from_millis(frame.delay_centis as u64 * 10);
|
||||||
} else {
|
|
||||||
skipped_flushes += 1;
|
// skip flush to catch up
|
||||||
if skipped_flushes == 5 {
|
if gif_elapsed > get_real_elapsed() {
|
||||||
// don't skip more than 5 frames at a time
|
|
||||||
// so you can actually still see anything
|
|
||||||
skipped_flushes = 0;
|
|
||||||
display.flush();
|
display.flush();
|
||||||
|
if let Some(time_diff) = get_real_elapsed().checked_sub(gif_elapsed) {
|
||||||
|
boot_services.stall(time_diff.as_micros() as usize);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
skipped_flushes += 1;
|
||||||
|
if skipped_flushes == 5 {
|
||||||
|
// don't skip more than 5 frames at a time
|
||||||
|
// so you can actually still see anything
|
||||||
|
skipped_flushes = 0;
|
||||||
|
display.flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if gif.frames().count() == 1 {
|
||||||
|
boot_services.stall(1_000_000_000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status::SUCCESS
|
// Status::SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -11,7 +11,7 @@ use fatfs::{
|
||||||
};
|
};
|
||||||
use mbrs::{Mbr, PartInfo, PartType};
|
use mbrs::{Mbr, PartInfo, PartType};
|
||||||
|
|
||||||
const RELEASE: bool = false;
|
const RELEASE: bool = true;
|
||||||
const VOLUME_LABEL: [u8; 11] = *b"EFIGIFEDEMO";
|
const VOLUME_LABEL: [u8; 11] = *b"EFIGIFEDEMO";
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
|
@ -131,7 +131,7 @@ fn do_build(cpu: Cpu, _args: VecDeque<String>) {
|
||||||
let efi_bin_size = efi_bin_file.read_to_end(&mut efi_bin_buf);
|
let efi_bin_size = efi_bin_file.read_to_end(&mut efi_bin_buf);
|
||||||
drop(efi_bin_file);
|
drop(efi_bin_file);
|
||||||
|
|
||||||
let fat_disk_size = 256 * 1024; // todo!("get size from efi_bin_size");
|
let fat_disk_size = 64 * 1024; // todo!("get size from efi_bin_size");
|
||||||
|
|
||||||
let mut fat_disk_buf = vec![0; fat_disk_size];
|
let mut fat_disk_buf = vec![0; fat_disk_size];
|
||||||
let mut fat_disk = MyStdIoWrapper(Cursor::new(&mut fat_disk_buf));
|
let mut fat_disk = MyStdIoWrapper(Cursor::new(&mut fat_disk_buf));
|
||||||
|
@ -237,6 +237,8 @@ fn do_run(cpu: Cpu, args: VecDeque<String>) {
|
||||||
.arg("512")
|
.arg("512")
|
||||||
.arg("-device")
|
.arg("-device")
|
||||||
.arg("virtio-gpu-pci")
|
.arg("virtio-gpu-pci")
|
||||||
|
.arg("-serial")
|
||||||
|
.arg("stdio")
|
||||||
.args(&args);
|
.args(&args);
|
||||||
let out_img_path = format!(
|
let out_img_path = format!(
|
||||||
"{}/../target/bad-apple.{}-efi.raw.gif",
|
"{}/../target/bad-apple.{}-efi.raw.gif",
|
||||||
|
|
Loading…
Reference in a new issue