altos: Crank down STM SPI speed for MM
[fw/altos] / src / stm / ao_exti_stm.c
index 013d453be2f456dce4540280d3bb4a81e3157745..0fa241889279b58049c22b49700709fb4b054df7 100644 (file)
@@ -51,8 +51,12 @@ ao_exti_setup (struct stm_gpio *gpio, uint8_t pin, uint8_t mode, void (*callback
        uint32_t        mask = 1 << pin;
        uint32_t        pupdr;
        uint8_t         irq;
-       
+
        ao_exti_callback[pin] = callback;
+
+       /* configure gpio to interrupt routing */
+       stm_exticr_set(gpio, pin);
+
        /* configure pin as input, setting selected pull-up/down mode */
        stm_moder_set(gpio, pin, STM_MODER_INPUT);
        switch (mode & (AO_EXTI_MODE_PULL_UP|AO_EXTI_MODE_PULL_DOWN)) {
@@ -71,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;
@@ -89,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