mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Jul 20 09:00:09 2015 +0100
Revision:
593:78ee8643776a
Parent:
556:a217bc785985
Child:
627:4fa1328d9c60
Synchronized with git revision a68b724d07788e6389ea4d52c622aad767953758

Full URL: https://github.com/mbedmicro/mbed/commit/a68b724d07788e6389ea4d52c622aad767953758/

[Silicon Labs] Bring EFM32 HAL up to date

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 525:c320967f86b9 1 /* mbed Microcontroller Library
mbed_official 525:c320967f86b9 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 525:c320967f86b9 3 *
mbed_official 525:c320967f86b9 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 525:c320967f86b9 5 * you may not use this file except in compliance with the License.
mbed_official 525:c320967f86b9 6 * You may obtain a copy of the License at
mbed_official 525:c320967f86b9 7 *
mbed_official 525:c320967f86b9 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 525:c320967f86b9 9 *
mbed_official 525:c320967f86b9 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 525:c320967f86b9 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 525:c320967f86b9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 525:c320967f86b9 13 * See the License for the specific language governing permissions and
mbed_official 525:c320967f86b9 14 * limitations under the License.
mbed_official 525:c320967f86b9 15 */
mbed_official 525:c320967f86b9 16 #include "gpio_api.h"
mbed_official 525:c320967f86b9 17 #include "pinmap.h"
mbed_official 525:c320967f86b9 18 #include "em_cmu.h"
mbed_official 525:c320967f86b9 19 #include "mbed_assert.h"
mbed_official 526:7c4bdfe6a168 20 #include "sleepmodes.h"
mbed_official 525:c320967f86b9 21
mbed_official 593:78ee8643776a 22
mbed_official 593:78ee8643776a 23 void gpio_write(gpio_t *obj, int value)
mbed_official 525:c320967f86b9 24 {
mbed_official 593:78ee8643776a 25 if (value) {
mbed_official 593:78ee8643776a 26 GPIO_PinOutSet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); // Pin number encoded in first four bits of obj->pin
mbed_official 593:78ee8643776a 27 } else {
mbed_official 593:78ee8643776a 28 GPIO_PinOutClear((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF);
mbed_official 593:78ee8643776a 29 }
mbed_official 593:78ee8643776a 30 }
mbed_official 593:78ee8643776a 31
mbed_official 593:78ee8643776a 32 int gpio_read(gpio_t *obj)
mbed_official 593:78ee8643776a 33 {
mbed_official 593:78ee8643776a 34 if (obj->dir == PIN_INPUT) {
mbed_official 593:78ee8643776a 35 return GPIO_PinInGet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF); // Pin number encoded in first four bits of obj->pin
mbed_official 593:78ee8643776a 36 } else {
mbed_official 593:78ee8643776a 37 return GPIO_PinOutGet((GPIO_Port_TypeDef)(obj->pin >> 4 & 0xF), obj->pin & 0xF);
mbed_official 593:78ee8643776a 38 }
mbed_official 593:78ee8643776a 39 }
mbed_official 593:78ee8643776a 40
mbed_official 593:78ee8643776a 41 int gpio_is_connected(const gpio_t *obj)
mbed_official 593:78ee8643776a 42 {
mbed_official 593:78ee8643776a 43 return (obj->pin | 0xFFFFFF00 )!= (PinName)NC;
mbed_official 525:c320967f86b9 44 }
mbed_official 525:c320967f86b9 45
mbed_official 525:c320967f86b9 46 /*
mbed_official 525:c320967f86b9 47 * @return the GPIO port mask for this pin
mbed_official 525:c320967f86b9 48 * Pin and port index encoded in one uint32.
mbed_official 525:c320967f86b9 49 * First four bits represent the pin number
mbed_official 525:c320967f86b9 50 * The remaining bits represent the pin mode
mbed_official 525:c320967f86b9 51 */
mbed_official 525:c320967f86b9 52 uint32_t gpio_set(PinName pin)
mbed_official 525:c320967f86b9 53 {
mbed_official 525:c320967f86b9 54 return 1 << ((uint32_t) pin & 0xF);
mbed_official 525:c320967f86b9 55 }
mbed_official 525:c320967f86b9 56
mbed_official 525:c320967f86b9 57 void gpio_init(gpio_t *obj, PinName pin)
mbed_official 525:c320967f86b9 58 {
mbed_official 525:c320967f86b9 59 MBED_ASSERT(pin != NC);
mbed_official 525:c320967f86b9 60
mbed_official 525:c320967f86b9 61 CMU_ClockEnable(cmuClock_HFPER, true);
mbed_official 525:c320967f86b9 62 CMU_ClockEnable(cmuClock_GPIO, true);
mbed_official 525:c320967f86b9 63 obj->pin = pin;
mbed_official 525:c320967f86b9 64 }
mbed_official 525:c320967f86b9 65
mbed_official 525:c320967f86b9 66 void gpio_mode(gpio_t *obj, PinMode mode)
mbed_official 525:c320967f86b9 67 {
mbed_official 593:78ee8643776a 68 if(obj->dir == PIN_INPUT) {
mbed_official 593:78ee8643776a 69 switch(mode) {
mbed_official 593:78ee8643776a 70 case PullDefault:
mbed_official 593:78ee8643776a 71 mode = Input;
mbed_official 593:78ee8643776a 72 break;
mbed_official 593:78ee8643776a 73 case PullUp:
mbed_official 593:78ee8643776a 74 mode = InputPullUp;
mbed_official 593:78ee8643776a 75 break;
mbed_official 593:78ee8643776a 76 case PullDown:
mbed_official 593:78ee8643776a 77 mode = InputPullDown;
mbed_official 593:78ee8643776a 78 break;
mbed_official 593:78ee8643776a 79 default:
mbed_official 593:78ee8643776a 80 break;
mbed_official 593:78ee8643776a 81 }
mbed_official 593:78ee8643776a 82
mbed_official 593:78ee8643776a 83 //Handle DOUT setting
mbed_official 593:78ee8643776a 84 if((mode & 0x10) != 0) {
mbed_official 593:78ee8643776a 85 //Set DOUT
mbed_official 593:78ee8643776a 86 GPIO->P[(obj->pin >> 4) & 0xF].DOUTSET = 1 << (obj->pin & 0xF);
mbed_official 593:78ee8643776a 87 } else {
mbed_official 593:78ee8643776a 88 //Clear DOUT
mbed_official 593:78ee8643776a 89 GPIO->P[(obj->pin >> 4) & 0xF].DOUTCLR = 1 << (obj->pin & 0xF);
mbed_official 593:78ee8643776a 90 }
mbed_official 593:78ee8643776a 91 } else {
mbed_official 593:78ee8643776a 92 switch(mode) {
mbed_official 593:78ee8643776a 93 case PullDefault:
mbed_official 593:78ee8643776a 94 mode = PushPull;
mbed_official 593:78ee8643776a 95 break;
mbed_official 593:78ee8643776a 96 case PullUp:
mbed_official 593:78ee8643776a 97 mode = WiredAndPullUp;
mbed_official 593:78ee8643776a 98 break;
mbed_official 593:78ee8643776a 99 case PullDown:
mbed_official 593:78ee8643776a 100 mode = WiredOrPullDown;
mbed_official 593:78ee8643776a 101 break;
mbed_official 593:78ee8643776a 102 default:
mbed_official 593:78ee8643776a 103 break;
mbed_official 593:78ee8643776a 104 }
mbed_official 593:78ee8643776a 105 }
mbed_official 593:78ee8643776a 106
mbed_official 525:c320967f86b9 107 obj->mode = mode; // Update object
mbed_official 525:c320967f86b9 108 pin_mode(obj->pin, mode); // Update register
mbed_official 525:c320967f86b9 109 }
mbed_official 525:c320967f86b9 110
mbed_official 525:c320967f86b9 111 // Used by DigitalInOut to set correct mode when direction is set
mbed_official 525:c320967f86b9 112 void gpio_dir(gpio_t *obj, PinDirection direction)
mbed_official 525:c320967f86b9 113 {
mbed_official 525:c320967f86b9 114 obj->dir = direction;
mbed_official 525:c320967f86b9 115 switch (direction) {
mbed_official 525:c320967f86b9 116 case PIN_INPUT:
mbed_official 525:c320967f86b9 117 gpio_mode(obj, PullDefault);
mbed_official 525:c320967f86b9 118 break;
mbed_official 525:c320967f86b9 119 case PIN_OUTPUT:
mbed_official 525:c320967f86b9 120 gpio_mode(obj, PullNone);
mbed_official 525:c320967f86b9 121 break;
mbed_official 525:c320967f86b9 122 }
mbed_official 525:c320967f86b9 123 }