From 1bf40aa4c9ea9844046b7b84342225274622d7c2 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 12 Nov 2022 22:48:28 -0800 Subject: [PATCH] samd21: Save interrupt pin status before enabling interrupts Make sure we capture the correct external interrupt pin state before anything changes. Signed-off-by: Keith Packard --- src/samd21/ao_exti_samd21.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/samd21/ao_exti_samd21.c b/src/samd21/ao_exti_samd21.c index d8109483..688f6433 100644 --- a/src/samd21/ao_exti_samd21.c +++ b/src/samd21/ao_exti_samd21.c @@ -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(); } -- 2.30.2