marcus chiou / mbed-src

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Apr 16 11:45:13 2015 +0100
Revision:
514:7668256dbe61
Synchronized with git revision 29ab478a78892415a3c721cdc20b1755b7b01ba1

Full URL: https://github.com/mbedmicro/mbed/commit/29ab478a78892415a3c721cdc20b1755b7b01ba1/

LPC824, SSCI824 - Add GCC_ARM exporter support

Who changed what in which revision?

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