aboutsummaryrefslogtreecommitdiffstats
path: root/src/stm32f1/gpio.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2018-08-20 17:15:04 -0400
committerKevin O'Connor <kevin@koconnor.net>2018-08-27 12:45:01 -0400
commite5d95fdd00559e0364341384bdab981e6eb230eb (patch)
tree5e75be8d2f48df353ac8feed8f446e9507e7d61a /src/stm32f1/gpio.c
parent983c84b12f32dbcff43a4f4d2e78972cb2be85f6 (diff)
downloadkutter-e5d95fdd00559e0364341384bdab981e6eb230eb.tar.gz
kutter-e5d95fdd00559e0364341384bdab981e6eb230eb.tar.xz
kutter-e5d95fdd00559e0364341384bdab981e6eb230eb.zip
stm32f1: Add support for gpio_x_reset()
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/stm32f1/gpio.c')
-rw-r--r--src/stm32f1/gpio.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/stm32f1/gpio.c b/src/stm32f1/gpio.c
index 84f7fbe7..5deb752b 100644
--- a/src/stm32f1/gpio.c
+++ b/src/stm32f1/gpio.c
@@ -61,16 +61,23 @@ gpio_out_setup(uint8_t pin, uint8_t val)
goto fail;
GPIO_TypeDef *regs = digital_regs[GPIO2PORT(pin)];
uint32_t bit = digital_pins[pin % 16];
+ struct gpio_out g = { .regs=regs, .bit=bit };
+ gpio_out_reset(g, val);
+ return g;
+fail:
+ shutdown("Not an output pin");
+}
+
+void
+gpio_out_reset(struct gpio_out g, uint8_t val)
+{
irqstatus_t flag = irq_save();
if (val)
- LL_GPIO_SetOutputPin(regs, bit);
+ LL_GPIO_SetOutputPin(g.regs, g.bit);
else
- LL_GPIO_ResetOutputPin(regs, bit);
- LL_GPIO_SetPinMode(regs, bit, LL_GPIO_MODE_OUTPUT);
+ LL_GPIO_ResetOutputPin(g.regs, g.bit);
+ LL_GPIO_SetPinMode(g.regs, g.bit, LL_GPIO_MODE_OUTPUT);
irq_restore(flag);
- return (struct gpio_out){ .regs = regs, .bit = bit };
-fail:
- shutdown("Not an output pin");
}
void
@@ -104,17 +111,24 @@ gpio_in_setup(uint8_t pin, int8_t pull_up)
goto fail;
GPIO_TypeDef *regs = digital_regs[GPIO2PORT(pin)];
uint32_t bit = digital_pins[pin % 16];
+ struct gpio_in g = { .regs = regs, .bit = bit };
+ gpio_in_reset(g, pull_up);
+ return g;
+fail:
+ shutdown("Not an input pin");
+}
+
+void
+gpio_in_reset(struct gpio_in g, int8_t pull_up)
+{
irqstatus_t flag = irq_save();
if (pull_up) {
- LL_GPIO_SetPinMode(regs, bit, LL_GPIO_MODE_INPUT);
- LL_GPIO_SetPinPull(regs, bit, LL_GPIO_PULL_UP);
+ LL_GPIO_SetPinMode(g.regs, g.bit, LL_GPIO_MODE_INPUT);
+ LL_GPIO_SetPinPull(g.regs, g.bit, LL_GPIO_PULL_UP);
} else {
- LL_GPIO_SetPinMode(regs, bit, LL_GPIO_MODE_FLOATING);
+ LL_GPIO_SetPinMode(g.regs, g.bit, LL_GPIO_MODE_FLOATING);
}
irq_restore(flag);
- return (struct gpio_in){ .regs = regs, .bit = bit };
-fail:
- shutdown("Not an input pin");
}
uint8_t