mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Jul 08 14:45:08 2015 +0100
Revision:
585:a1ed5b41f74f
Synchronized with git revision 7a2b57896e0263b82f31ddc5a0ad2443615db184

Full URL: https://github.com/mbedmicro/mbed/commit/7a2b57896e0263b82f31ddc5a0ad2443615db184/

Add rtc_api.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 585:a1ed5b41f74f 1 /* mbed Microcontroller Library
mbed_official 585:a1ed5b41f74f 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 585:a1ed5b41f74f 3 *
mbed_official 585:a1ed5b41f74f 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 585:a1ed5b41f74f 5 * you may not use this file except in compliance with the License.
mbed_official 585:a1ed5b41f74f 6 * You may obtain a copy of the License at
mbed_official 585:a1ed5b41f74f 7 *
mbed_official 585:a1ed5b41f74f 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 585:a1ed5b41f74f 9 *
mbed_official 585:a1ed5b41f74f 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 585:a1ed5b41f74f 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 585:a1ed5b41f74f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 585:a1ed5b41f74f 13 * See the License for the specific language governing permissions and
mbed_official 585:a1ed5b41f74f 14 * limitations under the License.
mbed_official 585:a1ed5b41f74f 15 */
mbed_official 585:a1ed5b41f74f 16 #include "mbed_assert.h"
mbed_official 585:a1ed5b41f74f 17 #include "serial_api.h"
mbed_official 585:a1ed5b41f74f 18
mbed_official 585:a1ed5b41f74f 19 // math.h required for floating point operations for baud rate calculation
mbed_official 585:a1ed5b41f74f 20 #include <math.h>
mbed_official 585:a1ed5b41f74f 21
mbed_official 585:a1ed5b41f74f 22 #include <string.h>
mbed_official 585:a1ed5b41f74f 23
mbed_official 585:a1ed5b41f74f 24 #include "cmsis.h"
mbed_official 585:a1ed5b41f74f 25 #include "pinmap.h"
mbed_official 585:a1ed5b41f74f 26 #include "clk_freqs.h"
mbed_official 585:a1ed5b41f74f 27 #include "PeripheralPins.h"
mbed_official 585:a1ed5b41f74f 28
mbed_official 585:a1ed5b41f74f 29 //Devices either user UART0 or UARTLP
mbed_official 585:a1ed5b41f74f 30 #ifndef UARTLP_BASES
mbed_official 585:a1ed5b41f74f 31 #define UARTLP_C2_RE_MASK UART0_C2_RE_MASK
mbed_official 585:a1ed5b41f74f 32 #define UARTLP_C2_TE_MASK UART0_C2_TE_MASK
mbed_official 585:a1ed5b41f74f 33 #define UARTLP_BDH_SBNS_MASK UART0_BDH_SBNS_MASK
mbed_official 585:a1ed5b41f74f 34 #define UARTLP_BDH_SBNS_SHIFT UART0_BDH_SBNS_SHIFT
mbed_official 585:a1ed5b41f74f 35 #define UARTLP_S1_TDRE_MASK UART0_S1_TDRE_MASK
mbed_official 585:a1ed5b41f74f 36 #define UARTLP_S1_TC_MASK UART0_S1_TC_MASK
mbed_official 585:a1ed5b41f74f 37 #define UARTLP_S1_OR_MASK UART0_S1_OR_MASK
mbed_official 585:a1ed5b41f74f 38 #define UARTLP_C2_RIE_MASK UART0_C2_RIE_MASK
mbed_official 585:a1ed5b41f74f 39 #define UARTLP_C2_TIE_MASK UART0_C2_TIE_MASK
mbed_official 585:a1ed5b41f74f 40 #define UARTLP_C2_SBK_MASK UART0_C2_SBK_MASK
mbed_official 585:a1ed5b41f74f 41 #define UARTLP_S1_RDRF_MASK UART0_S1_RDRF_MASK
mbed_official 585:a1ed5b41f74f 42 #endif
mbed_official 585:a1ed5b41f74f 43
mbed_official 585:a1ed5b41f74f 44 #ifdef UART2
mbed_official 585:a1ed5b41f74f 45 #define UART_NUM 3
mbed_official 585:a1ed5b41f74f 46 #else
mbed_official 585:a1ed5b41f74f 47 #define UART_NUM 1
mbed_official 585:a1ed5b41f74f 48 #endif
mbed_official 585:a1ed5b41f74f 49
mbed_official 585:a1ed5b41f74f 50 /******************************************************************************
mbed_official 585:a1ed5b41f74f 51 * INITIALIZATION
mbed_official 585:a1ed5b41f74f 52 ******************************************************************************/
mbed_official 585:a1ed5b41f74f 53
mbed_official 585:a1ed5b41f74f 54 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 585:a1ed5b41f74f 55 static uart_irq_handler irq_handler;
mbed_official 585:a1ed5b41f74f 56
mbed_official 585:a1ed5b41f74f 57 int stdio_uart_inited = 0;
mbed_official 585:a1ed5b41f74f 58 serial_t stdio_uart;
mbed_official 585:a1ed5b41f74f 59
mbed_official 585:a1ed5b41f74f 60 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 585:a1ed5b41f74f 61 // determine the UART to use
mbed_official 585:a1ed5b41f74f 62 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 585:a1ed5b41f74f 63 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 585:a1ed5b41f74f 64 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 585:a1ed5b41f74f 65 MBED_ASSERT((int)uart != NC);
mbed_official 585:a1ed5b41f74f 66
mbed_official 585:a1ed5b41f74f 67 obj->uart = (UARTLP_Type *)uart;
mbed_official 585:a1ed5b41f74f 68 // enable clk
mbed_official 585:a1ed5b41f74f 69 switch (uart) {
mbed_official 585:a1ed5b41f74f 70 case UART_0: if (mcgpllfll_frequency() != 0) //PLL/FLL is selected
mbed_official 585:a1ed5b41f74f 71 SIM->SOPT2 |= (1<<SIM_SOPT2_UART0SRC_SHIFT);
mbed_official 585:a1ed5b41f74f 72 else
mbed_official 585:a1ed5b41f74f 73 SIM->SOPT2 |= (2<<SIM_SOPT2_UART0SRC_SHIFT);
mbed_official 585:a1ed5b41f74f 74 SIM->SCGC4 |= SIM_SCGC4_UART0_MASK; break;
mbed_official 585:a1ed5b41f74f 75 #if UART_NUM > 1
mbed_official 585:a1ed5b41f74f 76 case UART_1: SIM->SCGC4 |= SIM_SCGC4_UART1_MASK; break;
mbed_official 585:a1ed5b41f74f 77 case UART_2: SIM->SCGC4 |= SIM_SCGC4_UART2_MASK; break;
mbed_official 585:a1ed5b41f74f 78 #endif
mbed_official 585:a1ed5b41f74f 79 }
mbed_official 585:a1ed5b41f74f 80 // Disable UART before changing registers
mbed_official 585:a1ed5b41f74f 81 obj->uart->C2 &= ~(UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK);
mbed_official 585:a1ed5b41f74f 82
mbed_official 585:a1ed5b41f74f 83 // Enable UART transmitter to ensure TX activity is finished
mbed_official 585:a1ed5b41f74f 84 obj->uart->C2 |= UARTLP_C2_TE_MASK;
mbed_official 585:a1ed5b41f74f 85
mbed_official 585:a1ed5b41f74f 86 // Wait for TX activity to finish
mbed_official 585:a1ed5b41f74f 87 while(!(obj->uart->S1 & UARTLP_S1_TC_MASK));
mbed_official 585:a1ed5b41f74f 88
mbed_official 585:a1ed5b41f74f 89 // Disbale UARTs again
mbed_official 585:a1ed5b41f74f 90 obj->uart->C2 &= ~(UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK);
mbed_official 585:a1ed5b41f74f 91
mbed_official 585:a1ed5b41f74f 92
mbed_official 585:a1ed5b41f74f 93 switch (uart) {
mbed_official 585:a1ed5b41f74f 94 case UART_0: obj->index = 0; break;
mbed_official 585:a1ed5b41f74f 95 #if UART_NUM > 1
mbed_official 585:a1ed5b41f74f 96 case UART_1: obj->index = 1; break;
mbed_official 585:a1ed5b41f74f 97 case UART_2: obj->index = 2; break;
mbed_official 585:a1ed5b41f74f 98 #endif
mbed_official 585:a1ed5b41f74f 99 }
mbed_official 585:a1ed5b41f74f 100
mbed_official 585:a1ed5b41f74f 101 // set default baud rate and format
mbed_official 585:a1ed5b41f74f 102 serial_baud (obj, 9600);
mbed_official 585:a1ed5b41f74f 103 serial_format(obj, 8, ParityNone, 1);
mbed_official 585:a1ed5b41f74f 104
mbed_official 585:a1ed5b41f74f 105 // pinout the chosen uart
mbed_official 585:a1ed5b41f74f 106 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 585:a1ed5b41f74f 107 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 585:a1ed5b41f74f 108
mbed_official 585:a1ed5b41f74f 109 // set rx/tx pins in PullUp mode and enable TX/RX
mbed_official 585:a1ed5b41f74f 110 if (tx != NC) {
mbed_official 585:a1ed5b41f74f 111 obj->uart->C2 |= UARTLP_C2_TE_MASK;
mbed_official 585:a1ed5b41f74f 112 pin_mode(tx, PullUp);
mbed_official 585:a1ed5b41f74f 113 }
mbed_official 585:a1ed5b41f74f 114 if (rx != NC) {
mbed_official 585:a1ed5b41f74f 115 obj->uart->C2 |= UARTLP_C2_RE_MASK;
mbed_official 585:a1ed5b41f74f 116 pin_mode(rx, PullUp);
mbed_official 585:a1ed5b41f74f 117 }
mbed_official 585:a1ed5b41f74f 118
mbed_official 585:a1ed5b41f74f 119 if (uart == STDIO_UART) {
mbed_official 585:a1ed5b41f74f 120 stdio_uart_inited = 1;
mbed_official 585:a1ed5b41f74f 121 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 585:a1ed5b41f74f 122 }
mbed_official 585:a1ed5b41f74f 123 }
mbed_official 585:a1ed5b41f74f 124
mbed_official 585:a1ed5b41f74f 125 void serial_free(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 126 serial_irq_ids[obj->index] = 0;
mbed_official 585:a1ed5b41f74f 127 }
mbed_official 585:a1ed5b41f74f 128
mbed_official 585:a1ed5b41f74f 129 // serial_baud
mbed_official 585:a1ed5b41f74f 130 //
mbed_official 585:a1ed5b41f74f 131 // set the baud rate, taking in to account the current SystemFrequency
mbed_official 585:a1ed5b41f74f 132 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 585:a1ed5b41f74f 133
mbed_official 585:a1ed5b41f74f 134 // save C2 state
mbed_official 585:a1ed5b41f74f 135 uint8_t c2_state = (obj->uart->C2 & (UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK));
mbed_official 585:a1ed5b41f74f 136
mbed_official 585:a1ed5b41f74f 137 // Disable UART before changing registers
mbed_official 585:a1ed5b41f74f 138 obj->uart->C2 &= ~(UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK);
mbed_official 585:a1ed5b41f74f 139
mbed_official 585:a1ed5b41f74f 140 uint32_t PCLK;
mbed_official 585:a1ed5b41f74f 141 if (obj->uart == UART0) {
mbed_official 585:a1ed5b41f74f 142 if (mcgpllfll_frequency() != 0)
mbed_official 585:a1ed5b41f74f 143 PCLK = mcgpllfll_frequency();
mbed_official 585:a1ed5b41f74f 144 else
mbed_official 585:a1ed5b41f74f 145 PCLK = extosc_frequency();
mbed_official 585:a1ed5b41f74f 146 } else
mbed_official 585:a1ed5b41f74f 147 PCLK = bus_frequency();
mbed_official 585:a1ed5b41f74f 148
mbed_official 585:a1ed5b41f74f 149 // First we check to see if the basic divide with no DivAddVal/MulVal
mbed_official 585:a1ed5b41f74f 150 // ratio gives us an integer result. If it does, we set DivAddVal = 0,
mbed_official 585:a1ed5b41f74f 151 // MulVal = 1. Otherwise, we search the valid ratio value range to find
mbed_official 585:a1ed5b41f74f 152 // the closest match. This could be more elegant, using search methods
mbed_official 585:a1ed5b41f74f 153 // and/or lookup tables, but the brute force method is not that much
mbed_official 585:a1ed5b41f74f 154 // slower, and is more maintainable.
mbed_official 585:a1ed5b41f74f 155 uint16_t DL = PCLK / (16 * baudrate);
mbed_official 585:a1ed5b41f74f 156
mbed_official 585:a1ed5b41f74f 157 // set BDH and BDL
mbed_official 585:a1ed5b41f74f 158 obj->uart->BDH = (obj->uart->BDH & ~(0x1f)) | ((DL >> 8) & 0x1f);
mbed_official 585:a1ed5b41f74f 159 obj->uart->BDL = (obj->uart->BDL & ~(0xff)) | ((DL >> 0) & 0xff);
mbed_official 585:a1ed5b41f74f 160
mbed_official 585:a1ed5b41f74f 161 // restore C2 state
mbed_official 585:a1ed5b41f74f 162 obj->uart->C2 |= c2_state;
mbed_official 585:a1ed5b41f74f 163 }
mbed_official 585:a1ed5b41f74f 164
mbed_official 585:a1ed5b41f74f 165 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 585:a1ed5b41f74f 166 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
mbed_official 585:a1ed5b41f74f 167 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
mbed_official 585:a1ed5b41f74f 168 MBED_ASSERT(data_bits == 8); // TODO: Support other number of data bits (also in the write method!)
mbed_official 585:a1ed5b41f74f 169
mbed_official 585:a1ed5b41f74f 170 // save C2 state
mbed_official 585:a1ed5b41f74f 171 uint8_t c2_state = (obj->uart->C2 & (UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK));
mbed_official 585:a1ed5b41f74f 172
mbed_official 585:a1ed5b41f74f 173 // Disable UART before changing registers
mbed_official 585:a1ed5b41f74f 174 obj->uart->C2 &= ~(UARTLP_C2_RE_MASK | UARTLP_C2_TE_MASK);
mbed_official 585:a1ed5b41f74f 175
mbed_official 585:a1ed5b41f74f 176
mbed_official 585:a1ed5b41f74f 177 uint8_t parity_enable, parity_select;
mbed_official 585:a1ed5b41f74f 178 switch (parity) {
mbed_official 585:a1ed5b41f74f 179 case ParityNone: parity_enable = 0; parity_select = 0; break;
mbed_official 585:a1ed5b41f74f 180 case ParityOdd : parity_enable = 1; parity_select = 1; data_bits++; break;
mbed_official 585:a1ed5b41f74f 181 case ParityEven: parity_enable = 1; parity_select = 0; data_bits++; break;
mbed_official 585:a1ed5b41f74f 182 default:
mbed_official 585:a1ed5b41f74f 183 break;
mbed_official 585:a1ed5b41f74f 184 }
mbed_official 585:a1ed5b41f74f 185
mbed_official 585:a1ed5b41f74f 186 stop_bits -= 1;
mbed_official 585:a1ed5b41f74f 187
mbed_official 585:a1ed5b41f74f 188 // data bits, parity and parity mode
mbed_official 585:a1ed5b41f74f 189 obj->uart->C1 = ((parity_enable << 1)
mbed_official 585:a1ed5b41f74f 190 | (parity_select << 0));
mbed_official 585:a1ed5b41f74f 191
mbed_official 585:a1ed5b41f74f 192 // stop bits
mbed_official 585:a1ed5b41f74f 193 obj->uart->BDH &= ~UARTLP_BDH_SBNS_MASK;
mbed_official 585:a1ed5b41f74f 194 obj->uart->BDH |= (stop_bits << UARTLP_BDH_SBNS_SHIFT);
mbed_official 585:a1ed5b41f74f 195
mbed_official 585:a1ed5b41f74f 196 // restore C2 state
mbed_official 585:a1ed5b41f74f 197 obj->uart->C2 |= c2_state;
mbed_official 585:a1ed5b41f74f 198 }
mbed_official 585:a1ed5b41f74f 199
mbed_official 585:a1ed5b41f74f 200 /******************************************************************************
mbed_official 585:a1ed5b41f74f 201 * INTERRUPTS HANDLING
mbed_official 585:a1ed5b41f74f 202 ******************************************************************************/
mbed_official 585:a1ed5b41f74f 203 static inline void uart_irq(uint8_t status, uint32_t index) {
mbed_official 585:a1ed5b41f74f 204 if (serial_irq_ids[index] != 0) {
mbed_official 585:a1ed5b41f74f 205 if (status & UARTLP_S1_TDRE_MASK)
mbed_official 585:a1ed5b41f74f 206 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 585:a1ed5b41f74f 207
mbed_official 585:a1ed5b41f74f 208 if (status & UARTLP_S1_RDRF_MASK)
mbed_official 585:a1ed5b41f74f 209 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 585:a1ed5b41f74f 210 }
mbed_official 585:a1ed5b41f74f 211 }
mbed_official 585:a1ed5b41f74f 212
mbed_official 585:a1ed5b41f74f 213 void uart0_irq() {
mbed_official 585:a1ed5b41f74f 214 uart_irq(UART0->S1, 0);
mbed_official 585:a1ed5b41f74f 215 if (UART0->S1 & UARTLP_S1_OR_MASK)
mbed_official 585:a1ed5b41f74f 216 UART0->S1 |= UARTLP_S1_OR_MASK;
mbed_official 585:a1ed5b41f74f 217 }
mbed_official 585:a1ed5b41f74f 218 #if UART_NUM > 1
mbed_official 585:a1ed5b41f74f 219 void uart1_irq() {uart_irq(UART1->S1, 1);}
mbed_official 585:a1ed5b41f74f 220 void uart2_irq() {uart_irq(UART2->S1, 2);}
mbed_official 585:a1ed5b41f74f 221 #endif
mbed_official 585:a1ed5b41f74f 222
mbed_official 585:a1ed5b41f74f 223 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 585:a1ed5b41f74f 224 irq_handler = handler;
mbed_official 585:a1ed5b41f74f 225 serial_irq_ids[obj->index] = id;
mbed_official 585:a1ed5b41f74f 226 }
mbed_official 585:a1ed5b41f74f 227
mbed_official 585:a1ed5b41f74f 228 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 585:a1ed5b41f74f 229 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 585:a1ed5b41f74f 230 uint32_t vector = 0;
mbed_official 585:a1ed5b41f74f 231 switch ((int)obj->uart) {
mbed_official 585:a1ed5b41f74f 232 case UART_0: irq_n=UART0_IRQn; vector = (uint32_t)&uart0_irq; break;
mbed_official 585:a1ed5b41f74f 233 #if UART_NUM > 1
mbed_official 585:a1ed5b41f74f 234 case UART_1: irq_n=UART1_IRQn; vector = (uint32_t)&uart1_irq; break;
mbed_official 585:a1ed5b41f74f 235 case UART_2: irq_n=UART2_IRQn; vector = (uint32_t)&uart2_irq; break;
mbed_official 585:a1ed5b41f74f 236 #endif
mbed_official 585:a1ed5b41f74f 237 }
mbed_official 585:a1ed5b41f74f 238
mbed_official 585:a1ed5b41f74f 239 if (enable) {
mbed_official 585:a1ed5b41f74f 240 switch (irq) {
mbed_official 585:a1ed5b41f74f 241 case RxIrq: obj->uart->C2 |= (UARTLP_C2_RIE_MASK); break;
mbed_official 585:a1ed5b41f74f 242 case TxIrq: obj->uart->C2 |= (UARTLP_C2_TIE_MASK); break;
mbed_official 585:a1ed5b41f74f 243 }
mbed_official 585:a1ed5b41f74f 244 NVIC_SetVector(irq_n, vector);
mbed_official 585:a1ed5b41f74f 245 NVIC_EnableIRQ(irq_n);
mbed_official 585:a1ed5b41f74f 246
mbed_official 585:a1ed5b41f74f 247 } else { // disable
mbed_official 585:a1ed5b41f74f 248 int all_disabled = 0;
mbed_official 585:a1ed5b41f74f 249 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 585:a1ed5b41f74f 250 switch (irq) {
mbed_official 585:a1ed5b41f74f 251 case RxIrq: obj->uart->C2 &= ~(UARTLP_C2_RIE_MASK); break;
mbed_official 585:a1ed5b41f74f 252 case TxIrq: obj->uart->C2 &= ~(UARTLP_C2_TIE_MASK); break;
mbed_official 585:a1ed5b41f74f 253 }
mbed_official 585:a1ed5b41f74f 254 switch (other_irq) {
mbed_official 585:a1ed5b41f74f 255 case RxIrq: all_disabled = (obj->uart->C2 & (UARTLP_C2_RIE_MASK)) == 0; break;
mbed_official 585:a1ed5b41f74f 256 case TxIrq: all_disabled = (obj->uart->C2 & (UARTLP_C2_TIE_MASK)) == 0; break;
mbed_official 585:a1ed5b41f74f 257 }
mbed_official 585:a1ed5b41f74f 258 if (all_disabled)
mbed_official 585:a1ed5b41f74f 259 NVIC_DisableIRQ(irq_n);
mbed_official 585:a1ed5b41f74f 260 }
mbed_official 585:a1ed5b41f74f 261 }
mbed_official 585:a1ed5b41f74f 262
mbed_official 585:a1ed5b41f74f 263 /******************************************************************************
mbed_official 585:a1ed5b41f74f 264 * READ/WRITE
mbed_official 585:a1ed5b41f74f 265 ******************************************************************************/
mbed_official 585:a1ed5b41f74f 266 int serial_getc(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 267 while (!serial_readable(obj));
mbed_official 585:a1ed5b41f74f 268 return obj->uart->D;
mbed_official 585:a1ed5b41f74f 269 }
mbed_official 585:a1ed5b41f74f 270
mbed_official 585:a1ed5b41f74f 271 void serial_putc(serial_t *obj, int c) {
mbed_official 585:a1ed5b41f74f 272 while (!serial_writable(obj));
mbed_official 585:a1ed5b41f74f 273 obj->uart->D = c;
mbed_official 585:a1ed5b41f74f 274 }
mbed_official 585:a1ed5b41f74f 275
mbed_official 585:a1ed5b41f74f 276 int serial_readable(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 277 // check overrun
mbed_official 585:a1ed5b41f74f 278 if (obj->uart->S1 & UARTLP_S1_OR_MASK) {
mbed_official 585:a1ed5b41f74f 279 obj->uart->S1 |= UARTLP_S1_OR_MASK;
mbed_official 585:a1ed5b41f74f 280 }
mbed_official 585:a1ed5b41f74f 281 return (obj->uart->S1 & UARTLP_S1_RDRF_MASK);
mbed_official 585:a1ed5b41f74f 282 }
mbed_official 585:a1ed5b41f74f 283
mbed_official 585:a1ed5b41f74f 284 int serial_writable(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 285 // check overrun
mbed_official 585:a1ed5b41f74f 286 if (obj->uart->S1 & UARTLP_S1_OR_MASK) {
mbed_official 585:a1ed5b41f74f 287 obj->uart->S1 |= UARTLP_S1_OR_MASK;
mbed_official 585:a1ed5b41f74f 288 }
mbed_official 585:a1ed5b41f74f 289 return (obj->uart->S1 & UARTLP_S1_TDRE_MASK);
mbed_official 585:a1ed5b41f74f 290 }
mbed_official 585:a1ed5b41f74f 291
mbed_official 585:a1ed5b41f74f 292 void serial_clear(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 293 }
mbed_official 585:a1ed5b41f74f 294
mbed_official 585:a1ed5b41f74f 295 void serial_pinout_tx(PinName tx) {
mbed_official 585:a1ed5b41f74f 296 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 585:a1ed5b41f74f 297 }
mbed_official 585:a1ed5b41f74f 298
mbed_official 585:a1ed5b41f74f 299 void serial_break_set(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 300 obj->uart->C2 |= UARTLP_C2_SBK_MASK;
mbed_official 585:a1ed5b41f74f 301 }
mbed_official 585:a1ed5b41f74f 302
mbed_official 585:a1ed5b41f74f 303 void serial_break_clear(serial_t *obj) {
mbed_official 585:a1ed5b41f74f 304 obj->uart->C2 &= ~UARTLP_C2_SBK_MASK;
mbed_official 585:a1ed5b41f74f 305 }