mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
<>
Date:
Fri Sep 30 18:07:01 2016 +0100
Revision:
148:21d94c44109e
Parent:
121:7f86b4238bec
This updates the lib to the mbed lib v127

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 121:7f86b4238bec 1 /* mbed Microcontroller Library
mbed_official 121:7f86b4238bec 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 121:7f86b4238bec 3 *
mbed_official 121:7f86b4238bec 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 121:7f86b4238bec 5 * you may not use this file except in compliance with the License.
mbed_official 121:7f86b4238bec 6 * You may obtain a copy of the License at
mbed_official 121:7f86b4238bec 7 *
mbed_official 121:7f86b4238bec 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 121:7f86b4238bec 9 *
mbed_official 121:7f86b4238bec 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 121:7f86b4238bec 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 121:7f86b4238bec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 121:7f86b4238bec 13 * See the License for the specific language governing permissions and
mbed_official 121:7f86b4238bec 14 * limitations under the License.
mbed_official 121:7f86b4238bec 15 */
mbed_official 121:7f86b4238bec 16 #include "serial_api.h"
mbed_official 121:7f86b4238bec 17
mbed_official 121:7f86b4238bec 18 #if DEVICE_SERIAL
mbed_official 121:7f86b4238bec 19
mbed_official 121:7f86b4238bec 20 // math.h required for floating point operations for baud rate calculation
mbed_official 121:7f86b4238bec 21 #include <math.h>
mbed_official 121:7f86b4238bec 22 #include "mbed_assert.h"
mbed_official 121:7f86b4238bec 23
mbed_official 121:7f86b4238bec 24 #include <string.h>
mbed_official 121:7f86b4238bec 25
mbed_official 121:7f86b4238bec 26 #include "cmsis.h"
mbed_official 121:7f86b4238bec 27 #include "pinmap.h"
mbed_official 121:7f86b4238bec 28 #include "fsl_lpuart.h"
mbed_official 121:7f86b4238bec 29 #include "peripheral_clock_defines.h"
mbed_official 121:7f86b4238bec 30 #include "PeripheralPins.h"
mbed_official 121:7f86b4238bec 31 #include "fsl_clock_config.h"
mbed_official 121:7f86b4238bec 32
mbed_official 121:7f86b4238bec 33 static uint32_t serial_irq_ids[FSL_FEATURE_SOC_LPUART_COUNT] = {0};
mbed_official 121:7f86b4238bec 34 static uart_irq_handler irq_handler;
mbed_official 121:7f86b4238bec 35 /* Array of UART peripheral base address. */
mbed_official 121:7f86b4238bec 36 static LPUART_Type *const uart_addrs[] = LPUART_BASE_PTRS;
mbed_official 121:7f86b4238bec 37 /* Array of LPUART bus clock frequencies */
mbed_official 121:7f86b4238bec 38 static clock_name_t const uart_clocks[] = LPUART_CLOCK_FREQS;
mbed_official 121:7f86b4238bec 39
mbed_official 121:7f86b4238bec 40 int stdio_uart_inited = 0;
mbed_official 121:7f86b4238bec 41 serial_t stdio_uart;
mbed_official 121:7f86b4238bec 42
mbed_official 121:7f86b4238bec 43 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 121:7f86b4238bec 44 uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 45 uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 46 obj->index = pinmap_merge(uart_tx, uart_rx);
mbed_official 121:7f86b4238bec 47 MBED_ASSERT((int)obj->index != NC);
mbed_official 121:7f86b4238bec 48
mbed_official 121:7f86b4238bec 49 // Need to initialize the clocks here as ticker init gets called before mbed_sdk_init
mbed_official 121:7f86b4238bec 50 if (SystemCoreClock == DEFAULT_SYSTEM_CLOCK)
mbed_official 121:7f86b4238bec 51 BOARD_BootClockRUN();
mbed_official 121:7f86b4238bec 52
mbed_official 121:7f86b4238bec 53 /* Set the LPUART clock source */
mbed_official 121:7f86b4238bec 54 if (obj->index == LPUART_0) {
mbed_official 121:7f86b4238bec 55 CLOCK_SetLpuart0Clock(1U);
mbed_official 121:7f86b4238bec 56 } else {
mbed_official 121:7f86b4238bec 57 CLOCK_SetLpuart1Clock(1U);
mbed_official 121:7f86b4238bec 58 }
mbed_official 121:7f86b4238bec 59
mbed_official 121:7f86b4238bec 60 lpuart_config_t config;
mbed_official 121:7f86b4238bec 61 LPUART_GetDefaultConfig(&config);
mbed_official 121:7f86b4238bec 62 config.baudRate_Bps = 9600;
mbed_official 121:7f86b4238bec 63 config.enableTx = false;
mbed_official 121:7f86b4238bec 64 config.enableRx = false;
mbed_official 121:7f86b4238bec 65
mbed_official 121:7f86b4238bec 66 LPUART_Init(uart_addrs[obj->index], &config, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 67
mbed_official 121:7f86b4238bec 68 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 69 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 70
mbed_official 121:7f86b4238bec 71 if (tx != NC) {
mbed_official 121:7f86b4238bec 72 LPUART_EnableTx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 73 pin_mode(tx, PullUp);
mbed_official 121:7f86b4238bec 74 }
mbed_official 121:7f86b4238bec 75 if (rx != NC) {
mbed_official 121:7f86b4238bec 76 LPUART_EnableRx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 77 pin_mode(rx, PullUp);
mbed_official 121:7f86b4238bec 78 }
mbed_official 121:7f86b4238bec 79
mbed_official 121:7f86b4238bec 80 if (obj->index == STDIO_UART) {
mbed_official 121:7f86b4238bec 81 stdio_uart_inited = 1;
mbed_official 121:7f86b4238bec 82 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 121:7f86b4238bec 83 }
mbed_official 121:7f86b4238bec 84 }
mbed_official 121:7f86b4238bec 85
mbed_official 121:7f86b4238bec 86 void serial_free(serial_t *obj) {
mbed_official 121:7f86b4238bec 87 LPUART_Deinit(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 88 serial_irq_ids[obj->index] = 0;
mbed_official 121:7f86b4238bec 89 }
mbed_official 121:7f86b4238bec 90
mbed_official 121:7f86b4238bec 91 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 121:7f86b4238bec 92 LPUART_SetBaudRate(uart_addrs[obj->index], (uint32_t)baudrate, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 93 }
mbed_official 121:7f86b4238bec 94
mbed_official 121:7f86b4238bec 95 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 121:7f86b4238bec 96 LPUART_Type *base = uart_addrs[obj->index];
mbed_official 121:7f86b4238bec 97 uint8_t temp;
mbed_official 121:7f86b4238bec 98 /* Set bit count and parity mode. */
mbed_official 121:7f86b4238bec 99 temp = base->CTRL & ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK);
mbed_official 121:7f86b4238bec 100 if (parity != ParityNone)
mbed_official 121:7f86b4238bec 101 {
mbed_official 121:7f86b4238bec 102 /* Enable Parity */
mbed_official 121:7f86b4238bec 103 temp |= (LPUART_CTRL_PE_MASK | LPUART_CTRL_M_MASK);
mbed_official 121:7f86b4238bec 104 if (parity == ParityOdd) {
mbed_official 121:7f86b4238bec 105 temp |= LPUART_CTRL_PT_MASK;
<> 148:21d94c44109e 106 } else if (parity == ParityEven) {
<> 148:21d94c44109e 107 // PT=0 so nothing more to do
mbed_official 121:7f86b4238bec 108 } else {
mbed_official 121:7f86b4238bec 109 // Hardware does not support forced parity
mbed_official 121:7f86b4238bec 110 MBED_ASSERT(0);
mbed_official 121:7f86b4238bec 111 }
mbed_official 121:7f86b4238bec 112 }
mbed_official 121:7f86b4238bec 113 base->CTRL = temp;
mbed_official 121:7f86b4238bec 114
mbed_official 121:7f86b4238bec 115 #if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT
mbed_official 121:7f86b4238bec 116 /* set stop bit per char */
mbed_official 121:7f86b4238bec 117 temp = base->BAUD & ~LPUART_BAUD_SBNS_MASK;
mbed_official 121:7f86b4238bec 118 base->BAUD = temp | LPUART_BAUD_SBNS((uint8_t)--stop_bits);
mbed_official 121:7f86b4238bec 119 #endif
mbed_official 121:7f86b4238bec 120 }
mbed_official 121:7f86b4238bec 121
mbed_official 121:7f86b4238bec 122 /******************************************************************************
mbed_official 121:7f86b4238bec 123 * INTERRUPTS HANDLING
mbed_official 121:7f86b4238bec 124 ******************************************************************************/
mbed_official 121:7f86b4238bec 125 static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index) {
mbed_official 121:7f86b4238bec 126 LPUART_Type *base = uart_addrs[index];
mbed_official 121:7f86b4238bec 127
mbed_official 121:7f86b4238bec 128 /* If RX overrun. */
mbed_official 121:7f86b4238bec 129 if (LPUART_STAT_OR_MASK & base->STAT)
mbed_official 121:7f86b4238bec 130 {
mbed_official 121:7f86b4238bec 131 /* Read base->D, otherwise the RX does not work. */
mbed_official 121:7f86b4238bec 132 (void)base->DATA;
mbed_official 121:7f86b4238bec 133 LPUART_ClearStatusFlags(base, kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 134 }
mbed_official 121:7f86b4238bec 135
mbed_official 121:7f86b4238bec 136 if (serial_irq_ids[index] != 0) {
mbed_official 121:7f86b4238bec 137 if (transmit_empty)
mbed_official 121:7f86b4238bec 138 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 121:7f86b4238bec 139
mbed_official 121:7f86b4238bec 140 if (receive_full)
mbed_official 121:7f86b4238bec 141 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 121:7f86b4238bec 142 }
mbed_official 121:7f86b4238bec 143 }
mbed_official 121:7f86b4238bec 144
mbed_official 121:7f86b4238bec 145 void uart0_irq() {
mbed_official 121:7f86b4238bec 146 uint32_t status_flags = LPUART0->STAT;
mbed_official 121:7f86b4238bec 147 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 0);
mbed_official 121:7f86b4238bec 148 }
mbed_official 121:7f86b4238bec 149
mbed_official 121:7f86b4238bec 150 void uart1_irq() {
mbed_official 121:7f86b4238bec 151 uint32_t status_flags = LPUART1->STAT;
mbed_official 121:7f86b4238bec 152 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 1);
mbed_official 121:7f86b4238bec 153 }
mbed_official 121:7f86b4238bec 154
mbed_official 121:7f86b4238bec 155 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 121:7f86b4238bec 156 irq_handler = handler;
mbed_official 121:7f86b4238bec 157 serial_irq_ids[obj->index] = id;
mbed_official 121:7f86b4238bec 158 }
mbed_official 121:7f86b4238bec 159
mbed_official 121:7f86b4238bec 160 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 121:7f86b4238bec 161 IRQn_Type uart_irqs[] = LPUART_RX_TX_IRQS;
mbed_official 121:7f86b4238bec 162 uint32_t vector = 0;
mbed_official 121:7f86b4238bec 163
mbed_official 121:7f86b4238bec 164 switch (obj->index) {
mbed_official 121:7f86b4238bec 165 case 0:
mbed_official 121:7f86b4238bec 166 vector = (uint32_t)&uart0_irq;
mbed_official 121:7f86b4238bec 167 break;
mbed_official 121:7f86b4238bec 168 case 1:
mbed_official 121:7f86b4238bec 169 vector = (uint32_t)&uart1_irq;
mbed_official 121:7f86b4238bec 170 break;
mbed_official 121:7f86b4238bec 171 default:
mbed_official 121:7f86b4238bec 172 break;
mbed_official 121:7f86b4238bec 173 }
mbed_official 121:7f86b4238bec 174
mbed_official 121:7f86b4238bec 175 if (enable) {
mbed_official 121:7f86b4238bec 176 switch (irq) {
mbed_official 121:7f86b4238bec 177 case RxIrq:
mbed_official 121:7f86b4238bec 178 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 179 break;
mbed_official 121:7f86b4238bec 180 case TxIrq:
mbed_official 121:7f86b4238bec 181 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 182 break;
mbed_official 121:7f86b4238bec 183 default:
mbed_official 121:7f86b4238bec 184 break;
mbed_official 121:7f86b4238bec 185 }
mbed_official 121:7f86b4238bec 186 NVIC_SetVector(uart_irqs[obj->index], vector);
mbed_official 121:7f86b4238bec 187 NVIC_EnableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 188
mbed_official 121:7f86b4238bec 189 } else { // disable
mbed_official 121:7f86b4238bec 190 int all_disabled = 0;
mbed_official 121:7f86b4238bec 191 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 121:7f86b4238bec 192 switch (irq) {
mbed_official 121:7f86b4238bec 193 case RxIrq:
mbed_official 121:7f86b4238bec 194 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 195 break;
mbed_official 121:7f86b4238bec 196 case TxIrq:
mbed_official 121:7f86b4238bec 197 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 198 break;
mbed_official 121:7f86b4238bec 199 default:
mbed_official 121:7f86b4238bec 200 break;
mbed_official 121:7f86b4238bec 201 }
mbed_official 121:7f86b4238bec 202 switch (other_irq) {
mbed_official 121:7f86b4238bec 203 case RxIrq:
mbed_official 121:7f86b4238bec 204 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_RxDataRegFullInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 205 break;
mbed_official 121:7f86b4238bec 206 case TxIrq:
mbed_official 121:7f86b4238bec 207 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_TxDataRegEmptyInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 208 break;
mbed_official 121:7f86b4238bec 209 default:
mbed_official 121:7f86b4238bec 210 break;
mbed_official 121:7f86b4238bec 211 }
mbed_official 121:7f86b4238bec 212 if (all_disabled)
mbed_official 121:7f86b4238bec 213 NVIC_DisableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 214 }
mbed_official 121:7f86b4238bec 215 }
mbed_official 121:7f86b4238bec 216
mbed_official 121:7f86b4238bec 217 int serial_getc(serial_t *obj) {
mbed_official 121:7f86b4238bec 218 uint8_t data;
mbed_official 121:7f86b4238bec 219
mbed_official 121:7f86b4238bec 220 LPUART_ReadBlocking(uart_addrs[obj->index], &data, 1);
mbed_official 121:7f86b4238bec 221 return data;
mbed_official 121:7f86b4238bec 222 }
mbed_official 121:7f86b4238bec 223
mbed_official 121:7f86b4238bec 224 void serial_putc(serial_t *obj, int c) {
mbed_official 121:7f86b4238bec 225 while (!serial_writable(obj));
mbed_official 121:7f86b4238bec 226 LPUART_WriteByte(uart_addrs[obj->index], (uint8_t)c);
mbed_official 121:7f86b4238bec 227 }
mbed_official 121:7f86b4238bec 228
mbed_official 121:7f86b4238bec 229 int serial_readable(serial_t *obj) {
mbed_official 121:7f86b4238bec 230 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 231 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 232 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 233 return (status_flags & kLPUART_RxDataRegFullFlag);
mbed_official 121:7f86b4238bec 234 }
mbed_official 121:7f86b4238bec 235
mbed_official 121:7f86b4238bec 236 int serial_writable(serial_t *obj) {
mbed_official 121:7f86b4238bec 237 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 238 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 239 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 240 return (status_flags & kLPUART_TxDataRegEmptyFlag);
mbed_official 121:7f86b4238bec 241 }
mbed_official 121:7f86b4238bec 242
mbed_official 121:7f86b4238bec 243 void serial_clear(serial_t *obj) {
mbed_official 121:7f86b4238bec 244 }
mbed_official 121:7f86b4238bec 245
mbed_official 121:7f86b4238bec 246 void serial_pinout_tx(PinName tx) {
mbed_official 121:7f86b4238bec 247 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 248 }
mbed_official 121:7f86b4238bec 249
mbed_official 121:7f86b4238bec 250 void serial_break_set(serial_t *obj) {
mbed_official 121:7f86b4238bec 251 uart_addrs[obj->index]->CTRL |= LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 252 }
mbed_official 121:7f86b4238bec 253
mbed_official 121:7f86b4238bec 254 void serial_break_clear(serial_t *obj) {
mbed_official 121:7f86b4238bec 255 uart_addrs[obj->index]->CTRL &= ~LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 256 }
mbed_official 121:7f86b4238bec 257
mbed_official 121:7f86b4238bec 258 #endif