From 602e47f57b7e383d58de430d631ddd77429c91a9 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Wed, 30 Jul 2025 18:00:47 -0600 Subject: [PATCH] getting simple display abi --- abi/src/lib.rs | 2 +- kernel/src/abi.rs | 21 ++++++++++++++++++++- kernel/src/display.rs | 20 +++----------------- kernel/src/main.rs | 28 ++++------------------------ 4 files changed, 28 insertions(+), 43 deletions(-) diff --git a/abi/src/lib.rs b/abi/src/lib.rs index 0411192..1dbc74a 100644 --- a/abi/src/lib.rs +++ b/abi/src/lib.rs @@ -5,5 +5,5 @@ use shared::keyboard::{KeyCode, KeyEvent, KeyState, Modifiers}; #[repr(C)] pub enum Syscall { - DrawPixels { x: u32, y: u32, color: u32 }, + DrawPixel { x: u32, y: u32, color: u16 }, } diff --git a/kernel/src/abi.rs b/kernel/src/abi.rs index 833661d..4cf56ca 100644 --- a/kernel/src/abi.rs +++ b/kernel/src/abi.rs @@ -1,12 +1,31 @@ use abi::Syscall; +use embassy_futures::block_on; +use embedded_graphics::{ + Drawable, + pixelcolor::Rgb565, + prelude::{Point, RgbColor, Size}, + primitives::{PrimitiveStyle, Rectangle, StyledDrawable}, +}; + +use crate::display::FRAMEBUFFER; #[unsafe(no_mangle)] pub extern "C" fn syscall_dispatch(call: *const Syscall) -> usize { let call = unsafe { &*call }; match call { - Syscall::DrawPixels { x, y, color } => { + Syscall::DrawPixel { x, y, color } => { draw_pixel(*x, *y, *color); 0 } } } + +fn draw_pixel(x: u32, y: u32, color: u16) { + let framebuffer = block_on(FRAMEBUFFER.lock()); + Rectangle::new(Point::new(x as i32, y as i32), Size::new(1, 1)) + .draw_styled( + &PrimitiveStyle::with_fill(Rgb565::RED), + *framebuffer.borrow_mut().as_mut().unwrap(), + ) + .unwrap(); +} diff --git a/kernel/src/display.rs b/kernel/src/display.rs index d284575..5615e03 100644 --- a/kernel/src/display.rs +++ b/kernel/src/display.rs @@ -1,24 +1,12 @@ -use core::{cell::RefCell, sync::atomic::Ordering}; - -use defmt::info; +use core::cell::RefCell; use embassy_rp::{ gpio::{Level, Output}, peripherals::{PIN_13, PIN_14, PIN_15, SPI1}, spi::{Async, Spi}, }; -use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, mutex::Mutex, signal::Signal}; -use embassy_time::{Delay, Instant, Timer}; -use embedded_graphics::{ - Drawable, - draw_target::DrawTarget, - mono_font::{MonoTextStyle, ascii::FONT_10X20}, - pixelcolor::Rgb565, - prelude::{Dimensions, Point, RgbColor, Size}, - primitives::Rectangle, - text::{Alignment, Text}, -}; +use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, mutex::Mutex}; +use embassy_time::{Delay, Timer}; use embedded_hal_bus::spi::ExclusiveDevice; -use portable_atomic::AtomicBool; use st7365p_lcd::{FrameBuffer, ST7365P}; use static_cell::StaticCell; @@ -44,7 +32,6 @@ pub async fn init_display( reset: PIN_15, ) -> DISPLAY { let spi_device = ExclusiveDevice::new(spi, Output::new(cs, Level::Low), Delay).unwrap(); - defmt::info!("spi made"); let mut display = ST7365P::new( spi_device, Output::new(data, Level::Low), @@ -68,7 +55,6 @@ pub async fn init_display( pub async fn display_handler(mut display: DISPLAY) { loop { - defmt::info!("drawing"); FRAMEBUFFER .lock() .await diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 7b24eab..ec81cb6 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -3,6 +3,7 @@ #![cfg_attr(not(test), no_std)] #![cfg_attr(not(test), no_main)] +mod abi; mod display; mod peripherals; mod scsi; @@ -11,7 +12,7 @@ mod usb; mod utils; use crate::{ - display::{FRAMEBUFFER, display_handler, init_display}, + display::{display_handler, init_display}, peripherals::{ conf_peripherals, keyboard::{KeyCode, KeyState, read_keyboard_fifo}, @@ -22,9 +23,8 @@ use crate::{ use {defmt_rtt as _, panic_probe as _}; -use core::cell::RefCell; use embassy_executor::Spawner; -use embassy_futures::join::{join, join3}; +use embassy_futures::join::join3; use embassy_rp::{ gpio::{Input, Level, Output, Pull}, peripherals::{I2C1, USB}, @@ -32,20 +32,9 @@ use embassy_rp::{ usb as embassy_rp_usb, }; use embassy_rp::{i2c, i2c::I2c, spi}; -use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex; -use embassy_sync::mutex::Mutex; use embassy_time::{Delay, Timer}; -use embedded_graphics::{ - Drawable, - mono_font::{MonoTextStyle, ascii::FONT_6X10}, - pixelcolor::{BinaryColor, Rgb565}, - prelude::{Point, RgbColor}, - primitives::Rectangle, - text::{Text, TextStyle}, -}; use embedded_hal_bus::spi::ExclusiveDevice; use embedded_sdmmc::SdCard as SdmmcSdCard; -use heapless::String; embassy_rp::bind_interrupts!(struct Irqs { I2C1_IRQ => i2c::InterruptHandler; @@ -77,7 +66,6 @@ async fn main(_spawner: Spawner) { let display = init_display(spi, cs, data, reset).await; display_handler(display) }; - defmt::info!("ready"); let sdcard = { let mut config = spi::Config::default(); @@ -100,13 +88,5 @@ async fn main(_spawner: Spawner) { let usb = embassy_rp_usb::Driver::new(p.USB, Irqs); let usb_fut = usb_handler(usb, sdcard); - Text::new( - "Framebuffer works", - Point::new(100, 100), - MonoTextStyle::new(&FONT_6X10, Rgb565::GREEN), - ) - .draw(*FRAMEBUFFER.lock().await.get_mut().as_mut().unwrap()) - .unwrap(); - - display_fut.await; + join3(async { loop {} }, usb_fut, display_fut).await; }