refactor all hardware init in drivers
This commit is contained in:
@@ -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<InnerI2cBus>;
|
||||
|
||||
pub struct I2cBusPinConfiguration<I2C, SCL, SDA> {
|
||||
pub i2c_peripheral: I2C,
|
||||
pub scl: SCL,
|
||||
pub sda: SDA,
|
||||
}
|
||||
|
||||
impl<I2C, SCL, SDA> I2cBusPinConfiguration<I2C, SCL, SDA>
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user