forked

Committer:
Kojto
Date:
Thu Aug 03 13:13:39 2017 +0100
Revision:
170:19eb464bc2be
Parent:
167:e84263d55307
This updates the lib to the mbed lib v 148

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #include "objects.h"
AnnaBridge 167:e84263d55307 18 #include "port_api.h"
AnnaBridge 167:e84263d55307 19 #include "pinmap.h"
AnnaBridge 167:e84263d55307 20 #include "gpio_api.h"
AnnaBridge 167:e84263d55307 21 #include "PinNames.h"
AnnaBridge 167:e84263d55307 22
AnnaBridge 167:e84263d55307 23 #if CONFIG_GPIO_EN
AnnaBridge 167:e84263d55307 24
AnnaBridge 167:e84263d55307 25 #if DEVICE_PORTIN || DEVICE_PORTOUT
AnnaBridge 167:e84263d55307 26
AnnaBridge 167:e84263d55307 27 #define GPIO_PORT_NUM 3
AnnaBridge 167:e84263d55307 28 #define GPIO_PORT_WIDTH 32
AnnaBridge 167:e84263d55307 29 #define GPIO_PORT_WIDTH_MAX 32
AnnaBridge 167:e84263d55307 30
AnnaBridge 167:e84263d55307 31 const u8 Default_Port_PinDef[GPIO_PORT_NUM][GPIO_PORT_WIDTH+1] = {
AnnaBridge 167:e84263d55307 32 // Port 0 has these pin:
AnnaBridge 167:e84263d55307 33 {PA_0, PA_1, PB_3, PB_4,
AnnaBridge 167:e84263d55307 34 PB_6, PB_7, PC_1, PC_3,
AnnaBridge 167:e84263d55307 35 PC_4, PC_5, PC_6, PC_7,
AnnaBridge 167:e84263d55307 36 PC_8, PC_9, PD_1, PD_3,
AnnaBridge 167:e84263d55307 37 PD_4, PD_5, PD_6, PD_7,
AnnaBridge 167:e84263d55307 38 PD_9, PE_1, PE_2, PE_3,
AnnaBridge 167:e84263d55307 39 PE_5, PE_6, PE_7, PE_8,
AnnaBridge 167:e84263d55307 40 PG_3, PH_1, PH_3, PH_5,
AnnaBridge 167:e84263d55307 41 0xFF},
AnnaBridge 167:e84263d55307 42
AnnaBridge 167:e84263d55307 43 // Port 1
AnnaBridge 167:e84263d55307 44 {PA_2, PA_3, PA_4, PA_5,
AnnaBridge 167:e84263d55307 45 PA_6, PA_7, PB_0, PB_1,
AnnaBridge 167:e84263d55307 46 PB_2, PB_5, PC_0, PC_2,
AnnaBridge 167:e84263d55307 47 PD_0, PD_2, PD_8, PE_0,
AnnaBridge 167:e84263d55307 48 PE_4, PE_9, PE_A, PF_0,
AnnaBridge 167:e84263d55307 49 PF_1, PF_2, PF_3, PF_4,
AnnaBridge 167:e84263d55307 50 PF_5, PG_0, PG_1, PG_2,
AnnaBridge 167:e84263d55307 51 PG_4, PG_5, PG_6, PG_7,
AnnaBridge 167:e84263d55307 52 0xFF},
AnnaBridge 167:e84263d55307 53
AnnaBridge 167:e84263d55307 54 // Port 2
AnnaBridge 167:e84263d55307 55 {PH_0, PH_2, PH_4, PH_6,
AnnaBridge 167:e84263d55307 56 PH_7, PI_0, PI_1, PI_2,
AnnaBridge 167:e84263d55307 57 PI_3, PI_4, PI_5, PI_6,
AnnaBridge 167:e84263d55307 58 PI_7, PJ_0, PJ_1, PJ_2,
AnnaBridge 167:e84263d55307 59 PJ_3, PJ_4, PJ_5, PJ_6,
AnnaBridge 167:e84263d55307 60 PK_0, PK_1, PK_2, PK_3,
AnnaBridge 167:e84263d55307 61 PK_4, PK_5, PK_6,
AnnaBridge 167:e84263d55307 62 0xFF}
AnnaBridge 167:e84263d55307 63
AnnaBridge 167:e84263d55307 64 };
AnnaBridge 167:e84263d55307 65
AnnaBridge 167:e84263d55307 66 extern const u8 GPIO_SWPORT_DR_TBL[];
AnnaBridge 167:e84263d55307 67 extern const u8 GPIO_EXT_PORT_TBL[];
AnnaBridge 167:e84263d55307 68
AnnaBridge 167:e84263d55307 69 extern VOID HAL_GPIO_Init(HAL_GPIO_PIN *GPIO_Pin);
AnnaBridge 167:e84263d55307 70 extern u32 HAL_GPIO_GetPinName(u32 chip_pin);
AnnaBridge 167:e84263d55307 71
AnnaBridge 167:e84263d55307 72 // high nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, ...)
AnnaBridge 167:e84263d55307 73 // low nibble = pin number
AnnaBridge 167:e84263d55307 74 PinName port_pin(PortName port, int pin_n)
AnnaBridge 167:e84263d55307 75 {
AnnaBridge 167:e84263d55307 76 return (PinName)(pin_n + (port << 4));
AnnaBridge 167:e84263d55307 77 }
AnnaBridge 167:e84263d55307 78
AnnaBridge 167:e84263d55307 79 void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
AnnaBridge 167:e84263d55307 80 {
AnnaBridge 167:e84263d55307 81 u32 i;
AnnaBridge 167:e84263d55307 82
AnnaBridge 167:e84263d55307 83 if (port >= GPIO_PORT_NUM) {
AnnaBridge 167:e84263d55307 84 DBG_GPIO_ERR("port_init: Invalid port num(%d), max port num is %d\r\n", \
AnnaBridge 167:e84263d55307 85 port, (GPIO_PORT_NUM-1));
AnnaBridge 167:e84263d55307 86 }
AnnaBridge 167:e84263d55307 87
AnnaBridge 167:e84263d55307 88 // Fill PORT object structure for future use
AnnaBridge 167:e84263d55307 89 obj->port = port;
AnnaBridge 167:e84263d55307 90 obj->mask = mask;
AnnaBridge 167:e84263d55307 91 obj->direction = dir;
AnnaBridge 167:e84263d55307 92
AnnaBridge 167:e84263d55307 93 if (obj->pin_def == NULL) {
AnnaBridge 167:e84263d55307 94 DBG_GPIO_ERR("Port Define Table isn't assigned\n");
AnnaBridge 167:e84263d55307 95 obj->pin_def = (uint8_t*)&Default_Port_PinDef[port][0];
AnnaBridge 167:e84263d55307 96 }
AnnaBridge 167:e84263d55307 97
AnnaBridge 167:e84263d55307 98 i=0;
AnnaBridge 167:e84263d55307 99 while (obj->pin_def[i] != 0xff) {
AnnaBridge 167:e84263d55307 100 i++;
AnnaBridge 167:e84263d55307 101 if (i == GPIO_PORT_WIDTH_MAX) {
AnnaBridge 167:e84263d55307 102 break;
AnnaBridge 167:e84263d55307 103 }
AnnaBridge 167:e84263d55307 104 }
AnnaBridge 167:e84263d55307 105
AnnaBridge 167:e84263d55307 106 obj->mask &= ((1<<i) - 1);
AnnaBridge 167:e84263d55307 107 port_dir(obj, dir);
AnnaBridge 167:e84263d55307 108 }
AnnaBridge 167:e84263d55307 109
AnnaBridge 167:e84263d55307 110 void port_dir(port_t *obj, PinDirection dir)
AnnaBridge 167:e84263d55307 111 {
AnnaBridge 167:e84263d55307 112 uint32_t i;
AnnaBridge 167:e84263d55307 113 HAL_GPIO_PIN GPIO_Pin;
AnnaBridge 167:e84263d55307 114
AnnaBridge 167:e84263d55307 115 obj->direction = dir;
AnnaBridge 167:e84263d55307 116 for (i = 0; i < GPIO_PORT_WIDTH_MAX; i++) { // Process all pins
AnnaBridge 167:e84263d55307 117 if (obj->pin_def[i] == 0xff) {
AnnaBridge 167:e84263d55307 118 // end of table
AnnaBridge 167:e84263d55307 119 break;
AnnaBridge 167:e84263d55307 120 }
AnnaBridge 167:e84263d55307 121 if (obj->mask & (1 << i)) { // If the pin is used
AnnaBridge 167:e84263d55307 122
AnnaBridge 167:e84263d55307 123 GPIO_Pin.pin_name = HAL_GPIO_GetPinName(obj->pin_def[i]); // get the IP pin name
AnnaBridge 167:e84263d55307 124
AnnaBridge 167:e84263d55307 125 if (dir == PIN_OUTPUT) {
AnnaBridge 167:e84263d55307 126 GPIO_Pin.pin_mode = DOUT_PUSH_PULL;
AnnaBridge 167:e84263d55307 127 } else { // PIN_INPUT
AnnaBridge 167:e84263d55307 128 GPIO_Pin.pin_mode = DIN_PULL_NONE;
AnnaBridge 167:e84263d55307 129 }
AnnaBridge 167:e84263d55307 130 HAL_GPIO_Init(&GPIO_Pin);
AnnaBridge 167:e84263d55307 131 }
AnnaBridge 167:e84263d55307 132 }
AnnaBridge 167:e84263d55307 133 }
AnnaBridge 167:e84263d55307 134
AnnaBridge 167:e84263d55307 135 void port_mode(port_t *obj, PinMode mode)
AnnaBridge 167:e84263d55307 136 {
AnnaBridge 167:e84263d55307 137 uint32_t i;
AnnaBridge 167:e84263d55307 138
AnnaBridge 167:e84263d55307 139 for (i = 0; i < GPIO_PORT_WIDTH_MAX; i++) { // Process all pins
AnnaBridge 167:e84263d55307 140 if (obj->pin_def[i] == 0xff) {
AnnaBridge 167:e84263d55307 141 // end of table
AnnaBridge 167:e84263d55307 142 break;
AnnaBridge 167:e84263d55307 143 }
AnnaBridge 167:e84263d55307 144 if (obj->mask & (1 << i)) { // If the pin is used
AnnaBridge 167:e84263d55307 145 pin_mode(obj->pin_def[i], mode);
AnnaBridge 167:e84263d55307 146 }
AnnaBridge 167:e84263d55307 147 }
AnnaBridge 167:e84263d55307 148 }
AnnaBridge 167:e84263d55307 149
AnnaBridge 167:e84263d55307 150 void port_write(port_t *obj, int value)
AnnaBridge 167:e84263d55307 151 {
AnnaBridge 167:e84263d55307 152 uint32_t i;
AnnaBridge 167:e84263d55307 153 uint32_t pin_name;
AnnaBridge 167:e84263d55307 154 uint8_t port_num;
AnnaBridge 167:e84263d55307 155 uint8_t pin_num;
AnnaBridge 167:e84263d55307 156 uint32_t hal_port[3];
AnnaBridge 167:e84263d55307 157 uint8_t port_changed[3];
AnnaBridge 167:e84263d55307 158
AnnaBridge 167:e84263d55307 159 for (i=0;i<3;i++) {
AnnaBridge 167:e84263d55307 160 hal_port[i] = HAL_READ32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[i]);
AnnaBridge 167:e84263d55307 161 port_changed[i] = 0;
AnnaBridge 167:e84263d55307 162 }
AnnaBridge 167:e84263d55307 163
AnnaBridge 167:e84263d55307 164 for (i = 0; i < GPIO_PORT_WIDTH_MAX; i++) { // Process all pins
AnnaBridge 167:e84263d55307 165 if (obj->pin_def[i] == 0xff) {
AnnaBridge 167:e84263d55307 166 // end of table
AnnaBridge 167:e84263d55307 167 break;
AnnaBridge 167:e84263d55307 168 }
AnnaBridge 167:e84263d55307 169 if (obj->mask & (1 << i)) { // If the pin is used
AnnaBridge 167:e84263d55307 170 pin_name = HAL_GPIO_GetPinName(obj->pin_def[i]); // get the IP pin name
AnnaBridge 167:e84263d55307 171 port_num = HAL_GPIO_GET_PORT_BY_NAME(pin_name);
AnnaBridge 167:e84263d55307 172 pin_num = HAL_GPIO_GET_PIN_BY_NAME(pin_name);
AnnaBridge 167:e84263d55307 173 hal_port[port_num] &= ~(1 << pin_num);
AnnaBridge 167:e84263d55307 174 hal_port[port_num] |= (((value>>i) & 0x01)<< pin_num);
AnnaBridge 167:e84263d55307 175 port_changed[port_num] = 1;
AnnaBridge 167:e84263d55307 176 }
AnnaBridge 167:e84263d55307 177 }
AnnaBridge 167:e84263d55307 178
AnnaBridge 167:e84263d55307 179 for (i=0;i<3;i++) {
AnnaBridge 167:e84263d55307 180 if (port_changed[i]) {
AnnaBridge 167:e84263d55307 181 HAL_WRITE32(GPIO_REG_BASE, GPIO_SWPORT_DR_TBL[i], hal_port[i]);
AnnaBridge 167:e84263d55307 182 }
AnnaBridge 167:e84263d55307 183 }
AnnaBridge 167:e84263d55307 184
AnnaBridge 167:e84263d55307 185 }
AnnaBridge 167:e84263d55307 186
AnnaBridge 167:e84263d55307 187 int port_read(port_t *obj)
AnnaBridge 167:e84263d55307 188 {
AnnaBridge 167:e84263d55307 189 int value=0;
AnnaBridge 167:e84263d55307 190 u32 i;
AnnaBridge 167:e84263d55307 191 uint32_t pin_name;
AnnaBridge 167:e84263d55307 192 uint8_t port_num;
AnnaBridge 167:e84263d55307 193 uint8_t pin_num;
AnnaBridge 167:e84263d55307 194 uint32_t hal_port[3];
AnnaBridge 167:e84263d55307 195
AnnaBridge 167:e84263d55307 196 for (i=0;i<3;i++) {
AnnaBridge 167:e84263d55307 197 hal_port[i] = HAL_READ32(GPIO_REG_BASE, GPIO_EXT_PORT_TBL[i]);
AnnaBridge 167:e84263d55307 198 }
AnnaBridge 167:e84263d55307 199
AnnaBridge 167:e84263d55307 200 for (i = 0; i < GPIO_PORT_WIDTH_MAX; i++) { // Process all pins
AnnaBridge 167:e84263d55307 201 if (obj->pin_def[i] == 0xff) {
AnnaBridge 167:e84263d55307 202 // end of table
AnnaBridge 167:e84263d55307 203 break;
AnnaBridge 167:e84263d55307 204 }
AnnaBridge 167:e84263d55307 205 if (obj->mask & (1 << i)) { // If the pin is used
AnnaBridge 167:e84263d55307 206 pin_name = HAL_GPIO_GetPinName(obj->pin_def[i]); // get the IP pin name
AnnaBridge 167:e84263d55307 207 port_num = HAL_GPIO_GET_PORT_BY_NAME(pin_name);
AnnaBridge 167:e84263d55307 208 pin_num = HAL_GPIO_GET_PIN_BY_NAME(pin_name);
AnnaBridge 167:e84263d55307 209 if (hal_port[port_num] & (1<<pin_num)) {
AnnaBridge 167:e84263d55307 210 value |= (1<<i);
AnnaBridge 167:e84263d55307 211 }
AnnaBridge 167:e84263d55307 212 }
AnnaBridge 167:e84263d55307 213 }
AnnaBridge 167:e84263d55307 214
AnnaBridge 167:e84263d55307 215 return value;
AnnaBridge 167:e84263d55307 216 }
AnnaBridge 167:e84263d55307 217
AnnaBridge 167:e84263d55307 218 #endif //#if DEVICE_PORTIN || DEVICE_PORTOUT
AnnaBridge 167:e84263d55307 219 #endif //#if CONFIG_GPIO_EN