aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/stm32f2
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-06-03 20:30:13 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-06-03 22:40:40 -0400
commita5b5d4f27f94befaf5577563a0319e8194377118 (patch)
tree770ced66d348e14435fb32b05824dccd077b456a /libmaple/stm32f2
parent41c909dd2a9f6311d443550cb7c2ca3337fe3a20 (diff)
downloadlibrambutan-a5b5d4f27f94befaf5577563a0319e8194377118.tar.gz
librambutan-a5b5d4f27f94befaf5577563a0319e8194377118.zip
Bring back EXTI on F1, with deprecations for gpio.h on F1.
Tested on Maple Mini with examples/mini-exti-test. Changes to Wirish are minor: use the new EXTI types exti_num and exti_cfg (see below) in place of now-deprecated variants in ext_interrupts.cpp. The way I originally did libmaple/exti.h was stupid, and fixing it turned out to be a little disruptive. libmaple/exti.h depends on libmaple/gpio.h (for AFIO), but that's a classic case of exposed implementation detail. So invert the dependency: make gpio.h depend on exti.h. Do this by adding exti_num and exti_cfg to exti.h; these respectively replace afio_exti_num and afio_exti_port. The afio_* variants are now deprecated. (Throw in a typedef and some macros at the bottom of the F1 series/gpio.h for backwards compatibility). Make exti_attach_interrupt() and exti_detach_interrupt() take exti_num/exti_cfg arguments instead of the afio_* variants. Make the EXTI dispatch routines __always_inline to defeat GCC -Os. Many renames throughout libmaple/stm32f1/ to stop using the deprecated names. Also move the previously F1-only gpio_exti_port() function into the public libmaple header. Reimplementing it in terms of rcc_clk_ids lets us deprecate the gpio_dev->exti_port field, which will save space in the future. While we're there, I notice that struct gpio_dev is defined once per series. That's dumb, as it misses the entire point of having device structs: they contain what's portable. So put the F1 version (which has the extra EXTI port field) into libmaple/gpio.h, and add the necessary exti_ports to libmaple/stm32f2/gpio.c. Sigh. We'll get rid of it eventually, at least. Clean up some other mistakes in gpio.h files as well (mostly removing util.h dependency). Sorry for the messy commit. For portability, add a new series-specific exti function, exti_select(). The F1 version in (new) libmaple/stm32f1/exti.c uses AFIO and some new private functionality in libmaple/exti.c and (new) libmaple/exti_private.h to make this convenient. We'll be able to do the SYSCFG equivalent on F2 without any trouble. Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Diffstat (limited to 'libmaple/stm32f2')
-rw-r--r--libmaple/stm32f2/gpio.c9
-rw-r--r--libmaple/stm32f2/include/series/gpio.h54
2 files changed, 33 insertions, 30 deletions
diff --git a/libmaple/stm32f2/gpio.c b/libmaple/stm32f2/gpio.c
index f2cd776..a26edaa 100644
--- a/libmaple/stm32f2/gpio.c
+++ b/libmaple/stm32f2/gpio.c
@@ -40,6 +40,7 @@
gpio_dev gpioa = {
.regs = GPIOA_BASE,
.clk_id = RCC_GPIOA,
+ .exti_port = EXTI_PA,
};
/** GPIO port A device. */
gpio_dev* const GPIOA = &gpioa;
@@ -47,6 +48,7 @@ gpio_dev* const GPIOA = &gpioa;
gpio_dev gpiob = {
.regs = GPIOB_BASE,
.clk_id = RCC_GPIOB,
+ .exti_port = EXTI_PB,
};
/** GPIO port B device. */
gpio_dev* const GPIOB = &gpiob;
@@ -54,6 +56,7 @@ gpio_dev* const GPIOB = &gpiob;
gpio_dev gpioc = {
.regs = GPIOC_BASE,
.clk_id = RCC_GPIOC,
+ .exti_port = EXTI_PC,
};
/** GPIO port C device. */
gpio_dev* const GPIOC = &gpioc;
@@ -61,6 +64,7 @@ gpio_dev* const GPIOC = &gpioc;
gpio_dev gpiod = {
.regs = GPIOD_BASE,
.clk_id = RCC_GPIOD,
+ .exti_port = EXTI_PD,
};
/** GPIO port D device. */
gpio_dev* const GPIOD = &gpiod;
@@ -68,6 +72,7 @@ gpio_dev* const GPIOD = &gpiod;
gpio_dev gpioe = {
.regs = GPIOE_BASE,
.clk_id = RCC_GPIOE,
+ .exti_port = EXTI_PE,
};
/** GPIO port E device. */
gpio_dev* const GPIOE = &gpioe;
@@ -75,6 +80,7 @@ gpio_dev* const GPIOE = &gpioe;
gpio_dev gpiof = {
.regs = GPIOF_BASE,
.clk_id = RCC_GPIOF,
+ .exti_port = EXTI_PF,
};
/** GPIO port F device. */
gpio_dev* const GPIOF = &gpiof;
@@ -82,6 +88,7 @@ gpio_dev* const GPIOF = &gpiof;
gpio_dev gpiog = {
.regs = GPIOG_BASE,
.clk_id = RCC_GPIOG,
+ .exti_port = EXTI_PG,
};
/** GPIO port G device. */
gpio_dev* const GPIOG = &gpiog;
@@ -89,6 +96,7 @@ gpio_dev* const GPIOG = &gpiog;
gpio_dev gpioh = {
.regs = GPIOH_BASE,
.clk_id = RCC_GPIOH,
+ .exti_port = EXTI_PH,
};
/** GPIO port G device. */
gpio_dev* const GPIOH = &gpioh;
@@ -96,6 +104,7 @@ gpio_dev* const GPIOH = &gpioh;
gpio_dev gpioi = {
.regs = GPIOI_BASE,
.clk_id = RCC_GPIOI,
+ .exti_port = EXTI_PI,
};
/** GPIO port G device. */
gpio_dev* const GPIOI = &gpioi;
diff --git a/libmaple/stm32f2/include/series/gpio.h b/libmaple/stm32f2/include/series/gpio.h
index 9687247..1496e8e 100644
--- a/libmaple/stm32f2/include/series/gpio.h
+++ b/libmaple/stm32f2/include/series/gpio.h
@@ -1,7 +1,7 @@
/******************************************************************************
* The MIT License
*
- * Copyright (c) 2011 LeafLabs, LLC.
+ * Copyright (c) 2011, 2012 LeafLabs, LLC.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
@@ -36,8 +36,7 @@
extern "C"{
#endif
-#include <libmaple/libmaple.h>
-#include <libmaple/rcc.h>
+#include <libmaple/libmaple_types.h>
/*
* GPIO register maps and devices
@@ -76,30 +75,25 @@ typedef struct gpio_reg_map {
/** GPIO port I register map base pointer */
#define GPIOI_BASE ((struct gpio_reg_map*)0x40022000)
-/** GPIO device type */
-typedef struct gpio_dev {
- gpio_reg_map *regs;
- rcc_clk_id clk_id;
-} gpio_dev;
-
-extern gpio_dev* const GPIOA;
-extern gpio_dev gpioa;
-extern gpio_dev* const GPIOB;
-extern gpio_dev gpiob;
-extern gpio_dev* const GPIOC;
-extern gpio_dev gpioc;
-extern gpio_dev* const GPIOD;
-extern gpio_dev gpiod;
-extern gpio_dev* const GPIOE;
-extern gpio_dev gpioe;
-extern gpio_dev* const GPIOF;
-extern gpio_dev gpiof;
-extern gpio_dev* const GPIOG;
-extern gpio_dev gpiog;
-extern gpio_dev* const GPIOH;
-extern gpio_dev gpioh;
-extern gpio_dev* const GPIOI;
-extern gpio_dev gpioi;
+struct gpio_dev;
+extern struct gpio_dev* const GPIOA;
+extern struct gpio_dev gpioa;
+extern struct gpio_dev* const GPIOB;
+extern struct gpio_dev gpiob;
+extern struct gpio_dev* const GPIOC;
+extern struct gpio_dev gpioc;
+extern struct gpio_dev* const GPIOD;
+extern struct gpio_dev gpiod;
+extern struct gpio_dev* const GPIOE;
+extern struct gpio_dev gpioe;
+extern struct gpio_dev* const GPIOF;
+extern struct gpio_dev gpiof;
+extern struct gpio_dev* const GPIOG;
+extern struct gpio_dev gpiog;
+extern struct gpio_dev* const GPIOH;
+extern struct gpio_dev gpioh;
+extern struct gpio_dev* const GPIOI;
+extern struct gpio_dev gpioi;
/*
* Register bit definitions
@@ -215,7 +209,7 @@ typedef enum gpio_mode_flags {
GPIO_MODEF_PUPD_PD = GPIO_PUPDR_PD << 3, /**< Pull-down */
} gpio_mode_flags;
-void gpio_set_modef(gpio_dev *dev,
+void gpio_set_modef(struct gpio_dev *dev,
uint8 bit,
gpio_pin_mode mode,
unsigned flags);
@@ -231,7 +225,7 @@ void gpio_set_modef(gpio_dev *dev,
* @param pin Pin on the device whose mode to set, 0--15.
* @param mode Mode to set the pin to.
*/
-static inline void gpio_set_mode(gpio_dev *dev,
+static inline void gpio_set_mode(struct gpio_dev *dev,
uint8 bit,
gpio_pin_mode mode) {
gpio_set_modef(dev, bit, mode, GPIO_MODEF_SPEED_HIGH);
@@ -261,7 +255,7 @@ typedef enum gpio_af {
GPIO_AF_EVENTOUT = 15, /**< EVENTOUT. */
} gpio_af;
-void gpio_set_af(gpio_dev *dev, uint8 bit, gpio_af af);
+void gpio_set_af(struct gpio_dev *dev, uint8 bit, gpio_af af);
#ifdef __cplusplus
}