userland app drew to kernel framebuffer!!!

This commit is contained in:
2025-08-26 18:49:29 -06:00
parent c4f2c6cffb
commit 535a99800d

View File

@@ -40,6 +40,7 @@ use embassy_rp::{
spi::{self, Spi}, spi::{self, Spi},
usb as embassy_rp_usb, usb as embassy_rp_usb,
}; };
use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal};
use embassy_time::{Delay, Timer}; use embassy_time::{Delay, Timer};
use embedded_hal_bus::spi::ExclusiveDevice; use embedded_hal_bus::spi::ExclusiveDevice;
use embedded_sdmmc::SdCard as SdmmcSdCard; use embedded_sdmmc::SdCard as SdmmcSdCard;
@@ -62,6 +63,8 @@ static ALLOCATOR: Talck<spin::Mutex<()>, ClaimOnOom> =
Talc::new(unsafe { ClaimOnOom::new(Span::from_array(core::ptr::addr_of!(ARENA).cast_mut())) }) Talc::new(unsafe { ClaimOnOom::new(Span::from_array(core::ptr::addr_of!(ARENA).cast_mut())) })
.lock(); .lock();
static DRIVERS_READY: Signal<CriticalSectionRawMutex, ()> = Signal::new();
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default()); let p = embassy_rp::init(Default::default());
@@ -106,6 +109,8 @@ async fn main(_spawner: Spawner) {
// runs dynamically loaded elf files // runs dynamically loaded elf files
#[embassy_executor::task] #[embassy_executor::task]
async fn userland_task() { async fn userland_task() {
DRIVERS_READY.wait().await;
defmt::info!("Loading binary"); defmt::info!("Loading binary");
let binary_data: &[u8] = let binary_data: &[u8] =
include_bytes!("../../target/thumbv8m.main-none-eabihf/release/calculator"); include_bytes!("../../target/thumbv8m.main-none-eabihf/release/calculator");
@@ -153,21 +158,22 @@ async fn kernel_task(display: Display, sd: Sd, mcu: Mcu, usb: USB) {
Timer::after_millis(250).await; Timer::after_millis(250).await;
let display_fut = { let mut config = spi::Config::default();
let mut config = spi::Config::default(); config.frequency = 16_000_000;
config.frequency = 16_000_000; let spi = Spi::new(
let spi = Spi::new( display.spi,
display.spi, display.clk,
display.clk, display.mosi,
display.mosi, display.miso,
display.miso, display.dma1,
display.dma1, display.dma2,
display.dma2, config,
config, );
); let display = init_display(spi, display.cs, display.data, display.reset).await;
let display = init_display(spi, display.cs, display.data, display.reset).await;
display_handler(display) DRIVERS_READY.signal(());
};
let display_fut = display_handler(display);
{ {
let mut config = spi::Config::default(); let mut config = spi::Config::default();