From 2c32b306c1543e826f58d8f9c6c0ae7729c40b28 Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Fri, 17 Oct 2025 07:29:39 -0700 Subject: [PATCH] feat: ili9341 :333 --- Cargo.lock | 208 ++++++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 5 ++ src/main.rs | 135 ++++++++++++++++++++++++++++++---- 3 files changed, 321 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7c5108..083a7f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,30 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "allocator-api2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c583acf993cf4245c4acb0a2cc2ab1f9cc097de73411bb6d3647ff6af2b1013d" + [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "bitfield" version = "0.19.1" @@ -25,7 +43,7 @@ checksum = "3787a07661997bfc05dd3431e379c0188573f78857080cf682e1393ab8e4d64c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -38,12 +56,23 @@ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" name = "blinky" version = "0.1.0" dependencies = [ + "display-interface-spi", + "embedded-graphics", + "embedded-hal-bus", + "esp-alloc", "esp-backtrace", "esp-bootloader-esp-idf", "esp-hal", "esp-println", + "ili9341", ] +[[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" @@ -62,6 +91,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +[[package]] +name = "const-default" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa" + [[package]] name = "critical-section" version = "1.2.0" @@ -99,7 +134,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.102", ] [[package]] @@ -110,7 +145,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -121,7 +156,7 @@ checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -133,6 +168,24 @@ dependencies = [ "crypto-common", ] +[[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]] name = "document-features" version = "0.2.11" @@ -211,6 +264,29 @@ dependencies = [ "nb 1.1.0", ] +[[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" @@ -236,6 +312,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-io" version = "0.6.1" @@ -299,7 +385,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -308,6 +394,22 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "esp-alloc" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641e43d6a60244429117ef2fa7a47182120c7561336ea01f6fb08d634f46bae1" +dependencies = [ + "allocator-api2", + "cfg-if", + "document-features", + "enumset", + "esp-config", + "esp-sync", + "linked_list_allocator", + "rlsf", +] + [[package]] name = "esp-backtrace" version = "0.18.0" @@ -414,7 +516,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.102", "termcolor", ] @@ -544,6 +646,15 @@ dependencies = [ "vcell", ] +[[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" @@ -652,6 +763,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "ili9341" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc105605dba076630f5a1a22ba80bcff216af2619859f1595e9ddd72b89db30a" +dependencies = [ + "display-interface", + "embedded-graphics-core", + "embedded-hal 1.0.0", +] + [[package]] name = "indexmap" version = "2.11.4" @@ -678,7 +800,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -708,9 +830,21 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "linked_list_allocator" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + [[package]] name = "litrs" version = "0.4.1" @@ -729,6 +863,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "micromath" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" + [[package]] name = "nb" version = "0.1.3" @@ -846,7 +986,7 @@ checksum = "7d323d13972c1b104aa036bc692cd08b822c8bbf23d79a27c526095856499799" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -875,7 +1015,7 @@ checksum = "15c3138fdd8d128b2d81829842a3e0ce771b3712f7b6318ed1476b0695e7d330" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -884,6 +1024,18 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1376b15f3ff160e9b1e8ea564ce427f2f6fcf77528cc0a8bf405cb476f9cea7" +[[package]] +name = "rlsf" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222fb240c3286247ecdee6fa5341e7cdad0ffdf8e7e401d9937f2d58482a20bf" +dependencies = [ + "cfg-if", + "const-default", + "libc", + "svgbobdoc", +] + [[package]] name = "rustversion" version = "1.0.20" @@ -923,7 +1075,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] [[package]] @@ -985,7 +1137,31 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.102", +] + +[[package]] +name = "svgbobdoc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c04b93fc15d79b39c63218f15e3fdffaa4c227830686e3b7c5f41244eb3e50" +dependencies = [ + "base64", + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-width", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -1056,6 +1232,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -1199,5 +1381,5 @@ checksum = "96fb42cd29c42f8744c74276e9f5bee7b06685bbe5b88df891516d72cb320450" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.102", ] diff --git a/Cargo.toml b/Cargo.toml index 56674c5..e2684b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,10 @@ edition = "2021" license = "MIT OR Apache-2.0" [dependencies] +display-interface-spi = "0.5.0" +embedded-graphics = "0.8.1" +embedded-hal-bus = "0.3.0" +esp-alloc = { version = "0.9.0", features = ["esp32c3"] } esp-backtrace = { version = "0.18.0", features = [ "esp32c3", "panic-handler", @@ -17,3 +21,4 @@ esp-hal = { version = "1.0.0-rc.1",features = [ "unstable", ] } esp-println = { version = "0.16.0", features = ["esp32c3", "log-04"] } +ili9341 = "0.6.0" diff --git a/src/main.rs b/src/main.rs index bd872e3..bd10edc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,32 +2,139 @@ #![no_main] use esp_backtrace as _; +use embedded_graphics::{ + mono_font::{ + ascii::FONT_8X13, + MonoTextStyle, + MonoFont, + }, + pixelcolor::Rgb565, + prelude::*, + primitives::{ + Line, + PrimitiveStyle, + PrimitiveStyleBuilder, + Rectangle, + Triangle, + }, + text::{ + Alignment, + Text, + }, +}; +use display_interface_spi::{SPIInterface, *}; +use embedded_hal_bus::spi::{ExclusiveDevice, NoDelay}; use esp_hal::{ + rng::Rng, + timer::timg::TimerGroup, delay::Delay, - gpio::{Level, Output, OutputConfig}, + gpio::{ + OutputPin, InputPin, + AnyPin, Level, Input, Output, OutputConfig}, + peripherals::{ADC1, Peripherals, SPI2}, + spi::{ + master::{Config, Spi}, + Mode, + }, + clock::CpuClock, + time::Rate, + Blocking, main, + init, +}; +use ili9341::{ + DisplaySize240x320, + Ili9341, + Orientation, }; use esp_println::println; esp_bootloader_esp_idf::esp_app_desc!(); -#[main] -fn main() -> ! { - let peripherals = esp_hal::init(esp_hal::Config::default()); +type TFTSpiDevice<'spi> = ExclusiveDevice, Output<'spi>, NoDelay>; +type TFTSpiInterface<'spi> = +SPIInterface, Output<'spi>, NoDelay>, Output<'spi>>; - println!("Hello world!"); +pub struct TFT<'spi> { + display: Ili9341, Output<'spi>>, +} - // Set GPIO7 as an output, and set its state high initially. - let mut led = Output::new(peripherals.GPIO8, Level::Low, OutputConfig::default()); +impl<'spi> TFT<'spi> { + pub fn new( + spi2: SPI2<'spi>, + sclk: impl OutputPin + 'spi, + miso: impl InputPin + 'spi, + mosi: impl OutputPin + 'spi, + cs: impl OutputPin + 'spi, + rst: impl OutputPin + 'spi, + dc: impl OutputPin + 'spi, + ) -> TFT<'spi> { + let rst_output = Output::new(rst, Level::Low, OutputConfig::default()); + let dc_output = Output::new(dc, Level::Low, OutputConfig::default()); + let spi = Spi::new(spi2, Self::create_config()) + .unwrap() + .with_sck(sclk) + .with_miso(miso) // order matters + .with_mosi(mosi) // order matters + ; + let cs_output = Output::new(cs, Level::High, OutputConfig::default()); + let spi_device = ExclusiveDevice::new_no_delay(spi, cs_output).unwrap(); + let interface = SPIInterface::new(spi_device, dc_output); - led.set_high(); + let mut display = Ili9341::new( + interface, + rst_output, + &mut Delay::new(), + Orientation::Landscape, + DisplaySize240x320, + ).unwrap(); - // Initialize the Delay peripheral, and use it to toggle the LED state in a - // loop. - let delay = Delay::new(); + TFT { display } + } - loop { - led.toggle(); - delay.delay_millis(500); + fn create_config() -> Config { + Config::default() + .with_frequency(Rate::from_mhz(10)) + .with_mode(Mode::_0) + } + + pub fn clear(&mut self, color: Rgb565) { + self.display.clear(color).unwrap(); + } + + pub fn part_clear(&mut self, x: i32, y: i32, w: u32, h: u32) { + Rectangle::new(Point::new(x, y), Size::new(w, h)) + .into_styled(PrimitiveStyle::with_fill(Rgb565::WHITE)) + .draw(&mut self.display) + .unwrap(); + } + + pub fn println(&mut self, text: &str, x: i32, y: i32) { + let style = MonoTextStyle::new(&FONT_8X13, Rgb565::RED); + Text::with_alignment(text, Point::new(x, y), style, Alignment::Center) + .draw(&mut self.display) + .unwrap(); + } +} + +#[main] +fn main() -> ! { + let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max()); + let peripherals: Peripherals = init(config); + esp_alloc::heap_allocator!(size: 72*1024); + + let dc = peripherals.GPIO9; + let mosi = peripherals.GPIO6; // sdo -> MOSI + let sclk = peripherals.GPIO4; + let miso = peripherals.GPIO5; // sdi -> MISO + let cs = peripherals.GPIO7; + let rst = peripherals.GPIO0; + + let mut tft = TFT::new(peripherals.SPI2, sclk, miso, mosi, cs, rst, dc); + tft.clear(Rgb565::WHITE); + tft.println("nya~! -w-", 100, 40); + + loop { + // your business logic } }