summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-06-02 16:53:46 -0700
committerKeith Packard <keithp@keithp.com>2012-06-02 16:53:46 -0700
commit8d425ffba84ec6f632e8c0d44105de73242a86a9 (patch)
tree078232e95317498b78f4d7817b2319ad9568c928 /src
parent1353b277f8314fbddef81c743bd6ea229364fd18 (diff)
altos: Route correct GPIO line to interrupt controller
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>
Diffstat (limited to 'src')
-rw-r--r--src/stm/ao_exti_stm.c6
-rw-r--r--src/stm/stm32l.h33
2 files changed, 34 insertions, 5 deletions
diff --git a/src/stm/ao_exti_stm.c b/src/stm/ao_exti_stm.c
index 013d453b..2108e8b5 100644
--- a/src/stm/ao_exti_stm.c
+++ b/src/stm/ao_exti_stm.c
@@ -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)) {
diff --git a/src/stm/stm32l.h b/src/stm/stm32l.h
index 0bc7483e..cb66df6c 100644
--- a/src/stm/stm32l.h
+++ b/src/stm/stm32l.h
@@ -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;