altos: Route correct GPIO line to interrupt controller
authorKeith Packard <keithp@keithp.com>
Sat, 2 Jun 2012 23:53:46 +0000 (16:53 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 2 Jun 2012 23:53:46 +0000 (16:53 -0700)
Which GPIO a particular pin interrupt comes from is selected by the
SYSCFG EXTICR registers; set these when an exti interrupt is configured.

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

index 013d453be2f456dce4540280d3bb4a81e3157745..2108e8b5d4181fcaefe79169e0fa2a01e8646f35 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)) {
index 0bc7483e6ef93429736b23cc0ae817e71d42ef21..cb66df6c9bdb440d4e745ba5b34aa0abf7cd752e 100644 (file)
@@ -855,10 +855,7 @@ isr(tim7)
 struct stm_syscfg {
        vuint32_t       memrmp;
        vuint32_t       pmc;
-       vuint32_t       exticr1;
-       vuint32_t       exticr2;
-       vuint32_t       exticr3;
-       vuint32_t       exticr4;
+       vuint32_t       exticr[4];
 };
 
 extern struct stm_syscfg stm_syscfg;
@@ -871,6 +868,34 @@ extern struct stm_syscfg stm_syscfg;
 
 #define STM_SYSCFG_PMC_USB_PU          0
 
+#define STM_SYSCFG_EXTICR_PA           0
+#define STM_SYSCFG_EXTICR_PB           1
+#define STM_SYSCFG_EXTICR_PC           2
+#define STM_SYSCFG_EXTICR_PD           3
+#define STM_SYSCFG_EXTICR_PE           4
+#define STM_SYSCFG_EXTICR_PH           5
+
+static inline void
+stm_exticr_set(struct stm_gpio *gpio, int pin) {
+       uint8_t reg = pin >> 2;
+       uint8_t shift = (pin & 3) << 2;
+       uint8_t val = 0;
+
+       if (gpio == &stm_gpioa)
+               val = STM_SYSCFG_EXTICR_PA;
+       else if (gpio == &stm_gpiob)
+               val = STM_SYSCFG_EXTICR_PB;
+       else if (gpio == &stm_gpioc)
+               val = STM_SYSCFG_EXTICR_PC;
+       else if (gpio == &stm_gpiod)
+               val = STM_SYSCFG_EXTICR_PD;
+       else if (gpio == &stm_gpioe)
+               val = STM_SYSCFG_EXTICR_PE;
+
+       stm_syscfg.exticr[reg] = (stm_syscfg.exticr[reg] & ~(0xf << shift)) | val << shift;
+}
+
+
 struct stm_dma_channel {
        vuint32_t       ccr;
        vuint32_t       cndtr;