diff --git a/Cargo.lock b/Cargo.lock index 66730f3..da195fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,12 +50,24 @@ dependencies = [ "unwrap-infallible", ] +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "bare-metal" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cfg-if" version = "1.0.3" @@ -68,6 +80,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" +[[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" @@ -100,6 +122,37 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca" +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[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", + "nb 1.1.0", +] + [[package]] name = "nb" version = "0.1.3" @@ -145,6 +198,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "1.0.109" @@ -162,7 +221,9 @@ version = "0.1.0" dependencies = [ "atmega-hal", "avr-device", + "embedded-graphics-core", "embedded-hal 1.0.0", + "mipidsi", "panic-halt", "ufmt", ] diff --git a/Cargo.toml b/Cargo.toml index 854de8f..43aef42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,11 +5,13 @@ edition = "2024" [dependencies] panic-halt = "1.0.0" -avr-device = { version = "0.7", features = ["rt"] } -embedded-hal = "1.0" +avr-device = { version = "*", features = ["rt"] } +embedded-hal = "1.0.0" atmega-hal = { git = "https://github.com/Rahix/avr-hal?tab=readme-ov-file", rev="cd3edea", version = "0.1.0", features=["atmega328p"] } ufmt = "0.2.0" +mipidsi = "0.9.0" +embedded-graphics-core = "0.4.0" # nb = "1.1.0" # pwm-pca9685 = "1.0.0" # infrared = "0.14.1" diff --git a/src/main.rs b/src/main.rs index 4b7f7f4..08696f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,40 +4,71 @@ #![no_std] #![no_main] -use atmega_hal::{Usart, usart::Baudrate}; -use embedded_hal::delay::DelayNs; +use core::convert::Infallible; + +use atmega_hal::{ + Spi, Usart, + prelude::_embedded_hal_blocking_spi_Write, + spi::{self, Settings}, + usart::Baudrate, +}; +use embedded_graphics_core::{ + draw_target::DrawTarget, + pixelcolor::Rgb565, + prelude::{Point, RgbColor, Size}, + primitives::Rectangle, +}; +use embedded_hal::spi::{Operation, SpiBus}; +use embedded_hal::{delay::DelayNs, spi::ErrorType, spi::SpiDevice}; use panic_halt as _; type CoreClock = atmega_hal::clock::MHz8; +struct Device { + spi: Spi, + delay: T, +} + +impl embedded_hal::spi::ErrorType for Device { + type Error = Infallible; +} + +impl embedded_hal::spi::SpiDevice for Device { + fn transaction( + &mut self, + operations: &mut [embedded_hal::spi::Operation<'_, u8>], + ) -> Result<(), Self::Error> { + for op in operations { + match op { + Operation::Read(items) => { + self.spi.read(*items)?; + } + Operation::Write(items) => { + SpiBus::write(&mut self.spi, *items)?; + } + Operation::Transfer(read, write) => { + self.spi.transfer(read, write)?; + } + Operation::TransferInPlace(items) => { + self.spi.transfer_in_place(items)?; + } + Operation::DelayNs(time) => { + self.delay.delay_ns(*time); + } + } + } + Ok(()) + } +} + #[avr_device::entry] fn main() -> ! { let dp = atmega_hal::Peripherals::take().unwrap(); let pins = atmega_hal::pins!(dp); - let a0 = pins.pc0; - let a1 = pins.pc1; - let a2 = pins.pc2; - let a3 = pins.pc3; - - let mosi = pins.pb3; - let miso = pins.pb4; - let sck = pins.pb5; - let rx = pins.pd0; let tx = pins.pd1; - let d2 = pins.pd2; - let d3 = pins.pd3; - let d4 = pins.pd4; - let d5 = pins.pd5; - let d6 = pins.pd6; - let d7 = pins.pd7; - let d9 = pins.pb1; - let d10 = pins.pb2; - let mut led = pins.pb0.into_output(); - led.set_high(); - let mut delay = atmega_hal::delay::Delay::::new(); let mut serial = Usart::new( dp.USART0, rx, @@ -45,9 +76,63 @@ fn main() -> ! { Baudrate::::new(57600), ); + let (mut spi, mut cs) = spi::Spi::new( + dp.SPI, + pins.pb5.into_output(), + pins.pb3.into_output(), + pins.pb4.into_pull_up_input(), + pins.pb2.into_output(), + Settings { + data_order: spi::DataOrder::MostSignificantFirst, + clock: spi::SerialClockRate::OscfOver2, + mode: embedded_hal::spi::Mode { + polarity: embedded_hal::spi::Polarity::IdleHigh, + phase: embedded_hal::spi::Phase::CaptureOnFirstTransition, + }, + }, + ); + + // Create a buffer + let mut buffer = [0_u8; 512]; + let di = mipidsi::interface::SpiInterface::new( + Device { + spi, + delay: atmega_hal::delay::Delay::::new(), + }, + pins.pb1.into_output(), + &mut buffer, + ); + + let mut builder_delay = atmega_hal::delay::Delay::::new(); + let mut display = mipidsi::Builder::new(mipidsi::models::ST7789, di) + .reset_pin(pins.pd7.into_output()) + .init(&mut builder_delay) + .unwrap(); + + display.clear(Rgb565::GREEN).unwrap(); + + let mut delay = atmega_hal::delay::Delay::::new(); + let mut color = 0; loop { - led.toggle(); + display + .clear(Rgb565::new(color % 255, color % 40, color % 100)) + .unwrap(); + display + .fill_solid( + &Rectangle { + top_left: Point { x: 50, y: 50 }, + size: Size { + width: 100, + height: 100, + }, + }, + Rgb565::RED, + ) + .unwrap(); + color += 40; + // inner_led.toggle(); + // other_led.toggle(); delay.delay_ms(1000); - ufmt::uwriteln!(&mut serial, "Hello from ATmega!\r").unwrap(); + ufmt::uwriteln!(&mut serial, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA").unwrap(); } }