mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_ARM_SSG/TARGET_BEETLE/serial_api.c@144:ef7eb2e8f9f7
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2015 ARM Limited
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 // math.h required for floating point operations for baud rate calculation
<> 144:ef7eb2e8f9f7 17 #include <math.h>
<> 144:ef7eb2e8f9f7 18 #include <stdio.h>
<> 144:ef7eb2e8f9f7 19 #include <string.h>
<> 144:ef7eb2e8f9f7 20 #include <stdlib.h>
<> 144:ef7eb2e8f9f7 21
<> 144:ef7eb2e8f9f7 22 #include "serial_api.h"
<> 144:ef7eb2e8f9f7 23 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 24 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 25 #include "PinNames.h"
<> 144:ef7eb2e8f9f7 26 #include "mbed_error.h"
<> 144:ef7eb2e8f9f7 27 #include "gpio_api.h"
<> 144:ef7eb2e8f9f7 28
<> 144:ef7eb2e8f9f7 29 /******************************************************************************
<> 144:ef7eb2e8f9f7 30 * INITIALIZATION
<> 144:ef7eb2e8f9f7 31 ******************************************************************************/
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 static const PinMap PinMap_UART_TX[] = {
<> 144:ef7eb2e8f9f7 34 {UART_TX0, UART_0, 0},
<> 144:ef7eb2e8f9f7 35 {UART_TX1, UART_1, 0},
<> 144:ef7eb2e8f9f7 36 {NC, NC, 0}
<> 144:ef7eb2e8f9f7 37 };
<> 144:ef7eb2e8f9f7 38
<> 144:ef7eb2e8f9f7 39 static const PinMap PinMap_UART_RX[] = {
<> 144:ef7eb2e8f9f7 40 {UART_RX0, UART_0, 0},
<> 144:ef7eb2e8f9f7 41 {UART_RX1, UART_1, 0},
<> 144:ef7eb2e8f9f7 42 {NC, NC, 0}
<> 144:ef7eb2e8f9f7 43 };
<> 144:ef7eb2e8f9f7 44
<> 144:ef7eb2e8f9f7 45 #define UART_NUM 2
<> 144:ef7eb2e8f9f7 46
<> 144:ef7eb2e8f9f7 47 static uart_irq_handler irq_handler;
<> 144:ef7eb2e8f9f7 48
<> 144:ef7eb2e8f9f7 49 int stdio_uart_inited = 0;
<> 144:ef7eb2e8f9f7 50 serial_t stdio_uart;
<> 144:ef7eb2e8f9f7 51
<> 144:ef7eb2e8f9f7 52 struct serial_global_data_s {
<> 144:ef7eb2e8f9f7 53 uint32_t serial_irq_id;
<> 144:ef7eb2e8f9f7 54 gpio_t sw_rts, sw_cts;
<> 144:ef7eb2e8f9f7 55 uint8_t count, rx_irq_set_flow, rx_irq_set_api;
<> 144:ef7eb2e8f9f7 56 };
<> 144:ef7eb2e8f9f7 57
<> 144:ef7eb2e8f9f7 58 static struct serial_global_data_s uart_data[UART_NUM];
<> 144:ef7eb2e8f9f7 59
<> 144:ef7eb2e8f9f7 60 void serial_init(serial_t *obj, PinName tx, PinName rx) {
<> 144:ef7eb2e8f9f7 61 int is_stdio_uart = 0;
<> 144:ef7eb2e8f9f7 62
<> 144:ef7eb2e8f9f7 63 // determine the UART to use
<> 144:ef7eb2e8f9f7 64 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 65 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 66 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
<> 144:ef7eb2e8f9f7 67 if ((int)uart == NC) {
<> 144:ef7eb2e8f9f7 68 error("Serial pinout mapping failed");
<> 144:ef7eb2e8f9f7 69 }
<> 144:ef7eb2e8f9f7 70
<> 144:ef7eb2e8f9f7 71 obj->uart = (CMSDK_UART_TypeDef *)uart;
<> 144:ef7eb2e8f9f7 72 //set baud rate and enable Uart in normarl mode (RX and TX enabled)
<> 144:ef7eb2e8f9f7 73 switch (uart) {
<> 144:ef7eb2e8f9f7 74 case UART_0:
<> 144:ef7eb2e8f9f7 75 {
<> 144:ef7eb2e8f9f7 76 CMSDK_UART0->CTRL = 0; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 77 if ((int)tx != NC) {
<> 144:ef7eb2e8f9f7 78 CMSDK_UART0->CTRL = 0x1; // TX enable
<> 144:ef7eb2e8f9f7 79 }
<> 144:ef7eb2e8f9f7 80 if ((int)rx != NC) {
<> 144:ef7eb2e8f9f7 81 CMSDK_UART0->CTRL |= 0x2; // RX enable
<> 144:ef7eb2e8f9f7 82 }
<> 144:ef7eb2e8f9f7 83 }
<> 144:ef7eb2e8f9f7 84 break;
<> 144:ef7eb2e8f9f7 85 case UART_1:
<> 144:ef7eb2e8f9f7 86 {
<> 144:ef7eb2e8f9f7 87 CMSDK_UART1->CTRL = 0; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 88 if((int)tx != NC) {
<> 144:ef7eb2e8f9f7 89 CMSDK_UART1->CTRL = 0x1; // TX enable
<> 144:ef7eb2e8f9f7 90 }
<> 144:ef7eb2e8f9f7 91 if((int)rx != NC) {
<> 144:ef7eb2e8f9f7 92 CMSDK_UART1->CTRL |= 0x2; // RX enable
<> 144:ef7eb2e8f9f7 93 }
<> 144:ef7eb2e8f9f7 94 }
<> 144:ef7eb2e8f9f7 95 break;
<> 144:ef7eb2e8f9f7 96 }
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 // set default baud rate and format
<> 144:ef7eb2e8f9f7 99 serial_baud(obj, 9600);
<> 144:ef7eb2e8f9f7 100
<> 144:ef7eb2e8f9f7 101 // pinout the chosen uart
<> 144:ef7eb2e8f9f7 102 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 103 pinmap_pinout(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 104
<> 144:ef7eb2e8f9f7 105 switch (uart) {
<> 144:ef7eb2e8f9f7 106 case UART_0:
<> 144:ef7eb2e8f9f7 107 obj->index = 0;
<> 144:ef7eb2e8f9f7 108 break;
<> 144:ef7eb2e8f9f7 109 case UART_1:
<> 144:ef7eb2e8f9f7 110 obj->index = 1;
<> 144:ef7eb2e8f9f7 111 break;
<> 144:ef7eb2e8f9f7 112 }
<> 144:ef7eb2e8f9f7 113 uart_data[obj->index].sw_rts.pin = NC;
<> 144:ef7eb2e8f9f7 114 uart_data[obj->index].sw_cts.pin = NC;
<> 144:ef7eb2e8f9f7 115 serial_set_flow_control(obj, FlowControlNone, NC, NC);
<> 144:ef7eb2e8f9f7 116
<> 144:ef7eb2e8f9f7 117 is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 if (is_stdio_uart) {
<> 144:ef7eb2e8f9f7 120 stdio_uart_inited = 1;
<> 144:ef7eb2e8f9f7 121 memcpy(&stdio_uart, obj, sizeof(serial_t));
<> 144:ef7eb2e8f9f7 122 }
<> 144:ef7eb2e8f9f7 123 }
<> 144:ef7eb2e8f9f7 124
<> 144:ef7eb2e8f9f7 125 void serial_free(serial_t *obj) {
<> 144:ef7eb2e8f9f7 126 uart_data[obj->index].serial_irq_id = 0;
<> 144:ef7eb2e8f9f7 127 }
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 // serial_baud
<> 144:ef7eb2e8f9f7 130 // set the baud rate, taking in to account the current SystemFrequency
<> 144:ef7eb2e8f9f7 131 void serial_baud(serial_t *obj, int baudrate) {
<> 144:ef7eb2e8f9f7 132 // BEETLE has a simple divider to control the baud rate. The formula is:
<> 144:ef7eb2e8f9f7 133 //
<> 144:ef7eb2e8f9f7 134 // Baudrate = PCLK / BAUDDIV
<> 144:ef7eb2e8f9f7 135 //
<> 144:ef7eb2e8f9f7 136 // PCLK = SystemCoreClock
<> 144:ef7eb2e8f9f7 137 // so for a desired baud rate of 9600
<> 144:ef7eb2e8f9f7 138 // SystemCoreClock / 9600
<> 144:ef7eb2e8f9f7 139 //
<> 144:ef7eb2e8f9f7 140 //check to see if minimum baud value entered
<> 144:ef7eb2e8f9f7 141 int baudrate_div = 0;
<> 144:ef7eb2e8f9f7 142 baudrate_div = SystemCoreClock / baudrate;
<> 144:ef7eb2e8f9f7 143 if (baudrate >= 16) {
<> 144:ef7eb2e8f9f7 144 switch ((int)obj->uart) {
<> 144:ef7eb2e8f9f7 145 case UART_0:
<> 144:ef7eb2e8f9f7 146 CMSDK_UART0->BAUDDIV = baudrate_div;
<> 144:ef7eb2e8f9f7 147 break;
<> 144:ef7eb2e8f9f7 148 case UART_1:
<> 144:ef7eb2e8f9f7 149 CMSDK_UART1->BAUDDIV = baudrate_div;
<> 144:ef7eb2e8f9f7 150 break;
<> 144:ef7eb2e8f9f7 151 default:
<> 144:ef7eb2e8f9f7 152 error("serial_baud");
<> 144:ef7eb2e8f9f7 153 break;
<> 144:ef7eb2e8f9f7 154 }
<> 144:ef7eb2e8f9f7 155 } else {
<> 144:ef7eb2e8f9f7 156 error("serial_baud");
<> 144:ef7eb2e8f9f7 157 }
<> 144:ef7eb2e8f9f7 158
<> 144:ef7eb2e8f9f7 159 }
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 void serial_format(serial_t *obj, int data_bits,
<> 144:ef7eb2e8f9f7 162 SerialParity parity, int stop_bits) {
<> 144:ef7eb2e8f9f7 163 }
<> 144:ef7eb2e8f9f7 164
<> 144:ef7eb2e8f9f7 165 /******************************************************************************
<> 144:ef7eb2e8f9f7 166 * INTERRUPTS HANDLING
<> 144:ef7eb2e8f9f7 167 ******************************************************************************/
<> 144:ef7eb2e8f9f7 168 static inline void uart_irq(uint32_t intstatus, uint32_t index,
<> 144:ef7eb2e8f9f7 169 CMSDK_UART_TypeDef *puart) {
<> 144:ef7eb2e8f9f7 170 SerialIrq irq_type;
<> 144:ef7eb2e8f9f7 171 switch (intstatus) {
<> 144:ef7eb2e8f9f7 172 case 1:
<> 144:ef7eb2e8f9f7 173 {
<> 144:ef7eb2e8f9f7 174 irq_type = TxIrq;
<> 144:ef7eb2e8f9f7 175 }
<> 144:ef7eb2e8f9f7 176 break;
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 case 2:
<> 144:ef7eb2e8f9f7 179 {
<> 144:ef7eb2e8f9f7 180 irq_type = RxIrq;
<> 144:ef7eb2e8f9f7 181 }
<> 144:ef7eb2e8f9f7 182 break;
<> 144:ef7eb2e8f9f7 183
<> 144:ef7eb2e8f9f7 184 default: return;
<> 144:ef7eb2e8f9f7 185 } /* End of Switch */
<> 144:ef7eb2e8f9f7 186
<> 144:ef7eb2e8f9f7 187 if ((irq_type == RxIrq) && (NC != uart_data[index].sw_rts.pin)) {
<> 144:ef7eb2e8f9f7 188 gpio_write(&uart_data[index].sw_rts, 1);
<> 144:ef7eb2e8f9f7 189 // Disable interrupt if it wasn't enabled by other part of the application
<> 144:ef7eb2e8f9f7 190 if (!uart_data[index].rx_irq_set_api) {
<> 144:ef7eb2e8f9f7 191 // puart->CTRL &= ~(1 << RxIrq);
<> 144:ef7eb2e8f9f7 192 /* Disable Rx interrupt */
<> 144:ef7eb2e8f9f7 193 puart->CTRL &= ~(CMSDK_UART_CTRL_RXIRQEN_Msk);
<> 144:ef7eb2e8f9f7 194 }
<> 144:ef7eb2e8f9f7 195 }
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 if (uart_data[index].serial_irq_id != 0) {
<> 144:ef7eb2e8f9f7 198 if ((irq_type != RxIrq) || (uart_data[index].rx_irq_set_api)) {
<> 144:ef7eb2e8f9f7 199 irq_handler(uart_data[index].serial_irq_id, irq_type);
<> 144:ef7eb2e8f9f7 200 }
<> 144:ef7eb2e8f9f7 201 }
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 if( irq_type == TxIrq ) {
<> 144:ef7eb2e8f9f7 204 /* Clear the TX interrupt Flag */
<> 144:ef7eb2e8f9f7 205 puart->INTCLEAR |= 0x01;
<> 144:ef7eb2e8f9f7 206 } else {
<> 144:ef7eb2e8f9f7 207 /* Clear the Rx interupt Flag */
<> 144:ef7eb2e8f9f7 208 puart->INTCLEAR |= 0x02;
<> 144:ef7eb2e8f9f7 209 }
<> 144:ef7eb2e8f9f7 210 }
<> 144:ef7eb2e8f9f7 211
<> 144:ef7eb2e8f9f7 212 void uart0_irq() {
<> 144:ef7eb2e8f9f7 213 uart_irq(CMSDK_UART0->INTSTATUS & 0x3, 0,
<> 144:ef7eb2e8f9f7 214 (CMSDK_UART_TypeDef*)CMSDK_UART0);
<> 144:ef7eb2e8f9f7 215 }
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217 void uart1_irq() {
<> 144:ef7eb2e8f9f7 218 uart_irq(CMSDK_UART1->INTSTATUS & 0x3, 1,
<> 144:ef7eb2e8f9f7 219 (CMSDK_UART_TypeDef*)CMSDK_UART1);
<> 144:ef7eb2e8f9f7 220 }
<> 144:ef7eb2e8f9f7 221
<> 144:ef7eb2e8f9f7 222 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
<> 144:ef7eb2e8f9f7 223 irq_handler = handler;
<> 144:ef7eb2e8f9f7 224 uart_data[obj->index].serial_irq_id = id;
<> 144:ef7eb2e8f9f7 225 }
<> 144:ef7eb2e8f9f7 226
<> 144:ef7eb2e8f9f7 227 static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
<> 144:ef7eb2e8f9f7 228 /* Declare a variable of type IRQn, initialise to 0 */
<> 144:ef7eb2e8f9f7 229 IRQn_Type irq_n = (IRQn_Type)0;
<> 144:ef7eb2e8f9f7 230 uint32_t vector = 0;
<> 144:ef7eb2e8f9f7 231 switch ((int)obj->uart) {
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 /*********************************************************************
<> 144:ef7eb2e8f9f7 234 * BEETLE SOC BOARD *
<> 144:ef7eb2e8f9f7 235 *********************************************************************/
<> 144:ef7eb2e8f9f7 236 case UART_0:
<> 144:ef7eb2e8f9f7 237 {
<> 144:ef7eb2e8f9f7 238 irq_n = UART0_IRQn;
<> 144:ef7eb2e8f9f7 239 vector = (uint32_t)&uart0_irq;
<> 144:ef7eb2e8f9f7 240 }
<> 144:ef7eb2e8f9f7 241 break;
<> 144:ef7eb2e8f9f7 242 case UART_1:
<> 144:ef7eb2e8f9f7 243 {
<> 144:ef7eb2e8f9f7 244 irq_n = UART1_IRQn;
<> 144:ef7eb2e8f9f7 245 vector = (uint32_t)&uart1_irq;
<> 144:ef7eb2e8f9f7 246 }
<> 144:ef7eb2e8f9f7 247 break;
<> 144:ef7eb2e8f9f7 248 }
<> 144:ef7eb2e8f9f7 249
<> 144:ef7eb2e8f9f7 250 if (enable) {
<> 144:ef7eb2e8f9f7 251 if(irq == TxIrq) {
<> 144:ef7eb2e8f9f7 252 /* Transmit IRQ, set appripriate enable */
<> 144:ef7eb2e8f9f7 253
<> 144:ef7eb2e8f9f7 254 /* set TX interrupt enable in CTRL REG */
<> 144:ef7eb2e8f9f7 255 obj->uart->CTRL |= CMSDK_UART_CTRL_TXIRQEN_Msk;
<> 144:ef7eb2e8f9f7 256 } else {
<> 144:ef7eb2e8f9f7 257 /* set Rx interrupt on in CTRL REG */
<> 144:ef7eb2e8f9f7 258 obj->uart->CTRL |= CMSDK_UART_CTRL_RXIRQEN_Msk;
<> 144:ef7eb2e8f9f7 259 }
<> 144:ef7eb2e8f9f7 260 NVIC_SetVector(irq_n, vector);
<> 144:ef7eb2e8f9f7 261 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 } else if ((irq == TxIrq) || (uart_data[obj->index].rx_irq_set_api
<> 144:ef7eb2e8f9f7 264 + uart_data[obj->index].rx_irq_set_flow == 0)) {
<> 144:ef7eb2e8f9f7 265 /* Disable IRQ */
<> 144:ef7eb2e8f9f7 266 int all_disabled = 0;
<> 144:ef7eb2e8f9f7 267 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 obj->uart->CTRL &= ~(1 << (irq + 2));
<> 144:ef7eb2e8f9f7 270
<> 144:ef7eb2e8f9f7 271 all_disabled = (obj->uart->CTRL & (1 << (other_irq + 2))) == 0;
<> 144:ef7eb2e8f9f7 272
<> 144:ef7eb2e8f9f7 273 if (all_disabled) {
<> 144:ef7eb2e8f9f7 274 NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 275 }
<> 144:ef7eb2e8f9f7 276 }
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278
<> 144:ef7eb2e8f9f7 279 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
<> 144:ef7eb2e8f9f7 280 if (RxIrq == irq)
<> 144:ef7eb2e8f9f7 281 uart_data[obj->index].rx_irq_set_api = enable;
<> 144:ef7eb2e8f9f7 282 serial_irq_set_internal(obj, irq, enable);
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 /******************************************************************************
<> 144:ef7eb2e8f9f7 286 * READ/WRITE
<> 144:ef7eb2e8f9f7 287 ******************************************************************************/
<> 144:ef7eb2e8f9f7 288 int serial_getc(serial_t *obj) {
<> 144:ef7eb2e8f9f7 289 while (serial_readable(obj) == 0);
<> 144:ef7eb2e8f9f7 290 int data = obj->uart->DATA;
<> 144:ef7eb2e8f9f7 291 return data;
<> 144:ef7eb2e8f9f7 292 }
<> 144:ef7eb2e8f9f7 293
<> 144:ef7eb2e8f9f7 294 void serial_putc(serial_t *obj, int c) {
<> 144:ef7eb2e8f9f7 295 #ifdef SERIAL_TEST
<> 144:ef7eb2e8f9f7 296 // Add CR to LF
<> 144:ef7eb2e8f9f7 297 if (c == 0x0A) {
<> 144:ef7eb2e8f9f7 298 while (serial_writable(obj));
<> 144:ef7eb2e8f9f7 299 obj->uart->DATA = 0x0D;
<> 144:ef7eb2e8f9f7 300 }
<> 144:ef7eb2e8f9f7 301 #endif
<> 144:ef7eb2e8f9f7 302
<> 144:ef7eb2e8f9f7 303 while (serial_writable(obj));
<> 144:ef7eb2e8f9f7 304 obj->uart->DATA = c;
<> 144:ef7eb2e8f9f7 305 }
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 int serial_readable(serial_t *obj) {
<> 144:ef7eb2e8f9f7 308 return obj->uart->STATE & 2;
<> 144:ef7eb2e8f9f7 309 }
<> 144:ef7eb2e8f9f7 310
<> 144:ef7eb2e8f9f7 311 int serial_writable(serial_t *obj) {
<> 144:ef7eb2e8f9f7 312 return obj->uart->STATE & 1;
<> 144:ef7eb2e8f9f7 313 }
<> 144:ef7eb2e8f9f7 314
<> 144:ef7eb2e8f9f7 315 void serial_clear(serial_t *obj) {
<> 144:ef7eb2e8f9f7 316 obj->uart->DATA = 0x00;
<> 144:ef7eb2e8f9f7 317 }
<> 144:ef7eb2e8f9f7 318
<> 144:ef7eb2e8f9f7 319 void serial_pinout_tx(PinName tx) {
<> 144:ef7eb2e8f9f7 320 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 321 }
<> 144:ef7eb2e8f9f7 322
<> 144:ef7eb2e8f9f7 323 void serial_break_set(serial_t *obj) {
<> 144:ef7eb2e8f9f7 324 }
<> 144:ef7eb2e8f9f7 325
<> 144:ef7eb2e8f9f7 326 void serial_break_clear(serial_t *obj) {
<> 144:ef7eb2e8f9f7 327 }
<> 144:ef7eb2e8f9f7 328 void serial_set_flow_control(serial_t *obj, FlowControl type,
<> 144:ef7eb2e8f9f7 329 PinName rxflow, PinName txflow) {
<> 144:ef7eb2e8f9f7 330 }