diff --git a/esp-hal/src/gpio/lp_io.rs b/esp-hal/src/gpio/lp_io.rs index a48deb6dc53..d9d887b9a09 100644 --- a/esp-hal/src/gpio/lp_io.rs +++ b/esp-hal/src/gpio/lp_io.rs @@ -248,6 +248,10 @@ macro_rules! lp_gpio { }); } } + + fn functions(&self, _: crate::private::Internal) -> &'static [$crate::gpio::RtcFunction] { + &[$crate::gpio::RtcFunction::_0, $crate::gpio::RtcFunction::_1, /* macros hard :'( */] + } } #[cfg_attr(docsrs, doc(cfg(feature = "unstable")))] diff --git a/esp-hal/src/gpio/mod.rs b/esp-hal/src/gpio/mod.rs index 3f423181bc2..6a8b9f989b0 100644 --- a/esp-hal/src/gpio/mod.rs +++ b/esp-hal/src/gpio/mod.rs @@ -353,13 +353,24 @@ impl TryFrom for AlternateFunction { #[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg(not(esp32h2))] pub enum RtcFunction { + /// Rtc function 0. + _0 = 0, + /// Rtc function 1. + _1 = 1, + /// Rtc function 2. + _2 = 2, + /// Rtc function 3. + _3 = 3, +} + +#[cfg(not(esp32h2))] +impl RtcFunction { /// RTC mode. - Rtc = 0, + pub const RTC: Self = Self::_0; + + #[allow(unused)] /// Digital mode. - Digital = 1, - /// RTC_I2C mode. - #[cfg(soc_has_rtc_i2c)] - I2c = 3, + pub const DIGITAL: Self = Self::_1; } /// Trait implemented by RTC pins @@ -379,6 +390,10 @@ pub trait RtcPin: Pin { #[doc(hidden)] fn rtcio_pad_hold(&self, enable: bool); + #[cfg(any(xtensa, esp32c6))] + #[doc(hidden)] + fn functions(&self, _: private::Internal) -> &'static [RtcFunction]; + /// # Safety /// /// The `level` argument needs to be a valid setting for the @@ -2283,6 +2298,13 @@ impl RtcPin for AnyPin<'_> { } } + #[cfg(any(xtensa, esp32c6))] + fn functions(&self, i: private::Internal) -> &'static [RtcFunction] { + for_each_rtcio_pin! { + (self, target) => { RtcPin::functions(&target, i) }; + } + } + #[cfg(any(esp32c2, esp32c3, esp32c6))] unsafe fn apply_wakeup(&self, wakeup: bool, level: u8) { for_each_rtcio_pin! { diff --git a/esp-hal/src/gpio/rtc_io.rs b/esp-hal/src/gpio/rtc_io.rs index 084f5236a5b..dca74876547 100644 --- a/esp-hal/src/gpio/rtc_io.rs +++ b/esp-hal/src/gpio/rtc_io.rs @@ -48,7 +48,7 @@ impl<'d, const PIN: u8> LowPowerOutput<'d, PIN> { where P: OutputPin + RtcPin + 'd, { - pin.rtc_set_config(false, true, RtcFunction::Rtc); + pin.rtc_set_config(false, true, RtcFunction::RTC); let this = Self { phantom: PhantomData, @@ -84,7 +84,7 @@ impl<'d, const PIN: u8> LowPowerInput<'d, PIN> { where P: InputPin + RtcPin + 'd, { - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); let this = Self { phantom: PhantomData, @@ -128,7 +128,7 @@ impl<'d, const PIN: u8> LowPowerOutputOpenDrain<'d, PIN> { where P: InputPin + OutputPin + RtcPin + 'd, { - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); let this = Self { phantom: PhantomData, diff --git a/esp-hal/src/i2c/rtc.rs b/esp-hal/src/i2c/rtc.rs index 7fc70be52d4..be51c0f78dd 100644 --- a/esp-hal/src/i2c/rtc.rs +++ b/esp-hal/src/i2c/rtc.rs @@ -88,12 +88,18 @@ const RC_FAST_CLK: u32 = property!("soc.rc_fast_clk_default"); pub trait Sda: RtcPin + OutputPin + InputPin { #[doc(hidden)] fn selector(&self) -> u8; + + #[doc(hidden)] + fn function(&self) -> RtcFunction; } /// Trait representing the RTC_I2C SCL pin. pub trait Scl: RtcPin + OutputPin + InputPin { #[doc(hidden)] fn selector(&self) -> u8; + + #[doc(hidden)] + fn function(&self) -> RtcFunction; } for_each_lp_function! { @@ -102,6 +108,10 @@ for_each_lp_function! { fn selector(&self) -> u8 { $n } + + fn function(&self) -> RtcFunction { + RtcFunction::_3 + } } }; (($_func:ident, SAR_I2C_SDA_n, $n:literal), $gpio:ident) => { @@ -109,6 +119,10 @@ for_each_lp_function! { fn selector(&self) -> u8 { $n } + + fn function(&self) -> RtcFunction { + RtcFunction::_3 + } } }; } @@ -182,7 +196,7 @@ impl<'d> I2c<'d> { rtc_io .rtc_gpio_enable_w1ts() .write(|w| unsafe { w.rtc_gpio_enable_w1ts().bits(1 << scl.number()) }); - scl.rtc_set_config(true, true, RtcFunction::I2c); + scl.rtc_set_config(true, true, scl.function()); } { @@ -194,7 +208,7 @@ impl<'d> I2c<'d> { rtc_io .rtc_gpio_enable_w1ts() .write(|w| unsafe { w.rtc_gpio_enable_w1ts().bits(1 << sda.number()) }); - sda.rtc_set_config(true, true, RtcFunction::I2c); + sda.rtc_set_config(true, true, sda.function()); } rtc_io.sar_i2c_io().write(|w| unsafe { diff --git a/esp-hal/src/rtc_cntl/sleep/esp32.rs b/esp-hal/src/rtc_cntl/sleep/esp32.rs index e696b125e67..516746984bc 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32.rs @@ -113,7 +113,7 @@ impl WakeSource for Ext0WakeupSource

{ // set pin to RTC function self.pin .borrow_mut() - .rtc_set_config(true, true, RtcFunction::Rtc); + .rtc_set_config(true, true, RtcFunction::RTC); unsafe { // set pin register field @@ -135,7 +135,7 @@ impl Drop for Ext0WakeupSource

{ // to IO_MUX) self.pin .borrow_mut() - .rtc_set_config(true, false, RtcFunction::Rtc); + .rtc_set_config(true, false, RtcFunction::RTC); } } @@ -154,7 +154,7 @@ impl WakeSource for Ext1WakeupSource<'_, '_> { let mut pins = self.pins.borrow_mut(); let mut bits = 0u32; for pin in pins.iter_mut() { - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); bits |= 1 << pin.rtc_number(); } @@ -182,7 +182,7 @@ impl Drop for Ext1WakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for pin in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } diff --git a/esp-hal/src/rtc_cntl/sleep/esp32c2.rs b/esp-hal/src/rtc_cntl/sleep/esp32c2.rs index 602a88bb248..2df4af312f0 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32c2.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32c2.rs @@ -179,7 +179,7 @@ fn isolate_digital_gpio() { // make pad work as gpio (otherwise, deep_sleep bottom current will rise) io_mux .gpio(pin_num) - .modify(|_, w| unsafe { w.mcu_sel().bits(RtcFunction::Digital as u8) }); + .modify(|_, w| unsafe { w.mcu_sel().bits(RtcFunction::DIGITAL as u8) }); } } } @@ -249,7 +249,7 @@ impl WakeSource for RtcioWakeupSource<'_, '_> { // to IO_MUX) // let mut pins = self.pins.borrow_mut(); // for (pin, _level) in pins.iter_mut() { -// pin.rtc_set_config(true, false, RtcFunction::Rtc); +// pin.rtc_set_config(true, false, RtcFunction::RTC); // } // } // } diff --git a/esp-hal/src/rtc_cntl/sleep/esp32c3.rs b/esp-hal/src/rtc_cntl/sleep/esp32c3.rs index 4d3f0dbf4ee..e6e4c248b5f 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32c3.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32c3.rs @@ -180,7 +180,7 @@ fn isolate_digital_gpio() { // make pad work as gpio (otherwise, deep_sleep bottom current will rise) io_mux .gpio(pin_num) - .modify(|_, w| unsafe { w.mcu_sel().bits(RtcFunction::Digital as u8) }); + .modify(|_, w| unsafe { w.mcu_sel().bits(RtcFunction::DIGITAL as u8) }); } } } @@ -250,7 +250,7 @@ impl WakeSource for RtcioWakeupSource<'_, '_> { // to IO_MUX) // let mut pins = self.pins.borrow_mut(); // for (pin, _level) in pins.iter_mut() { -// pin.rtc_set_config(true, false, RtcFunction::Rtc); +// pin.rtc_set_config(true, false, RtcFunction::RTC); // } // } // } diff --git a/esp-hal/src/rtc_cntl/sleep/esp32c6.rs b/esp-hal/src/rtc_cntl/sleep/esp32c6.rs index b5873212475..39285c91093 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32c6.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32c6.rs @@ -77,7 +77,7 @@ impl Ext1WakeupSource<'_, '_> { fn uninit_pin(pin: impl RtcPin, wakeup_pins: u8) { if wakeup_pins & (1 << pin.number()) != 0 { pin.rtcio_pad_hold(false); - pin.rtc_set_config(false, false, RtcFunction::Rtc); + pin.rtc_set_config(false, false, RtcFunction::RTC); } } @@ -114,7 +114,7 @@ impl WakeSource for Ext1WakeupSource<'_, '_> { WakeupLevel::Low => 0, }; - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); pin.rtcio_pad_hold(true); } @@ -142,7 +142,7 @@ impl Drop for Ext1WakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for (pin, _level) in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } diff --git a/esp-hal/src/rtc_cntl/sleep/esp32s2.rs b/esp-hal/src/rtc_cntl/sleep/esp32s2.rs index e721d2780c4..a220510c0c5 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32s2.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32s2.rs @@ -125,7 +125,7 @@ impl WakeSource for Ext0WakeupSource

{ // set pin to RTC function self.pin .borrow_mut() - .rtc_set_config(true, true, RtcFunction::Rtc); + .rtc_set_config(true, true, RtcFunction::RTC); // rtcio_hal_ext0_set_wakeup_pin unsafe { @@ -150,7 +150,7 @@ impl Drop for Ext0WakeupSource

{ // to IO_MUX) self.pin .borrow_mut() - .rtc_set_config(true, false, RtcFunction::Rtc); + .rtc_set_config(true, false, RtcFunction::RTC); } } @@ -172,7 +172,7 @@ impl WakeSource for Ext1WakeupSource<'_, '_> { let mut pins = self.pins.borrow_mut(); let mut bits = 0u32; for pin in pins.iter_mut() { - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); pin.rtcio_pad_hold(true); bits |= 1 << pin.rtc_number(); } @@ -200,7 +200,7 @@ impl Drop for Ext1WakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for pin in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } @@ -209,7 +209,7 @@ impl RtcioWakeupSource<'_, '_> { fn apply_pin(&self, pin: &mut dyn RtcPin, level: WakeupLevel) { let rtcio = RTC_IO::regs(); - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); rtcio.pin(pin.number() as usize).modify(|_, w| unsafe { w.gpio_pin_wakeup_enable().set_bit(); @@ -258,7 +258,7 @@ impl Drop for RtcioWakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for (pin, _level) in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } diff --git a/esp-hal/src/rtc_cntl/sleep/esp32s3.rs b/esp-hal/src/rtc_cntl/sleep/esp32s3.rs index 294078027ff..b4a7b2cacb4 100644 --- a/esp-hal/src/rtc_cntl/sleep/esp32s3.rs +++ b/esp-hal/src/rtc_cntl/sleep/esp32s3.rs @@ -129,7 +129,7 @@ impl WakeSource for Ext0WakeupSource

{ // set pin to RTC function self.pin .borrow_mut() - .rtc_set_config(true, true, RtcFunction::Rtc); + .rtc_set_config(true, true, RtcFunction::RTC); unsafe { let rtc_io = RTC_IO::regs(); @@ -153,7 +153,7 @@ impl Drop for Ext0WakeupSource

{ // to IO_MUX) self.pin .borrow_mut() - .rtc_set_config(true, false, RtcFunction::Rtc); + .rtc_set_config(true, false, RtcFunction::RTC); } } @@ -172,7 +172,7 @@ impl WakeSource for Ext1WakeupSource<'_, '_> { let mut pins = self.pins.borrow_mut(); let mut bits = 0u32; for pin in pins.iter_mut() { - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); bits |= 1 << pin.rtc_number(); } @@ -201,7 +201,7 @@ impl Drop for Ext1WakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for pin in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } @@ -210,7 +210,7 @@ impl RtcioWakeupSource<'_, '_> { fn apply_pin(&self, pin: &mut dyn RtcPin, level: WakeupLevel) { let rtcio = RTC_IO::regs(); - pin.rtc_set_config(true, true, RtcFunction::Rtc); + pin.rtc_set_config(true, true, RtcFunction::RTC); rtcio.pin(pin.number() as usize).modify(|_, w| unsafe { w.wakeup_enable().set_bit().int_type().bits(match level { @@ -258,7 +258,7 @@ impl Drop for RtcioWakeupSource<'_, '_> { // to IO_MUX) let mut pins = self.pins.borrow_mut(); for (pin, _level) in pins.iter_mut() { - pin.rtc_set_config(true, false, RtcFunction::Rtc); + pin.rtc_set_config(true, false, RtcFunction::RTC); } } } diff --git a/esp-hal/src/soc/esp32/gpio.rs b/esp-hal/src/soc/esp32/gpio.rs index 3c0d51a2449..d41e397c1b7 100644 --- a/esp-hal/src/soc/esp32/gpio.rs +++ b/esp-hal/src/soc/esp32/gpio.rs @@ -54,6 +54,10 @@ macro_rules! rtcio_analog { .hold_force() .modify(|_, w| w.$hold().bit(enable)); } + + fn functions(&self, _: crate::private::Internal) -> &'static [$crate::gpio::RtcFunction] { + &[$crate::gpio::RtcFunction::_0, $crate::gpio::RtcFunction::_1, /* macros hard :'( */] + } } for_each_gpio! { diff --git a/esp-hal/src/soc/esp32s2/gpio.rs b/esp-hal/src/soc/esp32s2/gpio.rs index 410d468a9f7..42ef661de21 100644 --- a/esp-hal/src/soc/esp32s2/gpio.rs +++ b/esp-hal/src/soc/esp32s2/gpio.rs @@ -114,6 +114,10 @@ for_each_lp_function! { .pad_hold() .modify(|_, w| hold_field!(w, $gpio).bit(enable)); } + + fn functions(&self, _: crate::private::Internal) -> &'static [$crate::gpio::RtcFunction] { + &[$crate::gpio::RtcFunction::_0, $crate::gpio::RtcFunction::_1, /* macros hard :'( */] + } } #[cfg_attr(docsrs, doc(cfg(feature = "unstable")))] diff --git a/esp-hal/src/soc/esp32s3/gpio.rs b/esp-hal/src/soc/esp32s3/gpio.rs index 75b24996317..1cafa78ea9b 100644 --- a/esp-hal/src/soc/esp32s3/gpio.rs +++ b/esp-hal/src/soc/esp32s3/gpio.rs @@ -55,6 +55,10 @@ macro_rules! rtcio_analog { .pad_hold() .modify(|_, w| w.$hold().bit(enable)); } + + fn functions(&self, _: crate::private::Internal) -> &'static [$crate::gpio::RtcFunction] { + &[$crate::gpio::RtcFunction::_0, $crate::gpio::RtcFunction::_1, /* macros hard :'( */] + } } #[cfg_attr(docsrs, doc(cfg(feature = "unstable")))]