From 736ff352af52957e71c9f69fe97469c1a471e7c4 Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Wed, 28 Jan 2026 17:47:43 +0100 Subject: [PATCH] display poc working --- Cargo.lock | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 +++ src/main.rs | 59 ++++++++++++++++++++++++++++++----- 3 files changed, 143 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f7b2ba..18a0374 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,6 +101,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + [[package]] name = "bytemuck" version = "1.24.0" @@ -259,6 +265,7 @@ dependencies = [ "cortex-m", "cortex-m-rt", "critical-section", + "display-interface-spi", "embassy-embedded-hal", "embassy-executor", "embassy-futures", @@ -267,8 +274,29 @@ dependencies = [ "embassy-time", "embassy-usb", "embassy-usb-logger", + "embedded-graphics", + "embedded-hal-bus", "heapless 0.9.2", "log", + "mipidsi", +] + +[[package]] +name = "display-interface" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba2aab1ef3793e6f7804162debb5ac5edb93b3d650fbcc5aeb72fcd0e6c03a0" + +[[package]] +name = "display-interface-spi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9ec30048b1955da2038fcc3c017f419ab21bb0001879d16c0a3749dc6b7a" +dependencies = [ + "byte-slice-cast", + "display-interface", + "embedded-hal 1.0.0", + "embedded-hal-async", ] [[package]] @@ -497,6 +525,29 @@ dependencies = [ "log", ] +[[package]] +name = "embedded-graphics" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0649998afacf6d575d126d83e68b78c0ab0e00ca2ac7e9b3db11b4cbe8274ef0" +dependencies = [ + "az", + "byteorder", + "embedded-graphics-core", + "float-cmp", + "micromath", +] + +[[package]] +name = "embedded-graphics-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044" +dependencies = [ + "az", + "byteorder", +] + [[package]] name = "embedded-hal" version = "0.2.7" @@ -522,6 +573,16 @@ dependencies = [ "embedded-hal 1.0.0", ] +[[package]] +name = "embedded-hal-bus" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513e0b3a8fb7d3013a8ae17a834283f170deaf7d0eeab0a7c1a36ad4dd356d22" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", +] + [[package]] name = "embedded-hal-nb" version = "1.0.0" @@ -601,6 +662,15 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -783,6 +853,24 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "micromath" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" + +[[package]] +name = "mipidsi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba34dcbf61182ffa6992b5a4d9b566d5a99df127fd93f6d314213347329e92f" +dependencies = [ + "embedded-graphics-core", + "embedded-hal 1.0.0", + "heapless 0.8.0", + "nb 1.1.0", +] + [[package]] name = "nb" version = "0.1.3" diff --git a/Cargo.toml b/Cargo.toml index 539e128..3b3c2a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,10 @@ critical-section = "1.2.0" heapless = "0.9.2" log = "0.4" +display-interface-spi = "0.5.0" +mipidsi = "0.9.0" +embedded-hal-bus = "0.3.0" +embedded-graphics = "0.8.1" [profile.dev] codegen-units = 1 diff --git a/src/main.rs b/src/main.rs index 507ed47..336ec5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,10 +2,24 @@ #![no_main] use embassy_executor::Spawner; -use embassy_rp::{bind_interrupts, gpio, peripherals::USB, usb::Driver}; +use embassy_rp::{ + bind_interrupts, gpio, + peripherals::USB, + spi::{self, Spi}, + usb::Driver, +}; use embassy_time::Timer; +use embedded_graphics::{ + mono_font::{MonoTextStyle, iso_8859_1::FONT_10X20}, + pixelcolor::{BinaryColor, Rgb565, Rgb666}, + prelude::{Point, *}, + primitives::{Circle, PrimitiveStyle}, + text::Text, +}; +use embedded_hal_bus::spi::ExclusiveDevice; use gpio::{Level, Output}; use log::{error, info}; +use mipidsi::{Builder, interface::SpiInterface, models::ST7789, options::ColorOrder}; #[panic_handler] fn panic(info: &core::panic::PanicInfo) -> ! { @@ -30,15 +44,44 @@ async fn main(spawner: Spawner) { let driver = Driver::new(p.USB, Irqs); spawner.must_spawn(logger_task(driver)); - let mut led = Output::new(p.PIN_25, Level::Low); + let mut spi_cfg = spi::Config::default(); + spi_cfg.frequency = 62_500_000; + + let inner = p.SPI0; + let clk = p.PIN_18; + let mosi = p.PIN_19; + let cs = p.PIN_17; + let dc = p.PIN_16; + let rst = p.PIN_15; + + let spi = Spi::new_blocking_txonly(inner, clk, mosi, spi_cfg); + // let spi = Spi::new_txonly(inner, clk, mosi, p.DMA_CH0, spi_cfg); + let cs_display = Output::new(cs, Level::Low); + let dc_display = Output::new(dc, Level::Low); + let mut rst_display = Output::new(rst, Level::Low); + + rst_display.set_low(); + Timer::after_millis(10).await; + rst_display.set_high(); + Timer::after_millis(120).await; + + let spi_dev = ExclusiveDevice::new_no_delay(spi, cs_display).unwrap(); + + let mut buffer = [0u8; 512]; + let di = SpiInterface::new(spi_dev, dc_display, &mut buffer); + + let mut display = Builder::new(ST7789, di) + .display_size(240, 320) + .init(&mut embassy_time::Delay) + .unwrap(); + + display.clear(Rgb565::BLACK).unwrap(); + Circle::new(Point::new(70, 100), 80) + .into_styled(PrimitiveStyle::with_fill(Rgb565::RED)) + .draw(&mut display) + .unwrap(); loop { - info!("led on!"); - led.set_high(); - Timer::after_secs(1).await; - - info!("led off!"); - led.set_low(); Timer::after_secs(1).await; } }