Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions esp-hal/src/gpio/lp_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")))]
Expand Down
32 changes: 27 additions & 5 deletions esp-hal/src/gpio/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -353,13 +353,24 @@ impl TryFrom<usize> 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
Expand All @@ -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
Expand Down Expand Up @@ -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! {
Expand Down
6 changes: 3 additions & 3 deletions esp-hal/src/gpio/rtc_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
18 changes: 16 additions & 2 deletions esp-hal/src/i2c/rtc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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! {
Expand All @@ -102,13 +108,21 @@ 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) => {
impl Sda for crate::peripherals::$gpio<'_> {
fn selector(&self) -> u8 {
$n
}

fn function(&self) -> RtcFunction {
RtcFunction::_3
}
}
};
}
Expand Down Expand Up @@ -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());
}

{
Expand All @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions esp-hal/src/rtc_cntl/sleep/esp32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ impl<P: RtcPin> WakeSource for Ext0WakeupSource<P> {
// 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
Expand All @@ -135,7 +135,7 @@ impl<P: RtcPin> Drop for Ext0WakeupSource<P> {
// to IO_MUX)
self.pin
.borrow_mut()
.rtc_set_config(true, false, RtcFunction::Rtc);
.rtc_set_config(true, false, RtcFunction::RTC);
}
}

Expand All @@ -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();
}

Expand Down Expand Up @@ -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);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions esp-hal/src/rtc_cntl/sleep/esp32c2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) });
}
}
}
Expand Down Expand Up @@ -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);
// }
// }
// }
Expand Down
4 changes: 2 additions & 2 deletions esp-hal/src/rtc_cntl/sleep/esp32c3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) });
}
}
}
Expand Down Expand Up @@ -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);
// }
// }
// }
Expand Down
6 changes: 3 additions & 3 deletions esp-hal/src/rtc_cntl/sleep/esp32c6.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions esp-hal/src/rtc_cntl/sleep/esp32s2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ impl<P: RtcPin> WakeSource for Ext0WakeupSource<P> {
// 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 {
Expand All @@ -150,7 +150,7 @@ impl<P: RtcPin> Drop for Ext0WakeupSource<P> {
// to IO_MUX)
self.pin
.borrow_mut()
.rtc_set_config(true, false, RtcFunction::Rtc);
.rtc_set_config(true, false, RtcFunction::RTC);
}
}

Expand All @@ -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();
}
Expand Down Expand Up @@ -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);
}
}
}
Expand All @@ -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();
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions esp-hal/src/rtc_cntl/sleep/esp32s3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ impl<P: RtcPin> WakeSource for Ext0WakeupSource<P> {
// 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();
Expand All @@ -153,7 +153,7 @@ impl<P: RtcPin> Drop for Ext0WakeupSource<P> {
// to IO_MUX)
self.pin
.borrow_mut()
.rtc_set_config(true, false, RtcFunction::Rtc);
.rtc_set_config(true, false, RtcFunction::RTC);
}
}

Expand All @@ -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();
}

Expand Down Expand Up @@ -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);
}
}
}
Expand All @@ -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 {
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions esp-hal/src/soc/esp32/gpio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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! {
Expand Down
4 changes: 4 additions & 0 deletions esp-hal/src/soc/esp32s2/gpio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")))]
Expand Down
4 changes: 4 additions & 0 deletions esp-hal/src/soc/esp32s3/gpio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")))]
Expand Down
Loading