altos: Add ao_gpio_get and ao_exti_set_mode
authorKeith Packard <keithp@keithp.com>
Tue, 7 Aug 2012 02:33:44 +0000 (19:33 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 7 Aug 2012 02:33:44 +0000 (19:33 -0700)
Needed to support general GPIO interrupts

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

index d2c973f5d9cc149b87917186a4b3aff3ccd97417..3d8ca1f2a65e1a1e6751948c8e3e45181ac2ed0c 100644 (file)
@@ -78,12 +78,25 @@ ao_spi_init(void);
 
 #define ao_gpio_set(port, bit, pin, v) stm_gpio_set(port, bit, v)
 
+#define ao_gpio_get(port, bit, pin) stm_gpio_get(port, bit)
+
 #define ao_enable_output(port,bit,pin,v) do {                  \
                ao_enable_port(port);                           \
                ao_gpio_set(port, bit, pin, v);                 \
                stm_moder_set(port, bit, STM_MODER_OUTPUT);\
        } while (0)
 
+#define ao_enable_input(port,bit,mode) do {                            \
+               ao_enable_port(port);                                   \
+               stm_moder_set(port, bit, STM_MODER_INPUT);              \
+               if (mode == AO_EXTI_MODE_PULL_UP)                       \
+                       stm_pupdr_set(port, bit, STM_PUPDR_PULL_UP);    \
+               else if (mode == AO_EXTI_MODE_PULL_DOWN)                \
+                       stm_pupdr_set(port, bit, STM_PUPDR_PULL_DOWN);  \
+               else                                                    \
+                       stm_pupdr_set(port, bit, STM_PUPDR_NONE);       \
+       } while (0)
+
 #define ao_enable_cs(port,bit) do {                            \
                stm_gpio_set((port), bit, 1);                   \
                stm_moder_set((port), bit, STM_MODER_OUTPUT);   \
index b579ad9fa5aeee46872450ffa3f73c0b61fafad2..35b56b571582fd392201bf0172767ff9f53119ad 100644 (file)
@@ -29,6 +29,9 @@
 void
 ao_exti_setup(struct stm_gpio *gpio, uint8_t pin, uint8_t mode, void (*callback)());
 
+void
+ao_exti_set_mode(struct stm_gpio *gpio, uint8_t pin, uint8_t mode);
+
 void
 ao_exti_set_callback(struct stm_gpio *gpio, uint8_t pin, void (*callback)());
 
index d54e6ee637d8a797665392a13e2edb171c5d47f6..11099b02112994d023df580d5cbb01e2748af91b 100644 (file)
@@ -115,6 +115,20 @@ ao_exti_setup (struct stm_gpio *gpio, uint8_t pin, uint8_t mode, void (*callback
        stm_nvic_set_enable(irq);
 }
 
+void
+ao_exti_set_mode(struct stm_gpio *gpio, uint8_t pin, uint8_t mode) {
+       uint32_t        mask = 1 << pin;
+       
+       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;
+}
+
 void
 ao_exti_set_callback(struct stm_gpio *gpio, uint8_t pin, void (*callback)()) {
        ao_exti_callback[pin] = callback;
index 4d665e8beda9fcb55f937d17b3d8809907db1727..3a498a0a06043febab4b3bca22e38e5dc041e019 100644 (file)
@@ -167,7 +167,7 @@ stm_gpio_set(struct stm_gpio *gpio, int pin, uint8_t value) {
 }
 
 static inline uint8_t
-stm_gpio_isset(struct stm_gpio *gpio, int pin) {
+stm_gpio_get(struct stm_gpio *gpio, int pin) {
        return (gpio->idr >> pin) & 1;
 }