Skip to content

Commit 28ac7a4

Browse files
committed
async gpio fixes
- Fix pin number calculation for bank1 - Clear interrupt status after disabling interrupt to avoid hardware pending another interrupt - Clear interrupt status per pin when we create the input future
1 parent 70e4539 commit 28ac7a4

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

esp-hal-common/src/gpio.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,7 @@ mod asynch {
18811881
P: crate::gpio::Pin + embedded_hal_1::digital::ErrorType,
18821882
{
18831883
pub fn new(pin: &'a mut P, event: Event) -> Self {
1884+
pin.clear_interrupt();
18841885
pin.listen(event);
18851886
Self { pin }
18861887
}
@@ -1913,27 +1914,21 @@ mod asynch {
19131914
type Bank0 = SingleCoreInteruptStatusRegisterAccessBank0;
19141915
#[cfg(any(esp32, esp32s2, esp32s3))]
19151916
type Bank1 = SingleCoreInteruptStatusRegisterAccessBank1;
1916-
19171917
let mut intrs = Bank0::pro_cpu_interrupt_status_read() as u64;
19181918

19191919
#[cfg(any(esp32, esp32s2, esp32s3))]
19201920
{
19211921
intrs |= (Bank1::pro_cpu_interrupt_status_read() as u64) << 32;
19221922
}
19231923

1924-
// clear interrupts
1925-
Bank0GpioRegisterAccess::write_interrupt_status_clear(!0);
1926-
#[cfg(any(esp32, esp32s2, esp32s3))]
1927-
Bank1GpioRegisterAccess::write_interrupt_status_clear(!0);
1928-
19291924
while intrs != 0 {
19301925
let pin_nr = intrs.trailing_zeros();
19311926
cfg_if::cfg_if! {
19321927
if #[cfg(any(esp32, esp32s2, esp32s3))] {
19331928
if pin_nr < 32 {
19341929
Bank0GpioRegisterAccess::set_int_enable(pin_nr as u8, 0, 0, false);
19351930
} else {
1936-
Bank1GpioRegisterAccess::set_int_enable(pin_nr as u8, 0, 0, false);
1931+
Bank1GpioRegisterAccess::set_int_enable((pin_nr - 32) as u8, 0, 0, false);
19371932
}
19381933
} else {
19391934
Bank0GpioRegisterAccess::set_int_enable(pin_nr as u8, 0, 0, false);
@@ -1942,5 +1937,10 @@ mod asynch {
19421937
PIN_WAKERS[pin_nr as usize].wake(); // wake task
19431938
intrs &= !(1 << pin_nr);
19441939
}
1940+
1941+
// clear interrupt bits
1942+
Bank0GpioRegisterAccess::write_interrupt_status_clear(intrs as u32);
1943+
#[cfg(any(esp32, esp32s2, esp32s3))]
1944+
Bank1GpioRegisterAccess::write_interrupt_status_clear((intrs >> 32) as u32);
19451945
}
19461946
}

0 commit comments

Comments
 (0)