From 87704909496302e2cb07a015d1c9a82f60a612dc Mon Sep 17 00:00:00 2001 From: ede1998 Date: Sun, 23 Aug 2026 16:41:43 +0200 Subject: [PATCH] wip refactor all hardware init in drivers --- src/bin/main.rs | 8 ++--- src/display.rs | 4 --- src/drivers.rs | 5 +++ src/drivers/i2c_bus.rs | 36 +++++++++++++++++++ src/{display => drivers}/primary_lcd.rs | 2 +- src/{display => drivers}/secondary_oled.rs | 2 +- .../shared_bus.rs => drivers/spi_bus.rs} | 8 ++--- src/{display => drivers}/tertiary_lcd.rs | 0 src/navigation/outputs.rs | 2 +- 9 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 src/drivers/i2c_bus.rs rename src/{display => drivers}/primary_lcd.rs (95%) rename src/{display => drivers}/secondary_oled.rs (95%) rename src/{display/shared_bus.rs => drivers/spi_bus.rs} (95%) rename src/{display => drivers}/tertiary_lcd.rs (100%) diff --git a/src/bin/main.rs b/src/bin/main.rs index f5809a2..59312a6 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -10,9 +10,9 @@ use alloc::boxed::Box; use creaturedex::card::decoder::split_nfc_hex; use creaturedex::card::model::Card; -use creaturedex::display::secondary_oled::SecondaryDisplay; -use creaturedex::display::shared_bus; -use creaturedex::display::tertiary_lcd::{TertiaryDisplay, init_tertiary_lcd, write_wrapped}; +use creaturedex::drivers::secondary_oled::SecondaryDisplay; +use creaturedex::drivers::spi_bus; +use creaturedex::drivers::tertiary_lcd::{TertiaryDisplay, init_tertiary_lcd, write_wrapped}; use creaturedex::drivers::nfc_pn532::NfcPn532Driver; use creaturedex::navigation::inputs::Inputs; use creaturedex::navigation::navigation::{self, CARD_DATA}; @@ -67,7 +67,7 @@ async fn main(spawner: Spawner) { let timg0 = TimerGroup::new(peripherals.TIMG0); esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0); - let (primary, mut secondaries) = shared_bus::DisplayPinConfiguration { + let (primary, mut secondaries) = spi_bus::DisplayPinConfiguration { spi_peripheral: peripherals.SPI2, sck: peripherals.GPIO36, mosi: peripherals.GPIO35, diff --git a/src/display.rs b/src/display.rs index 614d495..2013c3f 100644 --- a/src/display.rs +++ b/src/display.rs @@ -1,5 +1 @@ -pub mod primary_lcd; -pub mod secondary_oled; -pub mod shared_bus; pub mod sprite; -pub mod tertiary_lcd; diff --git a/src/drivers.rs b/src/drivers.rs index 0becd6c..a4704c0 100644 --- a/src/drivers.rs +++ b/src/drivers.rs @@ -1 +1,6 @@ +pub mod i2c_bus; pub mod nfc_pn532; +pub mod primary_lcd; +pub mod secondary_oled; +pub mod spi_bus; +pub mod tertiary_lcd; diff --git a/src/drivers/i2c_bus.rs b/src/drivers/i2c_bus.rs new file mode 100644 index 0000000..fecf1d2 --- /dev/null +++ b/src/drivers/i2c_bus.rs @@ -0,0 +1,36 @@ +use alloc::boxed::Box; +use embedded_hal_bus::util::AtomicCell; +use esp_hal::gpio::interconnect::PeripheralInput; +use esp_hal::i2c::master::Config; +use esp_hal::{gpio::interconnect::PeripheralOutput, i2c::master::I2c}; + +type InnerI2cBus = esp_hal::i2c::master::I2c<'static, esp_hal::Blocking>; +pub type I2cBus = &'static AtomicCell; + +pub struct I2cBusPinConfiguration { + pub i2c_peripheral: I2C, + pub scl: SCL, + pub sda: SDA, +} + +impl I2cBusPinConfiguration +where + I2C: esp_hal::i2c::master::Instance + 'static, + SCL: PeripheralOutput<'static> + PeripheralInput<'static>, + SDA: PeripheralOutput<'static> + PeripheralInput<'static>, +{ + pub fn build(self) -> I2cBus { + let config = Config::default().with_frequency(esp_hal::time::Rate::from_khz(400)); + let i2c = match I2c::new(self.i2c_peripheral, config) { + Ok(bus) => bus.with_sda(self.sda).with_scl(self.scl), + Err(e) => { + log::error!("Shared I2C bus initialization failed for GPIO17/GPIO18: {e:?}"); + panic!("Shared I2C bus initialization failed"); + } + }; + let shared_i2c = Box::leak(Box::new(AtomicCell::new(i2c))); + log::info!("Shared I2C bus ready on GPIO17 (SDA) and GPIO18 (SCL)"); + + shared_i2c + } +} diff --git a/src/display/primary_lcd.rs b/src/drivers/primary_lcd.rs similarity index 95% rename from src/display/primary_lcd.rs rename to src/drivers/primary_lcd.rs index 9759d51..34a4a8c 100644 --- a/src/display/primary_lcd.rs +++ b/src/drivers/primary_lcd.rs @@ -8,7 +8,7 @@ use esp_hal::delay::Delay; use esp_hal::gpio::Output; use ili9341::{DisplaySize240x320, Ili9341, Orientation}; -use crate::display::shared_bus::{DisplaySpiBus, SharedOutput}; +use crate::drivers::spi_bus::{DisplaySpiBus, SharedOutput}; type GenericPrimaryDisplay<'a, BUS, DC, RES> = Ili9341, Delay>, DC>, RES>; diff --git a/src/display/secondary_oled.rs b/src/drivers/secondary_oled.rs similarity index 95% rename from src/display/secondary_oled.rs rename to src/drivers/secondary_oled.rs index 92d624d..86b6101 100644 --- a/src/display/secondary_oled.rs +++ b/src/drivers/secondary_oled.rs @@ -6,7 +6,7 @@ use embedded_hal_bus::util::AtomicCell; use esp_hal::delay::Delay; use esp_hal::gpio::Output; -use crate::display::shared_bus::{DisplaySpiBus, SharedOutput, SharedReset}; +use crate::drivers::spi_bus::{DisplaySpiBus, SharedOutput, SharedReset}; pub type GenericSecondaryDisplay<'a, BUS, RST, DC> = Ch1115, Delay>, DC>, RST, Size128x64>; diff --git a/src/display/shared_bus.rs b/src/drivers/spi_bus.rs similarity index 95% rename from src/display/shared_bus.rs rename to src/drivers/spi_bus.rs index 9ab78bf..036b1a5 100644 --- a/src/display/shared_bus.rs +++ b/src/drivers/spi_bus.rs @@ -9,10 +9,10 @@ use esp_hal::spi::Mode; use esp_hal::spi::master::{Config as SpiConfig, Spi}; use esp_hal::time::Rate; -use crate::display::primary_lcd::PrimaryDisplay; -use crate::display::primary_lcd::PrimaryDisplayPinConfiguration; -use crate::display::secondary_oled::SecondaryDisplay; -use crate::display::secondary_oled::SecondaryDisplayPinConfiguration; +use crate::drivers::primary_lcd::PrimaryDisplay; +use crate::drivers::primary_lcd::PrimaryDisplayPinConfiguration; +use crate::drivers::secondary_oled::SecondaryDisplay; +use crate::drivers::secondary_oled::SecondaryDisplayPinConfiguration; use core::cell::RefCell; use embassy_sync::blocking_mutex::Mutex as BlockingMutex; diff --git a/src/display/tertiary_lcd.rs b/src/drivers/tertiary_lcd.rs similarity index 100% rename from src/display/tertiary_lcd.rs rename to src/drivers/tertiary_lcd.rs diff --git a/src/navigation/outputs.rs b/src/navigation/outputs.rs index 98257a2..03aba5a 100644 --- a/src/navigation/outputs.rs +++ b/src/navigation/outputs.rs @@ -3,7 +3,7 @@ use embedded_graphics::{ pixelcolor::{Rgb565, RgbColor as _}, }; -use crate::display::{ +use crate::drivers::{ primary_lcd::PrimaryDisplay, secondary_oled::SecondaryDisplay, tertiary_lcd::TertiaryDisplay, };