mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 5 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 6 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 13 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 14 * limitations under the License.
AnnaBridge 189:f392fc9709a3 15 */
AnnaBridge 189:f392fc9709a3 16 #include "objects.h"
AnnaBridge 189:f392fc9709a3 17 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 18
AnnaBridge 189:f392fc9709a3 19 #if CONFIG_GPIO_EN
AnnaBridge 189:f392fc9709a3 20
AnnaBridge 189:f392fc9709a3 21 #include "gpio_api.h"
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 extern void HAL_GPIO_DeInit(HAL_GPIO_PIN *GPIO_Pin);
AnnaBridge 189:f392fc9709a3 24
AnnaBridge 189:f392fc9709a3 25 // convert Mbed pin mode to HAL Pin Mode
AnnaBridge 189:f392fc9709a3 26 const u8 GPIO_InPinMode[] = {
AnnaBridge 189:f392fc9709a3 27 DIN_PULL_NONE, // PullNone
AnnaBridge 189:f392fc9709a3 28 DIN_PULL_HIGH, // PullUp
AnnaBridge 189:f392fc9709a3 29 DIN_PULL_LOW, // PullDown
AnnaBridge 189:f392fc9709a3 30 DIN_PULL_NONE // OpenDrain
AnnaBridge 189:f392fc9709a3 31 };
AnnaBridge 189:f392fc9709a3 32
AnnaBridge 189:f392fc9709a3 33 const u8 GPIO_SWPORT_DR_TBL[] = {
AnnaBridge 189:f392fc9709a3 34 GPIO_PORTA_DR,
AnnaBridge 189:f392fc9709a3 35 GPIO_PORTB_DR,
AnnaBridge 189:f392fc9709a3 36 GPIO_PORTC_DR
AnnaBridge 189:f392fc9709a3 37 };
AnnaBridge 189:f392fc9709a3 38
AnnaBridge 189:f392fc9709a3 39 const u8 GPIO_EXT_PORT_TBL[] = {
AnnaBridge 189:f392fc9709a3 40 GPIO_EXT_PORTA,
AnnaBridge 189:f392fc9709a3 41 GPIO_EXT_PORTB,
AnnaBridge 189:f392fc9709a3 42 GPIO_EXT_PORTC
AnnaBridge 189:f392fc9709a3 43 };
AnnaBridge 189:f392fc9709a3 44
AnnaBridge 189:f392fc9709a3 45 const u8 GPIO_SWPORT_DDR_TBL[] = {
AnnaBridge 189:f392fc9709a3 46 GPIO_PORTA_DDR,
AnnaBridge 189:f392fc9709a3 47 GPIO_PORTB_DDR,
AnnaBridge 189:f392fc9709a3 48 GPIO_PORTC_DDR
AnnaBridge 189:f392fc9709a3 49 };
AnnaBridge 189:f392fc9709a3 50
AnnaBridge 189:f392fc9709a3 51 void gpio_set_hal_pin_mode(gpio_t *obj)
AnnaBridge 189:f392fc9709a3 52 {
AnnaBridge 189:f392fc9709a3 53 uint32_t mode;
AnnaBridge 189:f392fc9709a3 54
AnnaBridge 189:f392fc9709a3 55 mode = obj->mode;
AnnaBridge 189:f392fc9709a3 56 if (obj->direction == PIN_OUTPUT) {
AnnaBridge 189:f392fc9709a3 57 if (mode == OpenDrain) {
AnnaBridge 189:f392fc9709a3 58 obj->hal_pin.pin_mode = DOUT_OPEN_DRAIN;
AnnaBridge 189:f392fc9709a3 59 } else {
AnnaBridge 189:f392fc9709a3 60 obj->hal_pin.pin_mode = DOUT_PUSH_PULL;
AnnaBridge 189:f392fc9709a3 61 }
AnnaBridge 189:f392fc9709a3 62 } else {
AnnaBridge 189:f392fc9709a3 63 if (mode < 4) {
AnnaBridge 189:f392fc9709a3 64 obj->hal_pin.pin_mode = GPIO_InPinMode[mode];
AnnaBridge 189:f392fc9709a3 65 } else {
AnnaBridge 189:f392fc9709a3 66 obj->hal_pin.pin_mode = DIN_PULL_NONE;
AnnaBridge 189:f392fc9709a3 67 }
AnnaBridge 189:f392fc9709a3 68 }
AnnaBridge 189:f392fc9709a3 69 }
AnnaBridge 189:f392fc9709a3 70
AnnaBridge 189:f392fc9709a3 71 uint32_t gpio_set(PinName pin)
AnnaBridge 189:f392fc9709a3 72 {
AnnaBridge 189:f392fc9709a3 73 u32 ip_pin;
AnnaBridge 189:f392fc9709a3 74
AnnaBridge 189:f392fc9709a3 75 DBG_ASSERT(pin != (PinName)NC);
AnnaBridge 189:f392fc9709a3 76 pin_function(pin, 0);
AnnaBridge 189:f392fc9709a3 77 ip_pin = HAL_GPIO_GetPinName((u32)pin);
AnnaBridge 189:f392fc9709a3 78
AnnaBridge 189:f392fc9709a3 79 return ip_pin;
AnnaBridge 189:f392fc9709a3 80 }
AnnaBridge 189:f392fc9709a3 81
AnnaBridge 189:f392fc9709a3 82 void gpio_init(gpio_t *obj, PinName pin)
AnnaBridge 189:f392fc9709a3 83 {
AnnaBridge 189:f392fc9709a3 84 uint32_t pin_name;
AnnaBridge 189:f392fc9709a3 85
AnnaBridge 189:f392fc9709a3 86 if (pin == (PinName)NC)
AnnaBridge 189:f392fc9709a3 87 return;
AnnaBridge 189:f392fc9709a3 88
AnnaBridge 189:f392fc9709a3 89 obj->pin = pin;
AnnaBridge 189:f392fc9709a3 90 obj->mode = PullNone;
AnnaBridge 189:f392fc9709a3 91 obj->direction = PIN_INPUT;
AnnaBridge 189:f392fc9709a3 92 pin_name = gpio_set(pin); // get the IP pin name
AnnaBridge 189:f392fc9709a3 93 obj->hal_pin.pin_name = pin_name;
AnnaBridge 189:f392fc9709a3 94 obj->hal_pin.pin_mode = DIN_PULL_NONE;
AnnaBridge 189:f392fc9709a3 95 obj->hal_port_num = HAL_GPIO_GET_PORT_BY_NAME(pin_name);
AnnaBridge 189:f392fc9709a3 96 obj->hal_pin_num = HAL_GPIO_GET_PIN_BY_NAME(pin_name);
AnnaBridge 189:f392fc9709a3 97 HAL_GPIO_Init(&obj->hal_pin);
AnnaBridge 189:f392fc9709a3 98 }
AnnaBridge 189:f392fc9709a3 99
AnnaBridge 189:f392fc9709a3 100 void gpio_mode(gpio_t *obj, PinMode mode)
AnnaBridge 189:f392fc9709a3 101 {
AnnaBridge 189:f392fc9709a3 102 obj->mode = mode;
AnnaBridge 189:f392fc9709a3 103 gpio_set_hal_pin_mode(obj);
AnnaBridge 189:f392fc9709a3 104 HAL_GPIO_Init(&obj->hal_pin);
AnnaBridge 189:f392fc9709a3 105 }
AnnaBridge 189:f392fc9709a3 106
AnnaBridge 189:f392fc9709a3 107 // Initial the Pin direction
AnnaBridge 189:f392fc9709a3 108 void gpio_dir(gpio_t *obj, PinDirection direction)
AnnaBridge 189:f392fc9709a3 109 {
AnnaBridge 189:f392fc9709a3 110 obj->direction = direction;
AnnaBridge 189:f392fc9709a3 111 gpio_set_hal_pin_mode(obj);
AnnaBridge 189:f392fc9709a3 112 HAL_GPIO_Init(&obj->hal_pin);
AnnaBridge 189:f392fc9709a3 113 }
AnnaBridge 189:f392fc9709a3 114
AnnaBridge 189:f392fc9709a3 115 // Change the pin direction directly
AnnaBridge 189:f392fc9709a3 116 void gpio_change_dir(gpio_t *obj, PinDirection direction)
AnnaBridge 189:f392fc9709a3 117 {
AnnaBridge 189:f392fc9709a3 118 uint32_t reg_value;
AnnaBridge 189:f392fc9709a3 119 uint8_t port_num;
AnnaBridge 189:f392fc9709a3 120 uint8_t pin_num;
AnnaBridge 189:f392fc9709a3 121
AnnaBridge 189:f392fc9709a3 122 obj->direction = direction;
AnnaBridge 189:f392fc9709a3 123 gpio_set_hal_pin_mode(obj);
AnnaBridge 189:f392fc9709a3 124 port_num = obj->hal_port_num;
AnnaBridge 189:f392fc9709a3 125 pin_num = obj->hal_pin_num;
AnnaBridge 189:f392fc9709a3 126
AnnaBridge 189:f392fc9709a3 127 reg_value = HAL_READ32(GPIO_REG_BASE, GPIO_SWPORT_DDR_TBL[port_num]);
AnnaBridge 189:f392fc9709a3 128 if (direction) {
AnnaBridge 189:f392fc9709a3 129 // Out
AnnaBridge 189:f392fc9709a3 130 reg_value |= (1 << pin_num);
AnnaBridge 189:f392fc9709a3 131 } else {
AnnaBridge 189:f392fc9709a3 132 // In
AnnaBridge 189:f392fc9709a3 133 reg_value &= ~(1 << pin_num);
AnnaBridge 189:f392fc9709a3 134 }
AnnaBridge 189:f392fc9709a3 135 HAL_WRITE32(GPIO_REG_BASE, GPIO_SWPORT_DDR_TBL[port_num], reg_value);
AnnaBridge 189:f392fc9709a3 136 }
AnnaBridge 189:f392fc9709a3 137
AnnaBridge 189:f392fc9709a3 138 void gpio_write(gpio_t *obj, int value)
AnnaBridge 189:f392fc9709a3 139 {
AnnaBridge 189:f392fc9709a3 140 HAL_GPIO_PIN *hal_pin=&obj->hal_pin;
AnnaBridge 189:f392fc9709a3 141 volatile uint32_t reg_value;
AnnaBridge 189:f392fc9709a3 142 uint8_t port_num;
AnnaBridge 189:f392fc9709a3 143 uint8_t pin_num;
AnnaBridge 189:f392fc9709a3 144
AnnaBridge 189:f392fc9709a3 145 if (hal_pin->pin_mode != DOUT_OPEN_DRAIN) {
AnnaBridge 189:f392fc9709a3 146 port_num = obj->hal_port_num;
AnnaBridge 189:f392fc9709a3 147 pin_num = obj->hal_pin_num;
AnnaBridge 189:f392fc9709a3 148
AnnaBridge 189:f392fc9709a3 149 reg_value = HAL_READ32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[port_num]);
AnnaBridge 189:f392fc9709a3 150 reg_value &= ~(1 << pin_num);
AnnaBridge 189:f392fc9709a3 151 reg_value |= ((value&0x01)<< pin_num);
AnnaBridge 189:f392fc9709a3 152 HAL_WRITE32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[port_num], reg_value);
AnnaBridge 189:f392fc9709a3 153 } else {
AnnaBridge 189:f392fc9709a3 154 HAL_GPIO_WritePin(&obj->hal_pin, value);
AnnaBridge 189:f392fc9709a3 155 }
AnnaBridge 189:f392fc9709a3 156 }
AnnaBridge 189:f392fc9709a3 157
AnnaBridge 189:f392fc9709a3 158 int gpio_read(gpio_t *obj)
AnnaBridge 189:f392fc9709a3 159 {
AnnaBridge 189:f392fc9709a3 160 volatile uint32_t reg_value;
AnnaBridge 189:f392fc9709a3 161 uint8_t port_num;
AnnaBridge 189:f392fc9709a3 162 uint8_t pin_num;
AnnaBridge 189:f392fc9709a3 163 HAL_GPIO_PIN_MODE pin_mode;
AnnaBridge 189:f392fc9709a3 164
AnnaBridge 189:f392fc9709a3 165 port_num = obj->hal_port_num;
AnnaBridge 189:f392fc9709a3 166 pin_num = obj->hal_pin_num;
AnnaBridge 189:f392fc9709a3 167 pin_mode = obj->hal_pin.pin_mode;
AnnaBridge 189:f392fc9709a3 168
AnnaBridge 189:f392fc9709a3 169 reg_value = HAL_READ32(GPIO_REG_BASE, GPIO_EXT_PORT_TBL[port_num]);
AnnaBridge 189:f392fc9709a3 170 if (pin_mode != DOUT_OPEN_DRAIN) {
AnnaBridge 189:f392fc9709a3 171 return ((reg_value >> pin_num) & 0x01);
AnnaBridge 189:f392fc9709a3 172 } else {
AnnaBridge 189:f392fc9709a3 173 return (!((reg_value >> pin_num) & 0x01));
AnnaBridge 189:f392fc9709a3 174 }
AnnaBridge 189:f392fc9709a3 175 }
AnnaBridge 189:f392fc9709a3 176
AnnaBridge 189:f392fc9709a3 177 // This API only works for non-Open-Drain pin
AnnaBridge 189:f392fc9709a3 178 void gpio_direct_write(gpio_t *obj, BOOL value)
AnnaBridge 189:f392fc9709a3 179 {
AnnaBridge 189:f392fc9709a3 180 uint8_t port_num;
AnnaBridge 189:f392fc9709a3 181 uint8_t pin_num;
AnnaBridge 189:f392fc9709a3 182 uint32_t reg_value;
AnnaBridge 189:f392fc9709a3 183
AnnaBridge 189:f392fc9709a3 184 port_num = obj->hal_port_num;
AnnaBridge 189:f392fc9709a3 185 pin_num = obj->hal_pin_num;
AnnaBridge 189:f392fc9709a3 186
AnnaBridge 189:f392fc9709a3 187 reg_value = HAL_READ32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[port_num]);
AnnaBridge 189:f392fc9709a3 188 reg_value &= ~(1 << pin_num);
AnnaBridge 189:f392fc9709a3 189 reg_value |= (value<< pin_num);
AnnaBridge 189:f392fc9709a3 190 HAL_WRITE32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[port_num], reg_value);
AnnaBridge 189:f392fc9709a3 191 }
AnnaBridge 189:f392fc9709a3 192
AnnaBridge 189:f392fc9709a3 193 void gpio_pull_ctrl(gpio_t *obj, PinMode pull_type)
AnnaBridge 189:f392fc9709a3 194 {
AnnaBridge 189:f392fc9709a3 195 HAL_GPIO_PullCtrl((u32) obj->pin, (u32)pull_type);
AnnaBridge 189:f392fc9709a3 196 }
AnnaBridge 189:f392fc9709a3 197
AnnaBridge 189:f392fc9709a3 198 void gpio_deinit(gpio_t *obj)
AnnaBridge 189:f392fc9709a3 199 {
AnnaBridge 189:f392fc9709a3 200 HAL_GPIO_DeInit(&obj->hal_pin);
AnnaBridge 189:f392fc9709a3 201 }
AnnaBridge 189:f392fc9709a3 202
AnnaBridge 189:f392fc9709a3 203 int gpio_is_connected(const gpio_t *obj)
AnnaBridge 189:f392fc9709a3 204 {
AnnaBridge 189:f392fc9709a3 205 if(obj->pin != (PinName)NC){
AnnaBridge 189:f392fc9709a3 206 return 1;
AnnaBridge 189:f392fc9709a3 207 } else {
AnnaBridge 189:f392fc9709a3 208 return 0;
AnnaBridge 189:f392fc9709a3 209 }
AnnaBridge 189:f392fc9709a3 210 }
AnnaBridge 189:f392fc9709a3 211
AnnaBridge 189:f392fc9709a3 212 #endif
AnnaBridge 189:f392fc9709a3 213