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 * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2017 All rights reserved
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 <string.h>
AnnaBridge 189:f392fc9709a3 17 #include "serial_api.h"
AnnaBridge 189:f392fc9709a3 18 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 19 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 20 #include "gpio_include.h"
AnnaBridge 189:f392fc9709a3 21 #include "objects.h"
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 static const PinMap PinMap_UART_TX[] = {
AnnaBridge 189:f392fc9709a3 24 {PA1, SERIAL_0, PIN_DATA(1, 1)},
AnnaBridge 189:f392fc9709a3 25 {PJ1, SERIAL_1, PIN_DATA(1, 1)},
AnnaBridge 189:f392fc9709a3 26 {PB2, SERIAL_2, PIN_DATA(5, 1)},
AnnaBridge 189:f392fc9709a3 27 {PA6, SERIAL_3, PIN_DATA(2, 1)},
AnnaBridge 189:f392fc9709a3 28 {PV6, SERIAL_4, PIN_DATA(1, 1)},
AnnaBridge 189:f392fc9709a3 29 {PN2, SERIAL_5, PIN_DATA(2, 1)},
AnnaBridge 189:f392fc9709a3 30 {NC, NC, 0}
AnnaBridge 189:f392fc9709a3 31 };
AnnaBridge 189:f392fc9709a3 32
AnnaBridge 189:f392fc9709a3 33 static const PinMap PinMap_UART_RX[] = {
AnnaBridge 189:f392fc9709a3 34 {PA2, SERIAL_0, PIN_DATA(1, 0)},
AnnaBridge 189:f392fc9709a3 35 {PJ2, SERIAL_1, PIN_DATA(1, 0)},
AnnaBridge 189:f392fc9709a3 36 {PB3, SERIAL_2, PIN_DATA(5, 0)},
AnnaBridge 189:f392fc9709a3 37 {PA7, SERIAL_3, PIN_DATA(2, 0)},
AnnaBridge 189:f392fc9709a3 38 {PV7, SERIAL_4, PIN_DATA(1, 0)},
AnnaBridge 189:f392fc9709a3 39 {PN3, SERIAL_5, PIN_DATA(2, 0)},
AnnaBridge 189:f392fc9709a3 40 {NC, NC, 0}
AnnaBridge 189:f392fc9709a3 41 };
AnnaBridge 189:f392fc9709a3 42
AnnaBridge 189:f392fc9709a3 43 #define UART_NUM 6
AnnaBridge 189:f392fc9709a3 44
AnnaBridge 189:f392fc9709a3 45 static uint32_t serial_irq_ids[UART_NUM] = {0};
AnnaBridge 189:f392fc9709a3 46 static uart_irq_handler irq_handler;
AnnaBridge 189:f392fc9709a3 47 int stdio_uart_inited = 0;
AnnaBridge 189:f392fc9709a3 48 serial_t stdio_uart;
AnnaBridge 189:f392fc9709a3 49
AnnaBridge 189:f392fc9709a3 50 static void uart_init(TSB_UART_TypeDef * UARTx, uart_inittypedef_t * InitStruct);
AnnaBridge 189:f392fc9709a3 51 static void uart_get_boudrate_setting(uart_boudrate_t *brddiviser, uint32_t boudrate);
AnnaBridge 189:f392fc9709a3 52 static void uart_swreset(TSB_UART_TypeDef * UARTx);
AnnaBridge 189:f392fc9709a3 53
AnnaBridge 189:f392fc9709a3 54 void serial_init(serial_t *obj, PinName tx, PinName rx)
AnnaBridge 189:f392fc9709a3 55 {
AnnaBridge 189:f392fc9709a3 56 int is_stdio_uart = 0;
AnnaBridge 189:f392fc9709a3 57 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
AnnaBridge 189:f392fc9709a3 58 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
AnnaBridge 189:f392fc9709a3 59 UARTName uart_name = (UARTName)pinmap_merge(uart_tx, uart_rx);
AnnaBridge 189:f392fc9709a3 60 MBED_ASSERT((int)uart_name != NC);
AnnaBridge 189:f392fc9709a3 61
AnnaBridge 189:f392fc9709a3 62 obj->index = uart_name;
AnnaBridge 189:f392fc9709a3 63 switch (uart_name) { /* Initialize UART instance */
AnnaBridge 189:f392fc9709a3 64 case SERIAL_0:
AnnaBridge 189:f392fc9709a3 65 obj->UARTx = UART0;
AnnaBridge 189:f392fc9709a3 66 TSB_CG_FSYSENB_IPENB05 = ENABLE;
AnnaBridge 189:f392fc9709a3 67 TSB_CG_FSYSENA_IPENA00 = ENABLE;
AnnaBridge 189:f392fc9709a3 68 break;
AnnaBridge 189:f392fc9709a3 69 case SERIAL_1:
AnnaBridge 189:f392fc9709a3 70 obj->UARTx = UART1;
AnnaBridge 189:f392fc9709a3 71 TSB_CG_FSYSENB_IPENB06 = ENABLE;
AnnaBridge 189:f392fc9709a3 72 TSB_CG_FSYSENA_IPENA08 = ENABLE;
AnnaBridge 189:f392fc9709a3 73 break;
AnnaBridge 189:f392fc9709a3 74 case SERIAL_2:
AnnaBridge 189:f392fc9709a3 75 obj->UARTx = UART2;
AnnaBridge 189:f392fc9709a3 76 TSB_CG_FSYSENB_IPENB07 = ENABLE;
AnnaBridge 189:f392fc9709a3 77 TSB_CG_FSYSENA_IPENA01 = ENABLE;
AnnaBridge 189:f392fc9709a3 78 break;
AnnaBridge 189:f392fc9709a3 79 case SERIAL_3:
AnnaBridge 189:f392fc9709a3 80 obj->UARTx = UART3;
AnnaBridge 189:f392fc9709a3 81 TSB_CG_FSYSENB_IPENB08 = ENABLE;
AnnaBridge 189:f392fc9709a3 82 TSB_CG_FSYSENA_IPENA00 = ENABLE;
AnnaBridge 189:f392fc9709a3 83 break;
AnnaBridge 189:f392fc9709a3 84 case SERIAL_4:
AnnaBridge 189:f392fc9709a3 85 obj->UARTx = UART4;
AnnaBridge 189:f392fc9709a3 86 TSB_CG_FSYSENB_IPENB09 = ENABLE;
AnnaBridge 189:f392fc9709a3 87 TSB_CG_FSYSENA_IPENA17 = ENABLE;
AnnaBridge 189:f392fc9709a3 88 break;
AnnaBridge 189:f392fc9709a3 89 case SERIAL_5:
AnnaBridge 189:f392fc9709a3 90 obj->UARTx = UART5;
AnnaBridge 189:f392fc9709a3 91 TSB_CG_FSYSENB_IPENB10 = ENABLE;
AnnaBridge 189:f392fc9709a3 92 TSB_CG_FSYSENA_IPENA12 = ENABLE;
AnnaBridge 189:f392fc9709a3 93 break;
AnnaBridge 189:f392fc9709a3 94 default:
AnnaBridge 189:f392fc9709a3 95 error("UART is not available");
AnnaBridge 189:f392fc9709a3 96 break;
AnnaBridge 189:f392fc9709a3 97 }
AnnaBridge 189:f392fc9709a3 98
AnnaBridge 189:f392fc9709a3 99 pinmap_pinout(tx, PinMap_UART_TX);
AnnaBridge 189:f392fc9709a3 100 pinmap_pinout(rx, PinMap_UART_RX);
AnnaBridge 189:f392fc9709a3 101 if (tx != NC && rx != NC) {
AnnaBridge 189:f392fc9709a3 102 obj->uart_config.Mode = UART_ENABLE_RX | UART_ENABLE_TX;
AnnaBridge 189:f392fc9709a3 103 } else {
AnnaBridge 189:f392fc9709a3 104 if (tx != NC) {
AnnaBridge 189:f392fc9709a3 105 obj->uart_config.Mode = UART_ENABLE_TX;
AnnaBridge 189:f392fc9709a3 106 } else {
AnnaBridge 189:f392fc9709a3 107 if (rx != NC) {
AnnaBridge 189:f392fc9709a3 108 obj->uart_config.Mode = UART_ENABLE_RX;
AnnaBridge 189:f392fc9709a3 109 }
AnnaBridge 189:f392fc9709a3 110 }
AnnaBridge 189:f392fc9709a3 111 }
AnnaBridge 189:f392fc9709a3 112 obj->uart_config.BaudRate = 9600;
AnnaBridge 189:f392fc9709a3 113 obj->uart_config.DataBits = 8;
AnnaBridge 189:f392fc9709a3 114 obj->uart_config.StopBits = 0;
AnnaBridge 189:f392fc9709a3 115 obj->uart_config.Parity = ParityNone;
AnnaBridge 189:f392fc9709a3 116 obj->uart_config.FlowCtrl = FlowControlNone;
AnnaBridge 189:f392fc9709a3 117
AnnaBridge 189:f392fc9709a3 118 uart_init(obj->UARTx, &obj->uart_config);
AnnaBridge 189:f392fc9709a3 119 is_stdio_uart = (uart_name == STDIO_UART) ? (1) : (0);
AnnaBridge 189:f392fc9709a3 120
AnnaBridge 189:f392fc9709a3 121 if (is_stdio_uart) {
AnnaBridge 189:f392fc9709a3 122 stdio_uart_inited = 1;
AnnaBridge 189:f392fc9709a3 123 memcpy(&stdio_uart, obj, sizeof(serial_t));
AnnaBridge 189:f392fc9709a3 124 }
AnnaBridge 189:f392fc9709a3 125 }
AnnaBridge 189:f392fc9709a3 126
AnnaBridge 189:f392fc9709a3 127 void serial_free(serial_t *obj)
AnnaBridge 189:f392fc9709a3 128 {
AnnaBridge 189:f392fc9709a3 129 obj->UARTx->TRANS = 0;
AnnaBridge 189:f392fc9709a3 130 obj->UARTx->CR0 = 0;
AnnaBridge 189:f392fc9709a3 131 obj->UARTx->CR1 = 0;
AnnaBridge 189:f392fc9709a3 132
AnnaBridge 189:f392fc9709a3 133 uart_swreset(obj->UARTx);
AnnaBridge 189:f392fc9709a3 134
AnnaBridge 189:f392fc9709a3 135 obj->uart_config.BaudRate = 0;
AnnaBridge 189:f392fc9709a3 136 obj->uart_config.DataBits = 0;
AnnaBridge 189:f392fc9709a3 137 obj->uart_config.StopBits = 0;
AnnaBridge 189:f392fc9709a3 138 obj->uart_config.Parity = 0;
AnnaBridge 189:f392fc9709a3 139 obj->uart_config.Mode = 0;
AnnaBridge 189:f392fc9709a3 140 obj->uart_config.FlowCtrl = 0;
AnnaBridge 189:f392fc9709a3 141 }
AnnaBridge 189:f392fc9709a3 142
AnnaBridge 189:f392fc9709a3 143 void serial_baud(serial_t *obj, int baudrate)
AnnaBridge 189:f392fc9709a3 144 {
AnnaBridge 189:f392fc9709a3 145 obj->uart_config.BaudRate = baudrate;
AnnaBridge 189:f392fc9709a3 146 uart_init(obj->UARTx, &obj->uart_config);
AnnaBridge 189:f392fc9709a3 147 }
AnnaBridge 189:f392fc9709a3 148 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
AnnaBridge 189:f392fc9709a3 149 {
AnnaBridge 189:f392fc9709a3 150 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2)); // 0: 1 stop bits, 1: 2 stop bits
AnnaBridge 189:f392fc9709a3 151 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
AnnaBridge 189:f392fc9709a3 152 MBED_ASSERT((data_bits > 6) && (data_bits < 10)); // 0: 7 data bits ... 2: 9 data bits
AnnaBridge 189:f392fc9709a3 153
AnnaBridge 189:f392fc9709a3 154 obj->uart_config.DataBits = data_bits;
AnnaBridge 189:f392fc9709a3 155 obj->uart_config.StopBits = stop_bits;
AnnaBridge 189:f392fc9709a3 156 obj->uart_config.Parity = parity;
AnnaBridge 189:f392fc9709a3 157 uart_init(obj->UARTx, &obj->uart_config);
AnnaBridge 189:f392fc9709a3 158 }
AnnaBridge 189:f392fc9709a3 159
AnnaBridge 189:f392fc9709a3 160 void INTUART0TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 161 {
AnnaBridge 189:f392fc9709a3 162 irq_handler(serial_irq_ids[SERIAL_0], TxIrq);
AnnaBridge 189:f392fc9709a3 163 }
AnnaBridge 189:f392fc9709a3 164
AnnaBridge 189:f392fc9709a3 165 void INTUART0RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 166 {
AnnaBridge 189:f392fc9709a3 167 irq_handler(serial_irq_ids[SERIAL_0], RxIrq);
AnnaBridge 189:f392fc9709a3 168 }
AnnaBridge 189:f392fc9709a3 169
AnnaBridge 189:f392fc9709a3 170 void INTUART1TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 171 {
AnnaBridge 189:f392fc9709a3 172 irq_handler(serial_irq_ids[SERIAL_1], TxIrq);
AnnaBridge 189:f392fc9709a3 173 }
AnnaBridge 189:f392fc9709a3 174
AnnaBridge 189:f392fc9709a3 175 void INTUART1RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 176 {
AnnaBridge 189:f392fc9709a3 177 irq_handler(serial_irq_ids[SERIAL_1], RxIrq);
AnnaBridge 189:f392fc9709a3 178 }
AnnaBridge 189:f392fc9709a3 179 void INTUART2TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 180 {
AnnaBridge 189:f392fc9709a3 181 irq_handler(serial_irq_ids[SERIAL_2], TxIrq);
AnnaBridge 189:f392fc9709a3 182 }
AnnaBridge 189:f392fc9709a3 183
AnnaBridge 189:f392fc9709a3 184 void INTUART2RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 185 {
AnnaBridge 189:f392fc9709a3 186 irq_handler(serial_irq_ids[SERIAL_2], RxIrq);
AnnaBridge 189:f392fc9709a3 187 }
AnnaBridge 189:f392fc9709a3 188
AnnaBridge 189:f392fc9709a3 189 void INTUART3TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 190 {
AnnaBridge 189:f392fc9709a3 191 irq_handler(serial_irq_ids[SERIAL_3], TxIrq);
AnnaBridge 189:f392fc9709a3 192 }
AnnaBridge 189:f392fc9709a3 193
AnnaBridge 189:f392fc9709a3 194 void INTUART3RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 195 {
AnnaBridge 189:f392fc9709a3 196 irq_handler(serial_irq_ids[SERIAL_3], RxIrq);
AnnaBridge 189:f392fc9709a3 197 }
AnnaBridge 189:f392fc9709a3 198
AnnaBridge 189:f392fc9709a3 199 void INTUART4TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 200 {
AnnaBridge 189:f392fc9709a3 201 irq_handler(serial_irq_ids[SERIAL_4], TxIrq);
AnnaBridge 189:f392fc9709a3 202 }
AnnaBridge 189:f392fc9709a3 203
AnnaBridge 189:f392fc9709a3 204 void INTUART4RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 205 {
AnnaBridge 189:f392fc9709a3 206 irq_handler(serial_irq_ids[SERIAL_4], RxIrq);
AnnaBridge 189:f392fc9709a3 207 }
AnnaBridge 189:f392fc9709a3 208
AnnaBridge 189:f392fc9709a3 209 void INTUART5TX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 210 {
AnnaBridge 189:f392fc9709a3 211 irq_handler(serial_irq_ids[SERIAL_5], TxIrq);
AnnaBridge 189:f392fc9709a3 212 }
AnnaBridge 189:f392fc9709a3 213
AnnaBridge 189:f392fc9709a3 214 void INTUART5RX_IRQHandler(void)
AnnaBridge 189:f392fc9709a3 215 {
AnnaBridge 189:f392fc9709a3 216 irq_handler(serial_irq_ids[SERIAL_5], RxIrq);
AnnaBridge 189:f392fc9709a3 217 }
AnnaBridge 189:f392fc9709a3 218
AnnaBridge 189:f392fc9709a3 219 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
AnnaBridge 189:f392fc9709a3 220 {
AnnaBridge 189:f392fc9709a3 221 irq_handler = handler;
AnnaBridge 189:f392fc9709a3 222 serial_irq_ids[obj->index] = id;
AnnaBridge 189:f392fc9709a3 223 }
AnnaBridge 189:f392fc9709a3 224
AnnaBridge 189:f392fc9709a3 225 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
AnnaBridge 189:f392fc9709a3 226 {
AnnaBridge 189:f392fc9709a3 227 IRQn_Type irq_n = (IRQn_Type)0;
AnnaBridge 189:f392fc9709a3 228
AnnaBridge 189:f392fc9709a3 229 switch (obj->index) {
AnnaBridge 189:f392fc9709a3 230 case SERIAL_0:
AnnaBridge 189:f392fc9709a3 231 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 232 irq_n = INTUART0RX_IRQn;
AnnaBridge 189:f392fc9709a3 233 } else {
AnnaBridge 189:f392fc9709a3 234 irq_n = INTUART0TX_IRQn;
AnnaBridge 189:f392fc9709a3 235 }
AnnaBridge 189:f392fc9709a3 236 break;
AnnaBridge 189:f392fc9709a3 237 case SERIAL_1:
AnnaBridge 189:f392fc9709a3 238 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 239 irq_n = INTUART1RX_IRQn;
AnnaBridge 189:f392fc9709a3 240 } else {
AnnaBridge 189:f392fc9709a3 241 irq_n = INTUART1TX_IRQn;
AnnaBridge 189:f392fc9709a3 242 }
AnnaBridge 189:f392fc9709a3 243 break;
AnnaBridge 189:f392fc9709a3 244 case SERIAL_2:
AnnaBridge 189:f392fc9709a3 245 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 246 irq_n = INTUART2RX_IRQn;
AnnaBridge 189:f392fc9709a3 247 } else {
AnnaBridge 189:f392fc9709a3 248 irq_n = INTUART2TX_IRQn;
AnnaBridge 189:f392fc9709a3 249 }
AnnaBridge 189:f392fc9709a3 250 break;
AnnaBridge 189:f392fc9709a3 251 case SERIAL_3:
AnnaBridge 189:f392fc9709a3 252 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 253 irq_n = INTUART3RX_IRQn;
AnnaBridge 189:f392fc9709a3 254 } else {
AnnaBridge 189:f392fc9709a3 255 irq_n = INTUART3TX_IRQn;
AnnaBridge 189:f392fc9709a3 256 }
AnnaBridge 189:f392fc9709a3 257 break;
AnnaBridge 189:f392fc9709a3 258 case SERIAL_4:
AnnaBridge 189:f392fc9709a3 259 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 260 irq_n = INTUART4RX_IRQn;
AnnaBridge 189:f392fc9709a3 261 } else {
AnnaBridge 189:f392fc9709a3 262 irq_n = INTUART4TX_IRQn;
AnnaBridge 189:f392fc9709a3 263 }
AnnaBridge 189:f392fc9709a3 264 break;
AnnaBridge 189:f392fc9709a3 265 case SERIAL_5:
AnnaBridge 189:f392fc9709a3 266 if (irq == RxIrq) {
AnnaBridge 189:f392fc9709a3 267 irq_n = INTUART5RX_IRQn;
AnnaBridge 189:f392fc9709a3 268 } else {
AnnaBridge 189:f392fc9709a3 269 irq_n = INTUART5TX_IRQn;
AnnaBridge 189:f392fc9709a3 270 }
AnnaBridge 189:f392fc9709a3 271 break;
AnnaBridge 189:f392fc9709a3 272 default:
AnnaBridge 189:f392fc9709a3 273 break;
AnnaBridge 189:f392fc9709a3 274 }
AnnaBridge 189:f392fc9709a3 275 NVIC_ClearPendingIRQ(irq_n);
AnnaBridge 189:f392fc9709a3 276 if (enable) {
AnnaBridge 189:f392fc9709a3 277 NVIC_EnableIRQ(irq_n);
AnnaBridge 189:f392fc9709a3 278 } else {
AnnaBridge 189:f392fc9709a3 279 NVIC_DisableIRQ(irq_n);
AnnaBridge 189:f392fc9709a3 280 }
AnnaBridge 189:f392fc9709a3 281 }
AnnaBridge 189:f392fc9709a3 282
AnnaBridge 189:f392fc9709a3 283 int serial_getc(serial_t *obj)
AnnaBridge 189:f392fc9709a3 284 {
AnnaBridge 189:f392fc9709a3 285 int data = 0;
AnnaBridge 189:f392fc9709a3 286
AnnaBridge 189:f392fc9709a3 287 while (!serial_readable(obj)) { // Wait until Rx buffer is full
AnnaBridge 189:f392fc9709a3 288 // Do nothing
AnnaBridge 189:f392fc9709a3 289 }
AnnaBridge 189:f392fc9709a3 290
AnnaBridge 189:f392fc9709a3 291 if (obj->uart_config.Mode & UART_ENABLE_TX) {
AnnaBridge 189:f392fc9709a3 292 obj->UARTx->TRANS &= 0x0D;
AnnaBridge 189:f392fc9709a3 293 }
AnnaBridge 189:f392fc9709a3 294
AnnaBridge 189:f392fc9709a3 295 data = data | (obj->UARTx->DR & 0xFFU);
AnnaBridge 189:f392fc9709a3 296
AnnaBridge 189:f392fc9709a3 297 if (obj->uart_config.Mode & UART_ENABLE_TX) {
AnnaBridge 189:f392fc9709a3 298 obj->UARTx->TRANS |= UART_ENABLE_TX;
AnnaBridge 189:f392fc9709a3 299 }
AnnaBridge 189:f392fc9709a3 300 return data;
AnnaBridge 189:f392fc9709a3 301 }
AnnaBridge 189:f392fc9709a3 302
AnnaBridge 189:f392fc9709a3 303 void serial_putc(serial_t *obj, int c)
AnnaBridge 189:f392fc9709a3 304 {
AnnaBridge 189:f392fc9709a3 305
AnnaBridge 189:f392fc9709a3 306 while (!serial_writable(obj)) {
AnnaBridge 189:f392fc9709a3 307 // Do nothing
AnnaBridge 189:f392fc9709a3 308 }
AnnaBridge 189:f392fc9709a3 309
AnnaBridge 189:f392fc9709a3 310 if (obj->uart_config.Mode & UART_ENABLE_RX) {
AnnaBridge 189:f392fc9709a3 311 obj->UARTx->TRANS &= 0x0E;
AnnaBridge 189:f392fc9709a3 312 }
AnnaBridge 189:f392fc9709a3 313
AnnaBridge 189:f392fc9709a3 314 obj->UARTx->DR = c & 0xFFU;
AnnaBridge 189:f392fc9709a3 315
AnnaBridge 189:f392fc9709a3 316 if (obj->uart_config.Mode & UART_ENABLE_RX) {
AnnaBridge 189:f392fc9709a3 317 obj->UARTx->TRANS |= UART_ENABLE_RX;
AnnaBridge 189:f392fc9709a3 318 }
AnnaBridge 189:f392fc9709a3 319 }
AnnaBridge 189:f392fc9709a3 320
AnnaBridge 189:f392fc9709a3 321 int serial_readable(serial_t *obj)
AnnaBridge 189:f392fc9709a3 322 {
AnnaBridge 189:f392fc9709a3 323 int ret = 0;
AnnaBridge 189:f392fc9709a3 324
AnnaBridge 189:f392fc9709a3 325 if ((obj->UARTx->SR & 0x0000000F) != 0) {
AnnaBridge 189:f392fc9709a3 326 ret = 1;
AnnaBridge 189:f392fc9709a3 327 }
AnnaBridge 189:f392fc9709a3 328 return ret;
AnnaBridge 189:f392fc9709a3 329 }
AnnaBridge 189:f392fc9709a3 330
AnnaBridge 189:f392fc9709a3 331 int serial_writable(serial_t *obj)
AnnaBridge 189:f392fc9709a3 332 {
AnnaBridge 189:f392fc9709a3 333 int ret = 0;
AnnaBridge 189:f392fc9709a3 334
AnnaBridge 189:f392fc9709a3 335 if ((obj->UARTx->SR &0x8000) == 0) {
AnnaBridge 189:f392fc9709a3 336 ret = 1;
AnnaBridge 189:f392fc9709a3 337 }
AnnaBridge 189:f392fc9709a3 338
AnnaBridge 189:f392fc9709a3 339 return ret;
AnnaBridge 189:f392fc9709a3 340 }
AnnaBridge 189:f392fc9709a3 341
AnnaBridge 189:f392fc9709a3 342 void serial_clear(serial_t *obj)
AnnaBridge 189:f392fc9709a3 343 {
AnnaBridge 189:f392fc9709a3 344 obj->UARTx->FIFOCLR = 0x03;
AnnaBridge 189:f392fc9709a3 345 }
AnnaBridge 189:f392fc9709a3 346
AnnaBridge 189:f392fc9709a3 347 void serial_pinout_tx(PinName tx)
AnnaBridge 189:f392fc9709a3 348 {
AnnaBridge 189:f392fc9709a3 349 pinmap_pinout(tx, PinMap_UART_TX);
AnnaBridge 189:f392fc9709a3 350 }
AnnaBridge 189:f392fc9709a3 351
AnnaBridge 189:f392fc9709a3 352 void serial_break_set(serial_t *obj)
AnnaBridge 189:f392fc9709a3 353 {
AnnaBridge 189:f392fc9709a3 354 obj->UARTx->TRANS |= 0x08;
AnnaBridge 189:f392fc9709a3 355 }
AnnaBridge 189:f392fc9709a3 356
AnnaBridge 189:f392fc9709a3 357 void serial_break_clear(serial_t *obj)
AnnaBridge 189:f392fc9709a3 358 {
AnnaBridge 189:f392fc9709a3 359 obj->UARTx->TRANS &= ~(0x08);
AnnaBridge 189:f392fc9709a3 360 }
AnnaBridge 189:f392fc9709a3 361
AnnaBridge 189:f392fc9709a3 362 static void uart_swreset(TSB_UART_TypeDef * UARTx)
AnnaBridge 189:f392fc9709a3 363 {
AnnaBridge 189:f392fc9709a3 364 while (((UARTx->SWRST) & UARTxSWRST_SWRSTF_MASK) == UARTxSWRST_SWRSTF_RUN) {
AnnaBridge 189:f392fc9709a3 365 // No process
AnnaBridge 189:f392fc9709a3 366 }
AnnaBridge 189:f392fc9709a3 367
AnnaBridge 189:f392fc9709a3 368 UARTx->SWRST = UARTxSWRST_SWRST_10;
AnnaBridge 189:f392fc9709a3 369 UARTx->SWRST = UARTxSWRST_SWRST_01;
AnnaBridge 189:f392fc9709a3 370
AnnaBridge 189:f392fc9709a3 371 while (((UARTx->SWRST) & UARTxSWRST_SWRSTF_MASK) == UARTxSWRST_SWRSTF_RUN) {
AnnaBridge 189:f392fc9709a3 372 // No process
AnnaBridge 189:f392fc9709a3 373 }
AnnaBridge 189:f392fc9709a3 374 }
AnnaBridge 189:f392fc9709a3 375
AnnaBridge 189:f392fc9709a3 376 static void uart_get_boudrate_setting(uart_boudrate_t *brddiviser, uint32_t boudrate)
AnnaBridge 189:f392fc9709a3 377 {
AnnaBridge 189:f392fc9709a3 378 uint32_t clock = 0U;
AnnaBridge 189:f392fc9709a3 379 uint32_t k = 0U;
AnnaBridge 189:f392fc9709a3 380 uint64_t tx = 0U;
AnnaBridge 189:f392fc9709a3 381 uint64_t work = 1U;
AnnaBridge 189:f392fc9709a3 382 uint64_t p_range64 = 0U;
AnnaBridge 189:f392fc9709a3 383 uint64_t boud64 = 0;
AnnaBridge 189:f392fc9709a3 384 uint64_t tx64 = 0;
AnnaBridge 189:f392fc9709a3 385 uint64_t work64 = 1;
AnnaBridge 189:f392fc9709a3 386
AnnaBridge 189:f392fc9709a3 387 SystemCoreClockUpdate(); // Get the peripheral I/O clock frequency
AnnaBridge 189:f392fc9709a3 388 clock = SystemCoreClock;
AnnaBridge 189:f392fc9709a3 389 tx = (uint64_t)((uint64_t)clock << 6);
AnnaBridge 189:f392fc9709a3 390 tx /= work;
AnnaBridge 189:f392fc9709a3 391 tx64 = (uint64_t)((uint64_t)clock << 8);
AnnaBridge 189:f392fc9709a3 392 tx64 /= work64;
AnnaBridge 189:f392fc9709a3 393 work = ((uint64_t)boudrate);
AnnaBridge 189:f392fc9709a3 394 tx /= work;
AnnaBridge 189:f392fc9709a3 395 tx >>= 4;
AnnaBridge 189:f392fc9709a3 396
AnnaBridge 189:f392fc9709a3 397 boud64 = (64U * boudrate);
AnnaBridge 189:f392fc9709a3 398 p_range64 = ((boud64 / 100) * 3);
AnnaBridge 189:f392fc9709a3 399
AnnaBridge 189:f392fc9709a3 400 for (k=UART_RANGE_K_MIN; (k <= UART_RANGE_K_MAX); k++) {
AnnaBridge 189:f392fc9709a3 401 work = tx + k;
AnnaBridge 189:f392fc9709a3 402 if (work >= (uint64_t)((uint64_t)1 << 6)) {
AnnaBridge 189:f392fc9709a3 403 work -= (uint64_t)((uint64_t)1 << 6);
AnnaBridge 189:f392fc9709a3 404 work >>= 6;
AnnaBridge 189:f392fc9709a3 405 if ((UART_RANGE_N_MIN <= (uint32_t)work) && ((uint32_t)work <= UART_RANGE_N_MAX)) {
AnnaBridge 189:f392fc9709a3 406 work64 = work <<6;
AnnaBridge 189:f392fc9709a3 407 work64 = (uint64_t)(work64 + (64 - (uint64_t)k));
AnnaBridge 189:f392fc9709a3 408 work64 = (tx64 / work64);
AnnaBridge 189:f392fc9709a3 409 if (((boud64 - p_range64) <= work64) && (work64 <= (boud64 + p_range64))) {
AnnaBridge 189:f392fc9709a3 410 brddiviser->brn = work;
AnnaBridge 189:f392fc9709a3 411 brddiviser->brk = k;
AnnaBridge 189:f392fc9709a3 412 break;
AnnaBridge 189:f392fc9709a3 413 }
AnnaBridge 189:f392fc9709a3 414 }
AnnaBridge 189:f392fc9709a3 415 }
AnnaBridge 189:f392fc9709a3 416 }
AnnaBridge 189:f392fc9709a3 417 }
AnnaBridge 189:f392fc9709a3 418
AnnaBridge 189:f392fc9709a3 419 static void uart_init(TSB_UART_TypeDef * UARTx, uart_inittypedef_t * InitStruct)
AnnaBridge 189:f392fc9709a3 420 {
AnnaBridge 189:f392fc9709a3 421 uart_boudrate_t UTx_brd = {0};
AnnaBridge 189:f392fc9709a3 422 uint32_t brk;
AnnaBridge 189:f392fc9709a3 423 uint32_t tmp;
AnnaBridge 189:f392fc9709a3 424 uint32_t parity_check;
AnnaBridge 189:f392fc9709a3 425 uint32_t data_length;
AnnaBridge 189:f392fc9709a3 426
AnnaBridge 189:f392fc9709a3 427 UARTx->CLK = UART_PLESCALER_1; // Register Setting
AnnaBridge 189:f392fc9709a3 428 uart_get_boudrate_setting(&UTx_brd, InitStruct->BaudRate);
AnnaBridge 189:f392fc9709a3 429 UTx_brd.ken = UART_DIVISION_ENABLE;
AnnaBridge 189:f392fc9709a3 430 brk = (UTx_brd.brk << 16);
AnnaBridge 189:f392fc9709a3 431 UARTx->BRD = (UTx_brd.ken | brk | UTx_brd.brn);
AnnaBridge 189:f392fc9709a3 432 parity_check = (InitStruct->Parity == ParityOdd) ? 1 : ((InitStruct->Parity == ParityEven) ? 3 : 0);
AnnaBridge 189:f392fc9709a3 433 data_length = (InitStruct->DataBits) == 8 ? 1 : (((InitStruct->DataBits) == 7) ? 0 : 2);
AnnaBridge 189:f392fc9709a3 434 tmp = (((InitStruct->FlowCtrl) << 9) | ((InitStruct->StopBits) << 4) | (parity_check << 2) | data_length);
AnnaBridge 189:f392fc9709a3 435 UARTx->CR0 = tmp;
AnnaBridge 189:f392fc9709a3 436 UARTx->CR1 = (UART_RX_FIFO_FILL_LEVEL | UART_TX_INT_ENABLE | UART_RX_INT_ENABLE);
AnnaBridge 189:f392fc9709a3 437 UARTx->FIFOCLR = (UARTxFIFOCLR_TFCLR_CLEAR | UARTxFIFOCLR_RFCLR_CLEAR);
AnnaBridge 189:f392fc9709a3 438 UARTx->TRANS = InitStruct->Mode;
AnnaBridge 189:f392fc9709a3 439 }