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:
Mon Jul 06 09:15:09 2015 +0100
Revision:
583:967d0d8b7aed
Parent:
507:d4fc7603a669
Synchronized with git revision 0a7df4e114501712e80882fb66c8a1e1ffca2dcb

Full URL: https://github.com/mbedmicro/mbed/commit/0a7df4e114501712e80882fb66c8a1e1ffca2dcb/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 507:d4fc7603a669 1 /*******************************************************************************
mbed_official 507:d4fc7603a669 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
mbed_official 507:d4fc7603a669 3 *
mbed_official 507:d4fc7603a669 4 * Permission is hereby granted, free of charge, to any person obtaining a
mbed_official 507:d4fc7603a669 5 * copy of this software and associated documentation files (the "Software"),
mbed_official 507:d4fc7603a669 6 * to deal in the Software without restriction, including without limitation
mbed_official 507:d4fc7603a669 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
mbed_official 507:d4fc7603a669 8 * and/or sell copies of the Software, and to permit persons to whom the
mbed_official 507:d4fc7603a669 9 * Software is furnished to do so, subject to the following conditions:
mbed_official 507:d4fc7603a669 10 *
mbed_official 507:d4fc7603a669 11 * The above copyright notice and this permission notice shall be included
mbed_official 507:d4fc7603a669 12 * in all copies or substantial portions of the Software.
mbed_official 507:d4fc7603a669 13 *
mbed_official 507:d4fc7603a669 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
mbed_official 507:d4fc7603a669 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
mbed_official 507:d4fc7603a669 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
mbed_official 507:d4fc7603a669 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
mbed_official 507:d4fc7603a669 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
mbed_official 507:d4fc7603a669 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
mbed_official 507:d4fc7603a669 20 * OTHER DEALINGS IN THE SOFTWARE.
mbed_official 507:d4fc7603a669 21 *
mbed_official 507:d4fc7603a669 22 * Except as contained in this notice, the name of Maxim Integrated
mbed_official 507:d4fc7603a669 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
mbed_official 507:d4fc7603a669 24 * Products, Inc. Branding Policy.
mbed_official 507:d4fc7603a669 25 *
mbed_official 507:d4fc7603a669 26 * The mere transfer of this software does not imply any licenses
mbed_official 507:d4fc7603a669 27 * of trade secrets, proprietary technology, copyrights, patents,
mbed_official 507:d4fc7603a669 28 * trademarks, maskwork rights, or any other form of intellectual
mbed_official 507:d4fc7603a669 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
mbed_official 507:d4fc7603a669 30 * ownership rights.
mbed_official 507:d4fc7603a669 31 *******************************************************************************
mbed_official 507:d4fc7603a669 32 */
mbed_official 507:d4fc7603a669 33
mbed_official 507:d4fc7603a669 34 #include <string.h>
mbed_official 507:d4fc7603a669 35 #include "mbed_assert.h"
mbed_official 507:d4fc7603a669 36 #include "cmsis.h"
mbed_official 507:d4fc7603a669 37 #include "serial_api.h"
mbed_official 507:d4fc7603a669 38 #include "uart_regs.h"
mbed_official 507:d4fc7603a669 39 #include "PeripheralPins.h"
mbed_official 507:d4fc7603a669 40
mbed_official 507:d4fc7603a669 41 #define UART_NUM 2
mbed_official 507:d4fc7603a669 42 #define DEFAULT_BAUD 9600
mbed_official 507:d4fc7603a669 43 #define DEFAULT_STOP 1
mbed_official 507:d4fc7603a669 44 #define DEFAULT_PARITY ParityNone
mbed_official 507:d4fc7603a669 45
mbed_official 507:d4fc7603a669 46 #define UART_ERRORS (MXC_F_UART_INTFL_RX_FRAME_ERROR | \
mbed_official 507:d4fc7603a669 47 MXC_F_UART_INTFL_RX_PARITY_ERROR | \
mbed_official 507:d4fc7603a669 48 MXC_F_UART_INTFL_RX_OVERRUN)
mbed_official 507:d4fc7603a669 49
mbed_official 507:d4fc7603a669 50 // Variables for managing the stdio UART
mbed_official 507:d4fc7603a669 51 int stdio_uart_inited;
mbed_official 507:d4fc7603a669 52 serial_t stdio_uart;
mbed_official 507:d4fc7603a669 53
mbed_official 507:d4fc7603a669 54 // Variables for interrupt driven
mbed_official 507:d4fc7603a669 55 static uart_irq_handler irq_handler;
mbed_official 507:d4fc7603a669 56 static uint32_t serial_irq_ids[UART_NUM];
mbed_official 507:d4fc7603a669 57
mbed_official 507:d4fc7603a669 58 //******************************************************************************
mbed_official 507:d4fc7603a669 59 void serial_init(serial_t *obj, PinName tx, PinName rx)
mbed_official 507:d4fc7603a669 60 {
mbed_official 507:d4fc7603a669 61 // Determine which uart is associated with each pin
mbed_official 507:d4fc7603a669 62 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 507:d4fc7603a669 63 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 507:d4fc7603a669 64 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 507:d4fc7603a669 65
mbed_official 507:d4fc7603a669 66 // Make sure that both pins are pointing to the same uart
mbed_official 507:d4fc7603a669 67 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 507:d4fc7603a669 68
mbed_official 507:d4fc7603a669 69 // Set the obj pointer to the proper uart
mbed_official 507:d4fc7603a669 70 obj->uart = (mxc_uart_regs_t*)uart;
mbed_official 507:d4fc7603a669 71
mbed_official 507:d4fc7603a669 72 // Set the uart index
mbed_official 507:d4fc7603a669 73 obj->index = MXC_UART_BASE_TO_INSTANCE(obj->uart);
mbed_official 507:d4fc7603a669 74
mbed_official 507:d4fc7603a669 75 // Configure the pins
mbed_official 507:d4fc7603a669 76 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 507:d4fc7603a669 77 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 507:d4fc7603a669 78
mbed_official 507:d4fc7603a669 79 // Flush the RX and TX FIFOs, clear the settings
mbed_official 507:d4fc7603a669 80 obj->uart->ctrl = ( MXC_F_UART_CTRL_TX_FIFO_FLUSH | MXC_F_UART_CTRL_RX_FIFO_FLUSH);
mbed_official 507:d4fc7603a669 81
mbed_official 507:d4fc7603a669 82 // Disable interrupts
mbed_official 507:d4fc7603a669 83 obj->uart->inten = 0;
mbed_official 507:d4fc7603a669 84 obj->uart->intfl = 0;
mbed_official 507:d4fc7603a669 85
mbed_official 507:d4fc7603a669 86 // Configure to default settings
mbed_official 507:d4fc7603a669 87 serial_baud(obj, DEFAULT_BAUD);
mbed_official 507:d4fc7603a669 88 serial_format(obj, 8, ParityNone, 1);
mbed_official 507:d4fc7603a669 89
mbed_official 507:d4fc7603a669 90 // Manage stdio UART
mbed_official 507:d4fc7603a669 91 if(uart == STDIO_UART) {
mbed_official 507:d4fc7603a669 92 stdio_uart_inited = 1;
mbed_official 507:d4fc7603a669 93 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 507:d4fc7603a669 94 }
mbed_official 507:d4fc7603a669 95 }
mbed_official 507:d4fc7603a669 96
mbed_official 507:d4fc7603a669 97 //******************************************************************************
mbed_official 507:d4fc7603a669 98 void serial_baud(serial_t *obj, int baudrate)
mbed_official 507:d4fc7603a669 99 {
mbed_official 507:d4fc7603a669 100 uint32_t idiv = 0, ddiv = 0, div = 0;
mbed_official 507:d4fc7603a669 101
mbed_official 507:d4fc7603a669 102 // Calculate the integer and decimal portions
mbed_official 507:d4fc7603a669 103 div = SystemCoreClock / ((baudrate / 100) * 128);
mbed_official 507:d4fc7603a669 104 idiv = (div / 100);
mbed_official 507:d4fc7603a669 105 ddiv = (div - idiv * 100) * 128 / 100;
mbed_official 507:d4fc7603a669 106
mbed_official 507:d4fc7603a669 107 obj->uart->baud_int = idiv;
mbed_official 507:d4fc7603a669 108 obj->uart->baud_div_128 = ddiv;
mbed_official 507:d4fc7603a669 109
mbed_official 507:d4fc7603a669 110 // Enable the baud clock
mbed_official 507:d4fc7603a669 111 obj->uart->ctrl |= MXC_F_UART_CTRL_BAUD_CLK_EN;
mbed_official 507:d4fc7603a669 112 }
mbed_official 507:d4fc7603a669 113
mbed_official 507:d4fc7603a669 114 //******************************************************************************
mbed_official 507:d4fc7603a669 115 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 507:d4fc7603a669 116 {
mbed_official 507:d4fc7603a669 117
mbed_official 507:d4fc7603a669 118 // Check the validity of the inputs
mbed_official 507:d4fc7603a669 119 MBED_ASSERT((data_bits > 4) && (data_bits < 9));
mbed_official 507:d4fc7603a669 120 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) ||
mbed_official 507:d4fc7603a669 121 (parity == ParityEven) || (parity == ParityForced1) ||
mbed_official 507:d4fc7603a669 122 (parity == ParityForced0));
mbed_official 507:d4fc7603a669 123 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
mbed_official 507:d4fc7603a669 124
mbed_official 507:d4fc7603a669 125 // Adjust the stop and data bits
mbed_official 507:d4fc7603a669 126 stop_bits -= 1;
mbed_official 507:d4fc7603a669 127 data_bits -= 5;
mbed_official 507:d4fc7603a669 128
mbed_official 507:d4fc7603a669 129 // Adjust the parity setting
mbed_official 507:d4fc7603a669 130 int paren = 0, mode = 0;
mbed_official 507:d4fc7603a669 131 switch (parity) {
mbed_official 507:d4fc7603a669 132 case ParityNone:
mbed_official 507:d4fc7603a669 133 paren = 0;
mbed_official 507:d4fc7603a669 134 mode = 0;
mbed_official 507:d4fc7603a669 135 break;
mbed_official 507:d4fc7603a669 136 case ParityOdd :
mbed_official 507:d4fc7603a669 137 paren = 1;
mbed_official 507:d4fc7603a669 138 mode = 0;
mbed_official 507:d4fc7603a669 139 break;
mbed_official 507:d4fc7603a669 140 case ParityEven:
mbed_official 507:d4fc7603a669 141 paren = 1;
mbed_official 507:d4fc7603a669 142 mode = 1;
mbed_official 507:d4fc7603a669 143 break;
mbed_official 507:d4fc7603a669 144 case ParityForced1:
mbed_official 507:d4fc7603a669 145 // Hardware does not support forced parity
mbed_official 507:d4fc7603a669 146 MBED_ASSERT(0);
mbed_official 507:d4fc7603a669 147 break;
mbed_official 507:d4fc7603a669 148 case ParityForced0:
mbed_official 507:d4fc7603a669 149 // Hardware does not support forced parity
mbed_official 507:d4fc7603a669 150 MBED_ASSERT(0);
mbed_official 507:d4fc7603a669 151 break;
mbed_official 507:d4fc7603a669 152 default:
mbed_official 507:d4fc7603a669 153 paren = 1;
mbed_official 507:d4fc7603a669 154 mode = 0;
mbed_official 507:d4fc7603a669 155 break;
mbed_official 507:d4fc7603a669 156 }
mbed_official 507:d4fc7603a669 157
mbed_official 507:d4fc7603a669 158 obj->uart->ctrl |= ((data_bits << MXC_F_UART_CTRL_CHAR_LENGTH_POS) |
mbed_official 507:d4fc7603a669 159 (stop_bits << MXC_F_UART_CTRL_STOP_BIT_MODE_POS) |
mbed_official 507:d4fc7603a669 160 (paren << MXC_F_UART_CTRL_PARITY_ENABLE_POS) |
mbed_official 507:d4fc7603a669 161 (mode << MXC_F_UART_CTRL_PARITY_MODE_POS));
mbed_official 507:d4fc7603a669 162 }
mbed_official 507:d4fc7603a669 163
mbed_official 507:d4fc7603a669 164 //******************************************************************************
mbed_official 507:d4fc7603a669 165 void uart_handler(mxc_uart_regs_t* uart, int id)
mbed_official 507:d4fc7603a669 166 {
mbed_official 507:d4fc7603a669 167 // Check for errors or RX Threshold
mbed_official 507:d4fc7603a669 168 if(uart->intfl & (MXC_F_UART_INTFL_RX_OVER_THRESHOLD | UART_ERRORS)) {
mbed_official 507:d4fc7603a669 169 irq_handler(serial_irq_ids[id], RxIrq);
mbed_official 507:d4fc7603a669 170 uart->intfl &= ~(MXC_F_UART_INTFL_RX_OVER_THRESHOLD | UART_ERRORS);
mbed_official 507:d4fc7603a669 171 }
mbed_official 507:d4fc7603a669 172
mbed_official 507:d4fc7603a669 173 // Check for TX Threshold
mbed_official 507:d4fc7603a669 174 if(uart->intfl & MXC_F_UART_INTFL_TX_ALMOST_EMPTY) {
mbed_official 507:d4fc7603a669 175 irq_handler(serial_irq_ids[id], TxIrq);
mbed_official 507:d4fc7603a669 176 uart->intfl &= ~(MXC_F_UART_INTFL_TX_ALMOST_EMPTY);
mbed_official 507:d4fc7603a669 177 }
mbed_official 507:d4fc7603a669 178 }
mbed_official 507:d4fc7603a669 179
mbed_official 507:d4fc7603a669 180 void uart0_handler(void)
mbed_official 507:d4fc7603a669 181 {
mbed_official 507:d4fc7603a669 182 uart_handler(MXC_UART0, 0);
mbed_official 507:d4fc7603a669 183 }
mbed_official 507:d4fc7603a669 184 void uart1_handler(void)
mbed_official 507:d4fc7603a669 185 {
mbed_official 507:d4fc7603a669 186 uart_handler(MXC_UART1, 1);
mbed_official 507:d4fc7603a669 187 }
mbed_official 507:d4fc7603a669 188
mbed_official 507:d4fc7603a669 189 //******************************************************************************
mbed_official 507:d4fc7603a669 190 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 507:d4fc7603a669 191 {
mbed_official 507:d4fc7603a669 192 irq_handler = handler;
mbed_official 507:d4fc7603a669 193 serial_irq_ids[obj->index] = id;
mbed_official 507:d4fc7603a669 194 }
mbed_official 507:d4fc7603a669 195
mbed_official 507:d4fc7603a669 196 //******************************************************************************
mbed_official 507:d4fc7603a669 197 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 507:d4fc7603a669 198 {
mbed_official 507:d4fc7603a669 199 if(obj->index == 0) {
mbed_official 507:d4fc7603a669 200 NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
mbed_official 507:d4fc7603a669 201 NVIC_EnableIRQ(UART0_IRQn);
mbed_official 507:d4fc7603a669 202 } else {
mbed_official 507:d4fc7603a669 203 NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
mbed_official 507:d4fc7603a669 204 NVIC_EnableIRQ(UART1_IRQn);
mbed_official 507:d4fc7603a669 205 }
mbed_official 507:d4fc7603a669 206
mbed_official 507:d4fc7603a669 207 if(irq == RxIrq) {
mbed_official 507:d4fc7603a669 208 // Set the RX FIFO Threshold to 1
mbed_official 507:d4fc7603a669 209 obj->uart->ctrl &= ~MXC_F_UART_CTRL_RX_THRESHOLD;
mbed_official 507:d4fc7603a669 210 obj->uart->ctrl |= 0x1;
mbed_official 507:d4fc7603a669 211 // Enable RX FIFO Threshold Interrupt
mbed_official 507:d4fc7603a669 212 if(enable) {
mbed_official 507:d4fc7603a669 213 // Clear pending interrupts
mbed_official 507:d4fc7603a669 214 obj->uart->intfl = 0;
mbed_official 507:d4fc7603a669 215 obj->uart->inten |= (MXC_F_UART_INTFL_RX_OVER_THRESHOLD |
mbed_official 507:d4fc7603a669 216 UART_ERRORS);
mbed_official 507:d4fc7603a669 217 } else {
mbed_official 507:d4fc7603a669 218 // Clear pending interrupts
mbed_official 507:d4fc7603a669 219 obj->uart->intfl = 0;
mbed_official 507:d4fc7603a669 220 obj->uart->inten &= ~(MXC_F_UART_INTFL_RX_OVER_THRESHOLD |
mbed_official 507:d4fc7603a669 221 UART_ERRORS);
mbed_official 507:d4fc7603a669 222 }
mbed_official 507:d4fc7603a669 223
mbed_official 507:d4fc7603a669 224 } else if (irq == TxIrq) {
mbed_official 507:d4fc7603a669 225 // Enable TX Almost empty Interrupt
mbed_official 507:d4fc7603a669 226 if(enable) {
mbed_official 507:d4fc7603a669 227 // Clear pending interrupts
mbed_official 507:d4fc7603a669 228 obj->uart->intfl = 0;
mbed_official 507:d4fc7603a669 229 obj->uart->inten |= MXC_F_UART_INTFL_TX_ALMOST_EMPTY;
mbed_official 507:d4fc7603a669 230 } else {
mbed_official 507:d4fc7603a669 231 // Clear pending interrupts
mbed_official 507:d4fc7603a669 232 obj->uart->intfl = 0;
mbed_official 507:d4fc7603a669 233 obj->uart->inten &= ~MXC_F_UART_INTFL_TX_ALMOST_EMPTY;
mbed_official 507:d4fc7603a669 234 }
mbed_official 507:d4fc7603a669 235
mbed_official 507:d4fc7603a669 236 } else {
mbed_official 507:d4fc7603a669 237 MBED_ASSERT(0);
mbed_official 507:d4fc7603a669 238 }
mbed_official 507:d4fc7603a669 239 }
mbed_official 507:d4fc7603a669 240
mbed_official 507:d4fc7603a669 241
mbed_official 507:d4fc7603a669 242 //******************************************************************************
mbed_official 507:d4fc7603a669 243 int serial_getc(serial_t *obj)
mbed_official 507:d4fc7603a669 244 {
mbed_official 507:d4fc7603a669 245 int c;
mbed_official 507:d4fc7603a669 246
mbed_official 507:d4fc7603a669 247 // Wait for data to be available
mbed_official 507:d4fc7603a669 248 while(obj->uart->status & MXC_F_UART_STATUS_RX_FIFO_EMPTY) {}
mbed_official 507:d4fc7603a669 249 c = obj->uart->tx_rx_fifo & 0xFF;
mbed_official 507:d4fc7603a669 250
mbed_official 507:d4fc7603a669 251 // Echo characters for stdio
mbed_official 507:d4fc7603a669 252 if (obj->uart == (mxc_uart_regs_t*)STDIO_UART) {
mbed_official 507:d4fc7603a669 253 obj->uart->tx_rx_fifo = c;
mbed_official 507:d4fc7603a669 254 }
mbed_official 507:d4fc7603a669 255
mbed_official 507:d4fc7603a669 256 return c;
mbed_official 507:d4fc7603a669 257 }
mbed_official 507:d4fc7603a669 258
mbed_official 507:d4fc7603a669 259 //******************************************************************************
mbed_official 507:d4fc7603a669 260 void serial_putc(serial_t *obj, int c)
mbed_official 507:d4fc7603a669 261 {
mbed_official 507:d4fc7603a669 262 // Append a carriage return for stdio
mbed_official 507:d4fc7603a669 263 if ((c == (int)'\n') && (obj->uart == (mxc_uart_regs_t*)STDIO_UART)) {
mbed_official 507:d4fc7603a669 264 while(obj->uart->status & MXC_F_UART_STATUS_TX_FIFO_FULL) {}
mbed_official 507:d4fc7603a669 265 obj->uart->tx_rx_fifo = '\r';
mbed_official 507:d4fc7603a669 266 }
mbed_official 507:d4fc7603a669 267
mbed_official 507:d4fc7603a669 268 // Wait for TXFIFO to not be full
mbed_official 507:d4fc7603a669 269 while(obj->uart->status & MXC_F_UART_STATUS_TX_FIFO_FULL) {}
mbed_official 507:d4fc7603a669 270 obj->uart->tx_rx_fifo = c;
mbed_official 507:d4fc7603a669 271
mbed_official 507:d4fc7603a669 272 }
mbed_official 507:d4fc7603a669 273
mbed_official 507:d4fc7603a669 274 //******************************************************************************
mbed_official 507:d4fc7603a669 275 int serial_readable(serial_t *obj)
mbed_official 507:d4fc7603a669 276 {
mbed_official 507:d4fc7603a669 277 return (!(obj->uart->status & MXC_F_UART_STATUS_RX_FIFO_EMPTY));
mbed_official 507:d4fc7603a669 278 }
mbed_official 507:d4fc7603a669 279
mbed_official 507:d4fc7603a669 280 //******************************************************************************
mbed_official 507:d4fc7603a669 281 int serial_writable(serial_t *obj)
mbed_official 507:d4fc7603a669 282 {
mbed_official 507:d4fc7603a669 283 return (!(obj->uart->status & MXC_F_UART_STATUS_TX_FIFO_FULL));
mbed_official 507:d4fc7603a669 284 }
mbed_official 507:d4fc7603a669 285
mbed_official 507:d4fc7603a669 286 //******************************************************************************
mbed_official 507:d4fc7603a669 287 void serial_clear(serial_t *obj)
mbed_official 507:d4fc7603a669 288 {
mbed_official 507:d4fc7603a669 289 // Clear the rx and tx fifos
mbed_official 507:d4fc7603a669 290 obj->uart->ctrl |= (MXC_F_UART_CTRL_TX_FIFO_FLUSH | MXC_F_UART_CTRL_RX_FIFO_FLUSH );
mbed_official 507:d4fc7603a669 291 }
mbed_official 507:d4fc7603a669 292
mbed_official 507:d4fc7603a669 293
mbed_official 507:d4fc7603a669 294 //******************************************************************************
mbed_official 507:d4fc7603a669 295 void serial_break_set(serial_t *obj)
mbed_official 507:d4fc7603a669 296 {
mbed_official 507:d4fc7603a669 297 // Make sure that nothing is being sent
mbed_official 507:d4fc7603a669 298 while(obj->uart->status & MXC_F_UART_STATUS_RX_BUSY) {}
mbed_official 507:d4fc7603a669 299
mbed_official 507:d4fc7603a669 300 // Disable the clock to pause any transmission
mbed_official 507:d4fc7603a669 301 obj->uart->ctrl &= ~MXC_F_UART_CTRL_BAUD_CLK_EN ;
mbed_official 507:d4fc7603a669 302 }
mbed_official 507:d4fc7603a669 303
mbed_official 507:d4fc7603a669 304 //******************************************************************************
mbed_official 507:d4fc7603a669 305 void serial_break_clear(serial_t *obj)
mbed_official 507:d4fc7603a669 306 {
mbed_official 507:d4fc7603a669 307 obj->uart->ctrl |= MXC_F_UART_CTRL_BAUD_CLK_EN;
mbed_official 507:d4fc7603a669 308 }
mbed_official 507:d4fc7603a669 309
mbed_official 507:d4fc7603a669 310
mbed_official 507:d4fc7603a669 311 //******************************************************************************
mbed_official 507:d4fc7603a669 312 void serial_pinout_tx(PinName tx)
mbed_official 507:d4fc7603a669 313 {
mbed_official 507:d4fc7603a669 314 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 507:d4fc7603a669 315 }
mbed_official 507:d4fc7603a669 316
mbed_official 507:d4fc7603a669 317
mbed_official 507:d4fc7603a669 318 //******************************************************************************
mbed_official 507:d4fc7603a669 319 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
mbed_official 507:d4fc7603a669 320 {
mbed_official 507:d4fc7603a669 321 if(FlowControlNone == type) {
mbed_official 507:d4fc7603a669 322 // Disable hardware flow control
mbed_official 507:d4fc7603a669 323 obj->uart->ctrl &= ~(MXC_F_UART_CTRL_HW_FLOW_CTRL_EN);
mbed_official 507:d4fc7603a669 324 return;
mbed_official 507:d4fc7603a669 325 }
mbed_official 507:d4fc7603a669 326
mbed_official 507:d4fc7603a669 327 // Check to see if we can use HW flow control
mbed_official 507:d4fc7603a669 328 UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
mbed_official 507:d4fc7603a669 329 UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
mbed_official 507:d4fc7603a669 330 UARTName uart = (UARTName)pinmap_merge(uart_cts, uart_rts);
mbed_official 507:d4fc7603a669 331
mbed_official 507:d4fc7603a669 332 if((FlowControlCTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 507:d4fc7603a669 333 // Make sure pin is in the PinMap
mbed_official 507:d4fc7603a669 334 MBED_ASSERT(uart_cts != (UARTName)NC);
mbed_official 507:d4fc7603a669 335
mbed_official 507:d4fc7603a669 336 // Enable the pin for CTS function
mbed_official 507:d4fc7603a669 337 pinmap_pinout(txflow, PinMap_UART_CTS);
mbed_official 507:d4fc7603a669 338 }
mbed_official 507:d4fc7603a669 339
mbed_official 507:d4fc7603a669 340 if((FlowControlRTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 507:d4fc7603a669 341 // Make sure pin is in the PinMap
mbed_official 507:d4fc7603a669 342 MBED_ASSERT(uart_rts != (UARTName)NC);
mbed_official 507:d4fc7603a669 343
mbed_official 507:d4fc7603a669 344 // Enable the pin for RTS function
mbed_official 507:d4fc7603a669 345 pinmap_pinout(rxflow, PinMap_UART_RTS);
mbed_official 507:d4fc7603a669 346 }
mbed_official 507:d4fc7603a669 347
mbed_official 507:d4fc7603a669 348 if(FlowControlRTSCTS == type){
mbed_official 507:d4fc7603a669 349 // Make sure that the pins are pointing to the same UART
mbed_official 507:d4fc7603a669 350 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 507:d4fc7603a669 351 }
mbed_official 507:d4fc7603a669 352
mbed_official 507:d4fc7603a669 353 // Enable hardware flow control
mbed_official 507:d4fc7603a669 354 obj->uart->ctrl |= MXC_F_UART_CTRL_HW_FLOW_CTRL_EN;
mbed_official 507:d4fc7603a669 355 }