altos/stm: Use #define'd constants for GPIO register addresses
authorKeith Packard <keithp@keithp.com>
Tue, 13 May 2014 05:56:38 +0000 (22:56 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 13 May 2014 05:56:38 +0000 (22:56 -0700)
This lets the compiler short-circuit the tests in ao_enable_gpio and
ao_disable_gpio to save a bit of code space and time.

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

index 9226e9cb0f39a4ea6d1ffc27986000ce94a5100a..799cccbd2a1848bd9510ad0aa1f62d2cea857ee3 100644 (file)
@@ -176,12 +176,27 @@ stm_gpio_get_all(struct stm_gpio *gpio) {
        return gpio->idr;
 }
 
        return gpio->idr;
 }
 
-extern struct stm_gpio stm_gpioa;
-extern struct stm_gpio stm_gpiob;
-extern struct stm_gpio stm_gpioc;
-extern struct stm_gpio stm_gpiod;
-extern struct stm_gpio stm_gpioe;
-extern struct stm_gpio stm_gpioh;
+/*
+ * We can't define these in registers.ld or our fancy
+ * ao_enable_gpio macro will expand into a huge pile of code
+ * as the compiler won't do correct constant folding and
+ * dead-code elimination
+
+ extern struct stm_gpio stm_gpioa;
+ extern struct stm_gpio stm_gpiob;
+ extern struct stm_gpio stm_gpioc;
+ extern struct stm_gpio stm_gpiod;
+ extern struct stm_gpio stm_gpioe;
+ extern struct stm_gpio stm_gpioh;
+
+*/
+
+#define stm_gpioh  (*((struct stm_gpio *) 0x40021400))
+#define stm_gpioe  (*((struct stm_gpio *) 0x40021000))
+#define stm_gpiod  (*((struct stm_gpio *) 0x40020c00))
+#define stm_gpioc  (*((struct stm_gpio *) 0x40020800))
+#define stm_gpiob  (*((struct stm_gpio *) 0x40020400))
+#define stm_gpioa  (*((struct stm_gpio *) 0x40020000))
 
 struct stm_usart {
        vuint32_t       sr;     /* status register */
 
 struct stm_usart {
        vuint32_t       sr;     /* status register */