stm: Add a few more GPIO functions to make dealing with the 1802 easier
authorKeith Packard <keithp@keithp.com>
Mon, 3 Apr 2017 18:37:21 +0000 (11:37 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 3 Apr 2017 18:37:21 +0000 (11:37 -0700)
ao_gpio_set_mask and ao_gpio_get_all

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

index b294c379ee7a330efe1161e683c4b660a1fbcc58..157415053ab933853d40e4971da44efce4c7d2ba 100644 (file)
@@ -202,8 +202,11 @@ ao_spi_try_get_mask(struct stm_gpio *reg, uint16_t mask, uint8_t bus, uint32_t s
 
 #define ao_gpio_set_bits(port, bits) stm_gpio_set_bits(port, bits)
 
+#define ao_gpio_set_mask(port, bits, mask) stm_gpio_set_mask(port, bits, mask)
+
 #define ao_gpio_clr_bits(port, bits) stm_gpio_clr_bits(port, bits);
 
+#define ao_gpio_get_all(port) stm_gpio_get_all(port)
 
 #define ao_enable_output(port,bit,pin,v) do {                  \
                ao_enable_port(port);                           \
index a20efa8a1b0c31f52bfa5536752f607d36ad4b3a..4f966e3e71f3661d01ce9afd370549ad38803c55 100644 (file)
@@ -167,6 +167,12 @@ stm_gpio_set(struct stm_gpio *gpio, int pin, uint8_t value) {
        gpio->bsrr = ((uint32_t) (value ^ 1) << (pin + 16)) | ((uint32_t) value << pin);
 }
 
+static inline void
+stm_gpio_set_mask(struct stm_gpio *gpio, uint16_t bits, uint16_t mask) {
+       /* Use the bit set/reset register to do this atomically */
+       gpio->bsrr = ((uint32_t) (~bits & mask) << 16) | ((uint32_t) (bits & mask));
+}
+
 static inline void
 stm_gpio_set_bits(struct stm_gpio *gpio, uint16_t bits) {
        gpio->bsrr = bits;