altos: Fix broken EXTI edge mode selections. Clear pending exti on enable
authorKeith Packard <keithp@keithp.com>
Sat, 2 Jun 2012 23:54:42 +0000 (16:54 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 2 Jun 2012 23:54:42 +0000 (16:54 -0700)
Make sure the edge mode registers are set according to the requested
mode.

Clear any pending interrupt when enabling to avoid spurious isr call

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

index 2108e8b5d4181fcaefe79169e0fa2a01e8646f35..0fa241889279b58049c22b49700709fb4b054df7 100644 (file)
@@ -75,11 +75,14 @@ ao_exti_setup (struct stm_gpio *gpio, uint8_t pin, uint8_t mode, void (*callback
 
        /* Set interrupt mask and rising/falling mode */
        stm_exti.imr &= ~mask;
-       stm_exti.rtsr |= mask;
        if (mode & AO_EXTI_MODE_RISING)
                stm_exti.rtsr |= mask;
+       else
+               stm_exti.rtsr &= ~mask;
        if (mode & AO_EXTI_MODE_FALLING)
                stm_exti.ftsr |= mask;
+       else
+               stm_exti.ftsr &= ~mask;
 
        if (pin <= 4)
                irq = STM_ISR_EXTI0_POS + pin;
@@ -93,12 +96,16 @@ ao_exti_setup (struct stm_gpio *gpio, uint8_t pin, uint8_t mode, void (*callback
 
 void
 ao_exti_enable(struct stm_gpio *gpio, uint8_t pin) {
+       uint32_t        mask = (1 << pin);
+       stm_exti.pr = mask;
        stm_exti.imr |= (1 << pin);
 }
 
 void
 ao_exti_disable(struct stm_gpio *gpio, uint8_t pin) {
-       stm_exti.imr &= ~(1 << pin);
+       uint32_t        mask = (1 << pin);
+       stm_exti.imr &= ~mask;
+       stm_exti.pr = mask;
 }
 
 void