feat: ili9341 :333

This commit is contained in:
Kat Inskip 2025-10-17 07:29:39 -07:00
parent 7888da2541
commit 2c32b306c1
Signed by: kat
GPG key ID: 465E64DECEA8CF0F
3 changed files with 321 additions and 27 deletions

208
Cargo.lock generated
View file

@ -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",
]

View file

@ -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"

View file

@ -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!();
type TFTSpiDevice<'spi> = ExclusiveDevice<Spi<'spi, Blocking>, Output<'spi>, NoDelay>;
type TFTSpiInterface<'spi> =
SPIInterface<ExclusiveDevice<Spi<'spi, Blocking>, Output<'spi>, NoDelay>, Output<'spi>>;
pub struct TFT<'spi> {
display: Ili9341<TFTSpiInterface<'spi>, Output<'spi>>,
}
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);
let mut display = Ili9341::new(
interface,
rst_output,
&mut Delay::new(),
Orientation::Landscape,
DisplaySize240x320,
).unwrap();
TFT { display }
}
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 peripherals = esp_hal::init(esp_hal::Config::default());
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals: Peripherals = init(config);
esp_alloc::heap_allocator!(size: 72*1024);
println!("Hello world!");
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;
// Set GPIO7 as an output, and set its state high initially.
let mut led = Output::new(peripherals.GPIO8, Level::Low, OutputConfig::default());
led.set_high();
// Initialize the Delay peripheral, and use it to toggle the LED state in a
// loop.
let delay = Delay::new();
let mut tft = TFT::new(peripherals.SPI2, sclk, miso, mosi, cs, rst, dc);
tft.clear(Rgb565::WHITE);
tft.println("nya~! -w-", 100, 40);
loop {
led.toggle();
delay.delay_millis(500);
// your business logic
}
}