move fb to psram to save 200KB for user apps

This commit is contained in:
2025-10-31 17:28:16 -06:00
parent 2226541813
commit 1d7ab3fb42
4 changed files with 73 additions and 37 deletions

View File

@@ -1,6 +1,5 @@
use crate::framebuffer::{self, AtomicFrameBuffer, FB_PAUSED};
use alloc::vec;
use core::sync::atomic::{AtomicBool, Ordering};
use core::sync::atomic::Ordering;
use embassy_rp::{
Peri,
gpio::{Level, Output},
@@ -9,9 +8,16 @@ use embassy_rp::{
};
use embassy_time::{Delay, Timer};
use embedded_hal_bus::spi::ExclusiveDevice;
use once_cell::unsync::Lazy;
use st7365p_lcd::ST7365P;
#[cfg(feature = "pimoroni2w")]
use core::alloc::{GlobalAlloc, Layout};
#[cfg(feature = "pimoroni2w")]
use embedded_graphics::{
pixelcolor::Rgb565,
prelude::{DrawTarget, RgbColor},
};
type DISPLAY = ST7365P<
ExclusiveDevice<Spi<'static, SPI1, Async>, Output<'static>, Delay>,
Output<'static>,
@@ -22,10 +28,24 @@ type DISPLAY = ST7365P<
pub const SCREEN_WIDTH: usize = 320;
pub const SCREEN_HEIGHT: usize = 320;
pub static mut FRAMEBUFFER: Lazy<AtomicFrameBuffer> = Lazy::new(|| {
static mut BUF: [u16; framebuffer::SIZE] = [0; framebuffer::SIZE];
AtomicFrameBuffer::new(unsafe { &mut BUF })
});
pub static mut FRAMEBUFFER: Option<AtomicFrameBuffer> = None;
fn init_fb() {
unsafe {
FRAMEBUFFER = Some(if cfg!(not(feature = "pimoroni2w")) {
static mut BUF: [u16; framebuffer::SIZE] = [0; framebuffer::SIZE];
AtomicFrameBuffer::new(&mut BUF)
} else {
let slab = crate::heap::HEAP.alloc(Layout::array::<u16>(framebuffer::SIZE).unwrap())
as *mut u16;
let buf = core::slice::from_raw_parts_mut(slab, framebuffer::SIZE);
let mut fb = AtomicFrameBuffer::new(buf);
fb.clear(Rgb565::BLACK).unwrap();
fb
});
}
}
pub async fn init_display(
spi: Spi<'static, SPI1, Async>,
@@ -33,6 +53,8 @@ pub async fn init_display(
data: Peri<'static, PIN_14>,
reset: Peri<'static, PIN_15>,
) -> DISPLAY {
init_fb();
let spi_device = ExclusiveDevice::new(spi, Output::new(cs, Level::Low), Delay).unwrap();
let mut display = ST7365P::new(
spi_device,
@@ -44,7 +66,14 @@ pub async fn init_display(
);
display.init().await.unwrap();
display.set_custom_orientation(0x40).await.unwrap();
unsafe { FRAMEBUFFER.draw(&mut display).await.unwrap() }
unsafe {
FRAMEBUFFER
.as_mut()
.unwrap()
.draw(&mut display)
.await
.unwrap()
}
display.set_on().await.unwrap();
display
@@ -54,7 +83,14 @@ pub async fn init_display(
pub async fn display_handler(mut display: DISPLAY) {
loop {
if !FB_PAUSED.load(Ordering::Acquire) {
unsafe { FRAMEBUFFER.safe_draw(&mut display).await.unwrap() };
unsafe {
FRAMEBUFFER
.as_mut()
.unwrap()
.safe_draw(&mut display)
.await
.unwrap()
};
}
// small yield to allow other tasks to run