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:
Thu Apr 03 11:45:06 2014 +0100
Revision:
149:1fb5f62b92bd
Parent:
targets/hal/TARGET_Freescale/TARGET_KSDK_MCUS/TARGET_K64F/serial_api.c@146:f64d43ff0c18
Child:
188:e2558dbb5ee5
Synchronized with git revision 220c0bb39ceee40016e1e86350c058963d01ed42

Full URL: https://github.com/mbedmicro/mbed/commit/220c0bb39ceee40016e1e86350c058963d01ed42/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 146:f64d43ff0c18 1 /* mbed Microcontroller Library
mbed_official 146:f64d43ff0c18 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 146:f64d43ff0c18 3 *
mbed_official 146:f64d43ff0c18 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 146:f64d43ff0c18 5 * you may not use this file except in compliance with the License.
mbed_official 146:f64d43ff0c18 6 * You may obtain a copy of the License at
mbed_official 146:f64d43ff0c18 7 *
mbed_official 146:f64d43ff0c18 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 146:f64d43ff0c18 9 *
mbed_official 146:f64d43ff0c18 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 146:f64d43ff0c18 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 146:f64d43ff0c18 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 146:f64d43ff0c18 13 * See the License for the specific language governing permissions and
mbed_official 146:f64d43ff0c18 14 * limitations under the License.
mbed_official 146:f64d43ff0c18 15 */
mbed_official 146:f64d43ff0c18 16 #include "serial_api.h"
mbed_official 146:f64d43ff0c18 17
mbed_official 146:f64d43ff0c18 18 // math.h required for floating point operations for baud rate calculation
mbed_official 146:f64d43ff0c18 19 #include <math.h>
mbed_official 146:f64d43ff0c18 20
mbed_official 146:f64d43ff0c18 21 #include <string.h>
mbed_official 146:f64d43ff0c18 22
mbed_official 146:f64d43ff0c18 23 #include "cmsis.h"
mbed_official 146:f64d43ff0c18 24 #include "pinmap.h"
mbed_official 146:f64d43ff0c18 25 #include "error.h"
mbed_official 146:f64d43ff0c18 26 #include "fsl_uart_hal.h"
mbed_official 146:f64d43ff0c18 27 #include "fsl_clock_manager.h"
mbed_official 146:f64d43ff0c18 28 #include "fsl_uart_features.h"
mbed_official 146:f64d43ff0c18 29
mbed_official 146:f64d43ff0c18 30 /* TODO:
mbed_official 146:f64d43ff0c18 31 putchar/getchar 9 and 10 bits support
mbed_official 146:f64d43ff0c18 32 */
mbed_official 146:f64d43ff0c18 33
mbed_official 146:f64d43ff0c18 34 static const PinMap PinMap_UART_TX[] = {
mbed_official 146:f64d43ff0c18 35 {PTB17, UART_0, 3},
mbed_official 146:f64d43ff0c18 36 {PTC17, UART_3, 3},
mbed_official 146:f64d43ff0c18 37 {PTD7 , UART_0, 3},
mbed_official 146:f64d43ff0c18 38 {PTD3 , UART_2, 3},
mbed_official 146:f64d43ff0c18 39 {PTC4 , UART_1, 3},
mbed_official 146:f64d43ff0c18 40 {PTC15, UART_4, 3},
mbed_official 146:f64d43ff0c18 41 {PTB11, UART_3, 3},
mbed_official 146:f64d43ff0c18 42 {PTA14, UART_0, 3},
mbed_official 146:f64d43ff0c18 43 {PTE24, UART_4, 3},
mbed_official 146:f64d43ff0c18 44 {PTE4 , UART_3, 3},
mbed_official 146:f64d43ff0c18 45 {PTE0, UART_1, 3},
mbed_official 146:f64d43ff0c18 46 {NC , NC , 0}
mbed_official 146:f64d43ff0c18 47 };
mbed_official 146:f64d43ff0c18 48
mbed_official 146:f64d43ff0c18 49 static const PinMap PinMap_UART_RX[] = {
mbed_official 146:f64d43ff0c18 50 {PTB16, UART_0, 3},
mbed_official 146:f64d43ff0c18 51 {PTE1 , UART_1, 3},
mbed_official 146:f64d43ff0c18 52 {PTE5 , UART_3, 3},
mbed_official 146:f64d43ff0c18 53 {PTE25, UART_4, 3},
mbed_official 146:f64d43ff0c18 54 {PTA15, UART_0, 3},
mbed_official 146:f64d43ff0c18 55 {PTC16, UART_3, 3},
mbed_official 146:f64d43ff0c18 56 {PTB10, UART_3, 3},
mbed_official 146:f64d43ff0c18 57 {PTC3 , UART_1, 3},
mbed_official 146:f64d43ff0c18 58 {PTC14, UART_4, 3},
mbed_official 146:f64d43ff0c18 59 {PTD2 , UART_2, 3},
mbed_official 146:f64d43ff0c18 60 {PTC6 , UART_0, 3},
mbed_official 146:f64d43ff0c18 61 {NC , NC , 0}
mbed_official 146:f64d43ff0c18 62 };
mbed_official 146:f64d43ff0c18 63
mbed_official 146:f64d43ff0c18 64 #define UART_NUM 4
mbed_official 146:f64d43ff0c18 65
mbed_official 146:f64d43ff0c18 66 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 146:f64d43ff0c18 67 static uart_irq_handler irq_handler;
mbed_official 146:f64d43ff0c18 68
mbed_official 146:f64d43ff0c18 69 int stdio_uart_inited = 0;
mbed_official 146:f64d43ff0c18 70 serial_t stdio_uart;
mbed_official 146:f64d43ff0c18 71
mbed_official 146:f64d43ff0c18 72 static uint32_t serial_get_clock(uint32_t uart_instance)
mbed_official 146:f64d43ff0c18 73 {
mbed_official 146:f64d43ff0c18 74 uint32_t uartSourceClock;
mbed_official 146:f64d43ff0c18 75
mbed_official 146:f64d43ff0c18 76 if ((uart_instance == 0) || (uart_instance == 1)) {
mbed_official 146:f64d43ff0c18 77 clock_manager_get_frequency(kSystemClock, &uartSourceClock);
mbed_official 146:f64d43ff0c18 78 } else {
mbed_official 146:f64d43ff0c18 79 clock_manager_get_frequency(kBusClock, &uartSourceClock);
mbed_official 146:f64d43ff0c18 80 }
mbed_official 146:f64d43ff0c18 81 return uartSourceClock;
mbed_official 146:f64d43ff0c18 82 }
mbed_official 146:f64d43ff0c18 83
mbed_official 146:f64d43ff0c18 84 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 146:f64d43ff0c18 85 uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 146:f64d43ff0c18 86 uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 146:f64d43ff0c18 87 obj->index = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 146:f64d43ff0c18 88 if ((int)obj->index == NC) {
mbed_official 146:f64d43ff0c18 89 error("Serial pinout mapping failed");
mbed_official 146:f64d43ff0c18 90 }
mbed_official 146:f64d43ff0c18 91
mbed_official 146:f64d43ff0c18 92 uart_config_t uart_config;
mbed_official 146:f64d43ff0c18 93 uart_config.baudRate = 9600;
mbed_official 146:f64d43ff0c18 94 uart_config.bitCountPerChar = kUart8BitsPerChar;
mbed_official 146:f64d43ff0c18 95 uart_config.parityMode = kUartParityDisabled;
mbed_official 146:f64d43ff0c18 96 uart_config.rxDataInvert = 0;
mbed_official 146:f64d43ff0c18 97 uart_config.stopBitCount = kUartOneStopBit;
mbed_official 146:f64d43ff0c18 98 uart_config.txDataInvert = 0;
mbed_official 146:f64d43ff0c18 99
mbed_official 146:f64d43ff0c18 100 uart_config.uartSourceClockInHz = serial_get_clock(obj->index);
mbed_official 146:f64d43ff0c18 101
mbed_official 146:f64d43ff0c18 102 clock_manager_set_gate(kClockModuleUART, obj->index, true);
mbed_official 146:f64d43ff0c18 103 uart_hal_init(obj->index, &uart_config);
mbed_official 146:f64d43ff0c18 104
mbed_official 146:f64d43ff0c18 105 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 146:f64d43ff0c18 106 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 146:f64d43ff0c18 107
mbed_official 146:f64d43ff0c18 108 pin_mode(tx, PullUp);
mbed_official 146:f64d43ff0c18 109 pin_mode(rx, PullUp);
mbed_official 146:f64d43ff0c18 110
mbed_official 146:f64d43ff0c18 111 if (obj->index == STDIO_UART) {
mbed_official 146:f64d43ff0c18 112 stdio_uart_inited = 1;
mbed_official 146:f64d43ff0c18 113 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 146:f64d43ff0c18 114 }
mbed_official 146:f64d43ff0c18 115 }
mbed_official 146:f64d43ff0c18 116
mbed_official 146:f64d43ff0c18 117 void serial_free(serial_t *obj) {
mbed_official 146:f64d43ff0c18 118 serial_irq_ids[obj->index] = 0;
mbed_official 146:f64d43ff0c18 119 }
mbed_official 146:f64d43ff0c18 120
mbed_official 146:f64d43ff0c18 121 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 146:f64d43ff0c18 122 uart_hal_set_baud_rate(obj->index, serial_get_clock(obj->index), (uint32_t)baudrate);
mbed_official 146:f64d43ff0c18 123 }
mbed_official 146:f64d43ff0c18 124
mbed_official 146:f64d43ff0c18 125 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 146:f64d43ff0c18 126 uart_hal_configure_bit_count_per_char(obj->index, (uart_bit_count_per_char_t)data_bits);
mbed_official 146:f64d43ff0c18 127 uart_hal_configure_parity_mode(obj->index, (uart_parity_mode_t)parity);
mbed_official 146:f64d43ff0c18 128 uart_hal_configure_stop_bit_count(obj->index, (uart_stop_bit_count_t)stop_bits);
mbed_official 146:f64d43ff0c18 129 }
mbed_official 146:f64d43ff0c18 130
mbed_official 146:f64d43ff0c18 131 /******************************************************************************
mbed_official 146:f64d43ff0c18 132 * INTERRUPTS HANDLING
mbed_official 146:f64d43ff0c18 133 ******************************************************************************/
mbed_official 146:f64d43ff0c18 134 static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index) {
mbed_official 146:f64d43ff0c18 135 if (serial_irq_ids[index] != 0) {
mbed_official 146:f64d43ff0c18 136 if (transmit_empty)
mbed_official 146:f64d43ff0c18 137 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 146:f64d43ff0c18 138
mbed_official 146:f64d43ff0c18 139 if (receive_full)
mbed_official 146:f64d43ff0c18 140 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 146:f64d43ff0c18 141 }
mbed_official 146:f64d43ff0c18 142 }
mbed_official 146:f64d43ff0c18 143
mbed_official 146:f64d43ff0c18 144 void uart0_irq() {
mbed_official 146:f64d43ff0c18 145 uart_irq(uart_hal_is_transmit_data_register_empty(0), uart_hal_is_receive_data_register_full(0), 0);
mbed_official 146:f64d43ff0c18 146 if (uart_hal_is_receive_overrun_detected(0))
mbed_official 146:f64d43ff0c18 147 uart_hal_clear_status_flag(0, kUartReceiveOverrun);
mbed_official 146:f64d43ff0c18 148 }
mbed_official 146:f64d43ff0c18 149 void uart1_irq() {
mbed_official 146:f64d43ff0c18 150 uart_irq(uart_hal_is_transmit_data_register_empty(1), uart_hal_is_receive_data_register_full(1), 1);
mbed_official 146:f64d43ff0c18 151 }
mbed_official 146:f64d43ff0c18 152
mbed_official 146:f64d43ff0c18 153 void uart2_irq() {
mbed_official 146:f64d43ff0c18 154 uart_irq(uart_hal_is_transmit_data_register_empty(2), uart_hal_is_receive_data_register_full(2), 2);
mbed_official 146:f64d43ff0c18 155 }
mbed_official 146:f64d43ff0c18 156
mbed_official 146:f64d43ff0c18 157 void uart3_irq() {
mbed_official 146:f64d43ff0c18 158 uart_irq(uart_hal_is_transmit_data_register_empty(3), uart_hal_is_receive_data_register_full(3), 3);
mbed_official 146:f64d43ff0c18 159 }
mbed_official 146:f64d43ff0c18 160
mbed_official 146:f64d43ff0c18 161 void uart4_irq() {
mbed_official 146:f64d43ff0c18 162 uart_irq(uart_hal_is_transmit_data_register_empty(4), uart_hal_is_receive_data_register_full(4), 4);
mbed_official 146:f64d43ff0c18 163 }
mbed_official 146:f64d43ff0c18 164
mbed_official 146:f64d43ff0c18 165 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 146:f64d43ff0c18 166 irq_handler = handler;
mbed_official 146:f64d43ff0c18 167 serial_irq_ids[obj->index] = id;
mbed_official 146:f64d43ff0c18 168 }
mbed_official 146:f64d43ff0c18 169
mbed_official 146:f64d43ff0c18 170 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 146:f64d43ff0c18 171 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 146:f64d43ff0c18 172 uint32_t vector = 0;
mbed_official 146:f64d43ff0c18 173
mbed_official 146:f64d43ff0c18 174 switch (obj->index) {
mbed_official 146:f64d43ff0c18 175 case 0: irq_n=UART0_RX_TX_IRQn; vector = (uint32_t)&uart0_irq; break;
mbed_official 146:f64d43ff0c18 176 case 1: irq_n=UART1_RX_TX_IRQn; vector = (uint32_t)&uart1_irq; break;
mbed_official 146:f64d43ff0c18 177 case 2: irq_n=UART2_RX_TX_IRQn; vector = (uint32_t)&uart2_irq; break;
mbed_official 146:f64d43ff0c18 178 case 3: irq_n=UART3_RX_TX_IRQn; vector = (uint32_t)&uart3_irq; break;
mbed_official 146:f64d43ff0c18 179 case 4: irq_n=UART4_RX_TX_IRQn; vector = (uint32_t)&uart4_irq; break;
mbed_official 146:f64d43ff0c18 180 }
mbed_official 146:f64d43ff0c18 181
mbed_official 146:f64d43ff0c18 182 if (enable) {
mbed_official 146:f64d43ff0c18 183 switch (irq) {
mbed_official 146:f64d43ff0c18 184 case RxIrq: uart_hal_enable_rx_data_register_full_interrupt(obj->index); break;
mbed_official 146:f64d43ff0c18 185 case TxIrq: uart_hal_enable_tx_data_register_empty_interrupt(obj->index); break;
mbed_official 146:f64d43ff0c18 186 }
mbed_official 146:f64d43ff0c18 187 NVIC_SetVector(irq_n, vector);
mbed_official 146:f64d43ff0c18 188 NVIC_EnableIRQ(irq_n);
mbed_official 146:f64d43ff0c18 189
mbed_official 146:f64d43ff0c18 190 } else { // disable
mbed_official 146:f64d43ff0c18 191 int all_disabled = 0;
mbed_official 146:f64d43ff0c18 192 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 146:f64d43ff0c18 193 switch (irq) {
mbed_official 146:f64d43ff0c18 194 case RxIrq: uart_hal_disable_rx_data_register_full_interrupt(obj->index); break;
mbed_official 146:f64d43ff0c18 195 case TxIrq: uart_hal_enable_tx_data_register_empty_interrupt(obj->index); break;
mbed_official 146:f64d43ff0c18 196 }
mbed_official 146:f64d43ff0c18 197 switch (other_irq) {
mbed_official 146:f64d43ff0c18 198 case RxIrq: all_disabled = uart_hal_is_receive_data_full_interrupt_enabled(obj->index) == 0; break;
mbed_official 146:f64d43ff0c18 199 case TxIrq: all_disabled = uart_hal_is_tx_data_register_empty_interrupt_enabled(obj->index) == 0; break;
mbed_official 146:f64d43ff0c18 200 }
mbed_official 146:f64d43ff0c18 201 if (all_disabled)
mbed_official 146:f64d43ff0c18 202 NVIC_DisableIRQ(irq_n);
mbed_official 146:f64d43ff0c18 203 }
mbed_official 146:f64d43ff0c18 204 }
mbed_official 146:f64d43ff0c18 205
mbed_official 146:f64d43ff0c18 206 int serial_getc(serial_t *obj) {
mbed_official 146:f64d43ff0c18 207 while (!serial_readable(obj));
mbed_official 146:f64d43ff0c18 208 uint8_t data;
mbed_official 146:f64d43ff0c18 209 uart_hal_getchar(obj->index, &data);
mbed_official 146:f64d43ff0c18 210
mbed_official 146:f64d43ff0c18 211 return data;
mbed_official 146:f64d43ff0c18 212 }
mbed_official 146:f64d43ff0c18 213
mbed_official 146:f64d43ff0c18 214 void serial_putc(serial_t *obj, int c) {
mbed_official 146:f64d43ff0c18 215 while (!serial_writable(obj));
mbed_official 146:f64d43ff0c18 216 uart_hal_putchar(obj->index, (uint8_t)c);
mbed_official 146:f64d43ff0c18 217 }
mbed_official 146:f64d43ff0c18 218
mbed_official 146:f64d43ff0c18 219 int serial_readable(serial_t *obj) {
mbed_official 146:f64d43ff0c18 220 if (uart_hal_is_receive_overrun_detected(obj->index))
mbed_official 146:f64d43ff0c18 221 uart_hal_clear_status_flag(obj->index, kUartReceiveOverrun);
mbed_official 146:f64d43ff0c18 222 return uart_hal_is_receive_data_register_full(obj->index);
mbed_official 146:f64d43ff0c18 223 }
mbed_official 146:f64d43ff0c18 224
mbed_official 146:f64d43ff0c18 225 int serial_writable(serial_t *obj) {
mbed_official 146:f64d43ff0c18 226 if (uart_hal_is_receive_overrun_detected(obj->index))
mbed_official 146:f64d43ff0c18 227 uart_hal_clear_status_flag(obj->index, kUartReceiveOverrun);
mbed_official 146:f64d43ff0c18 228
mbed_official 146:f64d43ff0c18 229 return uart_hal_is_transmit_data_register_empty(obj->index);
mbed_official 146:f64d43ff0c18 230 }
mbed_official 146:f64d43ff0c18 231
mbed_official 146:f64d43ff0c18 232 void serial_clear(serial_t *obj) {
mbed_official 146:f64d43ff0c18 233 }
mbed_official 146:f64d43ff0c18 234
mbed_official 146:f64d43ff0c18 235 void serial_pinout_tx(PinName tx) {
mbed_official 146:f64d43ff0c18 236 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 146:f64d43ff0c18 237 }
mbed_official 146:f64d43ff0c18 238
mbed_official 146:f64d43ff0c18 239 void serial_break_set(serial_t *obj) {
mbed_official 146:f64d43ff0c18 240 uart_hal_queue_break_char_to_send(obj->index, true);
mbed_official 146:f64d43ff0c18 241 }
mbed_official 146:f64d43ff0c18 242
mbed_official 146:f64d43ff0c18 243 void serial_break_clear(serial_t *obj) {
mbed_official 146:f64d43ff0c18 244 uart_hal_queue_break_char_to_send(obj->index, false);
mbed_official 146:f64d43ff0c18 245 }
mbed_official 146:f64d43ff0c18 246