mirror of
https://github.com/LegitCamper/picocalc-os-rs.git
synced 2025-12-27 07:45:28 +00:00
move fb to psram to save 200KB for user apps
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user