I don't know
Fork of mbed-src by
Diff: targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_api.c
- Revision:
- 593:78ee8643776a
- Parent:
- 556:a217bc785985
- Child:
- 627:4fa1328d9c60
--- a/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_api.c Fri Jul 17 09:15:10 2015 +0100 +++ b/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/gpio_api.c Mon Jul 20 09:00:09 2015 +0100 @@ -19,9 +19,28 @@ #include "mbed_assert.h" #include "sleepmodes.h" -uint8_t gpio_get_index(gpio_t *obj) + +void gpio_write(gpio_t *obj, int value) { - return 0; + if (value) { + GPIO_PinOutSet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); // Pin number encoded in first four bits of obj->pin + } else { + GPIO_PinOutClear((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); + } +} + +int gpio_read(gpio_t *obj) +{ + if (obj->dir == PIN_INPUT) { + return GPIO_PinInGet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); // Pin number encoded in first four bits of obj->pin + } else { + return GPIO_PinOutGet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); + } +} + +int gpio_is_connected(const gpio_t *obj) +{ + return (obj->pin | 0xFFFFFF00 )!= (PinName)NC; } /* @@ -44,25 +63,49 @@ obj->pin = pin; } -void gpio_pin_enable(gpio_t *obj, uint8_t enable) -{ - if (enable) { - pin_mode(obj->pin, obj->mode); - } else { - pin_mode(obj->pin, Disabled); // TODO_LP return mode to default value - } -} - void gpio_mode(gpio_t *obj, PinMode mode) { + if(obj->dir == PIN_INPUT) { + switch(mode) { + case PullDefault: + mode = Input; + break; + case PullUp: + mode = InputPullUp; + break; + case PullDown: + mode = InputPullDown; + break; + default: + break; + } + + //Handle DOUT setting + if((mode & 0x10) != 0) { + //Set DOUT + GPIO->P[(obj->pin >> 4) & 0xF].DOUTSET = 1 << (obj->pin & 0xF); + } else { + //Clear DOUT + GPIO->P[(obj->pin >> 4) & 0xF].DOUTCLR = 1 << (obj->pin & 0xF); + } + } else { + switch(mode) { + case PullDefault: + mode = PushPull; + break; + case PullUp: + mode = WiredAndPullUp; + break; + case PullDown: + mode = WiredOrPullDown; + break; + default: + break; + } + } + obj->mode = mode; // Update object pin_mode(obj->pin, mode); // Update register - - //Handle pullup for input - if(mode == InputPullUp) { - //Set DOUT - GPIO->P[(obj->pin >> 4) & 0xF].DOUTSET = 1 << (obj->pin & 0xF); - } } // Used by DigitalInOut to set correct mode when direction is set @@ -78,4 +121,3 @@ break; } } -