aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/gpio.c
diff options
context:
space:
mode:
authorPerry Hung <iperry@alum.mit.edu>2010-04-22 01:18:48 -0400
committerPerry Hung <iperry@alum.mit.edu>2010-04-22 01:18:48 -0400
commita4e8827b0652be1133d7491fc749fcb55b7c3333 (patch)
tree4a98222c74fd1c3698a0422e28d2e499dccc14e9 /libmaple/gpio.c
parente9eda8f74c4775ef160bbe90325b8be7def91b7d (diff)
downloadlibrambutan-a4e8827b0652be1133d7491fc749fcb55b7c3333.tar.gz
librambutan-a4e8827b0652be1133d7491fc749fcb55b7c3333.zip
PinMode pullup bug fix, wiring pin mode bug fix
Diffstat (limited to 'libmaple/gpio.c')
-rw-r--r--libmaple/gpio.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/libmaple/gpio.c b/libmaple/gpio.c
index be9db6e..9759df8 100644
--- a/libmaple/gpio.c
+++ b/libmaple/gpio.c
@@ -40,19 +40,28 @@ void gpio_init(void) {
rcc_enable_clk_afio();
}
-void gpio_set_mode(GPIO_Port* port, uint8 gpio_pin, uint8 mode) {
- uint32 tmp;
- uint32 shift = POS(gpio_pin % 8);
- GPIOReg CR;
+void gpio_set_mode(GPIO_Port* port, uint8 gpio_pin, GPIOPinMode mode) {
+ uint32 tmp;
+ uint32 shift = POS(gpio_pin % 8);
+ GPIOReg CR;
+ uint32 pullup = 0;
- ASSERT(port);
- ASSERT(gpio_pin < 16);
+ ASSERT(port);
+ ASSERT(gpio_pin < 16);
- CR = (gpio_pin < 8) ? &(port->CRL) : &(port->CRH);
+ if (mode == GPIO_MODE_INPUT_PU) {
+ pullup = 1;
+ mode = CNF_INPUT_PD;
+ }
- tmp = *CR;
- tmp &= POS_MASK(shift);
- tmp |= mode << shift;
+ CR = (gpio_pin < 8) ? &(port->CRL) : &(port->CRH);
- *CR = tmp;
+ tmp = *CR;
+ tmp &= POS_MASK(shift);
+ tmp |= mode << shift;
+
+ *CR = tmp;
+
+ if (pullup)
+ port->ODR = BIT(gpio_pin);
}