samd21: Save interrupt pin status before enabling interrupts
authorKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2022 06:48:28 +0000 (22:48 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2022 08:17:32 +0000 (00:17 -0800)
Make sure we capture the correct external interrupt pin state before
anything changes.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/samd21/ao_exti_samd21.c

index d8109483a83a1e6a3c61de4097c69b507d3cda00..688f64337be88510c06529700228f8222ea68666 100644 (file)
@@ -136,11 +136,13 @@ ao_exti_enable(struct samd21_port *port, uint8_t pin)
        uint8_t         id = pin_id(port,pin);
 
        ao_arch_block_interrupts();
-       samd21_eic.intenset = 1 << id;
        /* configure gpio to interrupt routing */
-       ao_samd21_exti[id].pmux = samd21_port_pmux_get(port, pin);
-       ao_samd21_exti[id].pincfg = samd21_port_pincfg_get(port, pin);
+       if ((samd21_eic.intenset & (1 << id)) == 0) {
+               ao_samd21_exti[id].pmux = samd21_port_pmux_get(port, pin);
+               ao_samd21_exti[id].pincfg = samd21_port_pincfg_get(port, pin);
+       }
        samd21_port_pmux_set(port, pin, SAMD21_PORT_PMUX_FUNC_A);
+       samd21_eic.intenset = 1 << id;
        ao_arch_release_interrupts();
 }