forked
targets/TARGET_Realtek/TARGET_AMEBA/port_api.c@170:19eb464bc2be, 2017-08-03 (annotated)
- 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?
User | Revision | Line number | New 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 |