mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
178:79309dc6340a
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 178:79309dc6340a 1 /*******************************************************************************
AnnaBridge 178:79309dc6340a 2 * Copyright (c) 2010-2017 Analog Devices, Inc.
AnnaBridge 178:79309dc6340a 3 *
AnnaBridge 178:79309dc6340a 4 * All rights reserved.
AnnaBridge 178:79309dc6340a 5 *
AnnaBridge 178:79309dc6340a 6 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 178:79309dc6340a 7 * are permitted provided that the following conditions are met:
AnnaBridge 178:79309dc6340a 8 * - Redistributions of source code must retain the above copyright notice,
AnnaBridge 178:79309dc6340a 9 * this list of conditions and the following disclaimer.
AnnaBridge 178:79309dc6340a 10 * - Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 178:79309dc6340a 11 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 178:79309dc6340a 12 * and/or other materials provided with the distribution.
AnnaBridge 178:79309dc6340a 13 * - Modified versions of the software must be conspicuously marked as such.
AnnaBridge 178:79309dc6340a 14 * - This software is licensed solely and exclusively for use with processors
AnnaBridge 178:79309dc6340a 15 * manufactured by or for Analog Devices, Inc.
AnnaBridge 178:79309dc6340a 16 * - This software may not be combined or merged with other code in any manner
AnnaBridge 178:79309dc6340a 17 * that would cause the software to become subject to terms and conditions
AnnaBridge 178:79309dc6340a 18 * which differ from those listed here.
AnnaBridge 178:79309dc6340a 19 * - Neither the name of Analog Devices, Inc. nor the names of its
AnnaBridge 178:79309dc6340a 20 * contributors may be used to endorse or promote products derived
AnnaBridge 178:79309dc6340a 21 * from this software without specific prior written permission.
AnnaBridge 178:79309dc6340a 22 * - The use of this software may or may not infringe the patent rights of one
AnnaBridge 178:79309dc6340a 23 * or more patent holders. This license does not release you from the
AnnaBridge 178:79309dc6340a 24 * requirement that you obtain separate licenses from these patent holders
AnnaBridge 178:79309dc6340a 25 * to use this software.
AnnaBridge 178:79309dc6340a 26 *
AnnaBridge 178:79309dc6340a 27 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS"
AnnaBridge 178:79309dc6340a 28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-
AnnaBridge 178:79309dc6340a 29 * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 178:79309dc6340a 30 * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE
AnnaBridge 178:79309dc6340a 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR
AnnaBridge 178:79309dc6340a 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF
AnnaBridge 178:79309dc6340a 33 * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF
AnnaBridge 178:79309dc6340a 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
AnnaBridge 178:79309dc6340a 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
AnnaBridge 178:79309dc6340a 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
AnnaBridge 178:79309dc6340a 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
AnnaBridge 178:79309dc6340a 38 * POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 178:79309dc6340a 39 ******************************************************************************/
AnnaBridge 178:79309dc6340a 40
AnnaBridge 178:79309dc6340a 41 #include "serial_api.h"
AnnaBridge 178:79309dc6340a 42
AnnaBridge 178:79309dc6340a 43 #if DEVICE_SERIAL
AnnaBridge 178:79309dc6340a 44
AnnaBridge 178:79309dc6340a 45 // math.h required for floating point operations for baud rate calculation
AnnaBridge 178:79309dc6340a 46 #include <math.h>
AnnaBridge 178:79309dc6340a 47 #include "mbed_assert.h"
AnnaBridge 178:79309dc6340a 48
AnnaBridge 178:79309dc6340a 49 #include <string.h>
AnnaBridge 178:79309dc6340a 50
AnnaBridge 178:79309dc6340a 51 #include "cmsis.h"
AnnaBridge 178:79309dc6340a 52 #include "pinmap.h"
AnnaBridge 178:79309dc6340a 53 #include "PeripheralPins.h"
AnnaBridge 178:79309dc6340a 54 #include "drivers/uart/adi_uart.h"
AnnaBridge 178:79309dc6340a 55
AnnaBridge 178:79309dc6340a 56 #define ADI_UART_MEMORY_SIZE (ADI_UART_BIDIR_MEMORY_SIZE)
AnnaBridge 178:79309dc6340a 57
AnnaBridge 178:79309dc6340a 58 static ADI_UART_HANDLE hDevice;
AnnaBridge 178:79309dc6340a 59 static uint32_t UartDeviceMem[(ADI_UART_MEMORY_SIZE + 3)/4];
AnnaBridge 178:79309dc6340a 60 static uint32_t serial_irq_ids[2] = {0};
AnnaBridge 178:79309dc6340a 61 static uart_irq_handler irq_handler = NULL;
AnnaBridge 178:79309dc6340a 62 int stdio_uart_inited = 0;
AnnaBridge 178:79309dc6340a 63 serial_t stdio_uart;
AnnaBridge 178:79309dc6340a 64 static int rxbuffer[1];
AnnaBridge 178:79309dc6340a 65 static int txbuffer[1];
AnnaBridge 178:79309dc6340a 66
AnnaBridge 178:79309dc6340a 67 static void uart_callback(void *pCBParam, uint32_t Event, void *pArg)
AnnaBridge 178:79309dc6340a 68 {
AnnaBridge 178:79309dc6340a 69 MBED_ASSERT(irq_handler);
AnnaBridge 178:79309dc6340a 70
AnnaBridge 178:79309dc6340a 71 if (Event == ADI_UART_EVENT_TX_BUFFER_PROCESSED)
AnnaBridge 178:79309dc6340a 72 irq_handler(serial_irq_ids[0], TxIrq);
AnnaBridge 178:79309dc6340a 73 else if (Event == ADI_UART_EVENT_RX_BUFFER_PROCESSED)
AnnaBridge 178:79309dc6340a 74 irq_handler(serial_irq_ids[0], RxIrq);
AnnaBridge 178:79309dc6340a 75 }
AnnaBridge 178:79309dc6340a 76
AnnaBridge 178:79309dc6340a 77
AnnaBridge 178:79309dc6340a 78 void serial_free(serial_t *obj)
AnnaBridge 178:79309dc6340a 79 {
AnnaBridge 178:79309dc6340a 80 adi_uart_Close(hDevice);
AnnaBridge 178:79309dc6340a 81 }
AnnaBridge 178:79309dc6340a 82
AnnaBridge 178:79309dc6340a 83 void serial_baud(serial_t *obj, int baudrate)
AnnaBridge 178:79309dc6340a 84 {
AnnaBridge 178:79309dc6340a 85 uint32_t uartdivc,uartdivm,uartdivn,uartosr;
AnnaBridge 178:79309dc6340a 86 switch (baudrate) {
AnnaBridge 178:79309dc6340a 87 default:
AnnaBridge 178:79309dc6340a 88 case 9600:
AnnaBridge 178:79309dc6340a 89 uartdivc= 22;
AnnaBridge 178:79309dc6340a 90 uartdivm= 3;
AnnaBridge 178:79309dc6340a 91 uartdivn= 1734;
AnnaBridge 178:79309dc6340a 92 uartosr= 3;
AnnaBridge 178:79309dc6340a 93 break;
AnnaBridge 178:79309dc6340a 94 case 19200:
AnnaBridge 178:79309dc6340a 95 uartdivc= 11;
AnnaBridge 178:79309dc6340a 96 uartdivm= 3;
AnnaBridge 178:79309dc6340a 97 uartdivn= 1735;
AnnaBridge 178:79309dc6340a 98 uartosr= 3;
AnnaBridge 178:79309dc6340a 99 break;
AnnaBridge 178:79309dc6340a 100 case 38400:
AnnaBridge 178:79309dc6340a 101 uartdivc= 17;
AnnaBridge 178:79309dc6340a 102 uartdivm= 1;
AnnaBridge 178:79309dc6340a 103 uartdivn= 0501;
AnnaBridge 178:79309dc6340a 104 uartosr= 3;
AnnaBridge 178:79309dc6340a 105 break;
AnnaBridge 178:79309dc6340a 106 case 57600:
AnnaBridge 178:79309dc6340a 107 uartdivc= 07;
AnnaBridge 178:79309dc6340a 108 uartdivm= 2;
AnnaBridge 178:79309dc6340a 109 uartdivn= 0031;
AnnaBridge 178:79309dc6340a 110 uartosr= 3;
AnnaBridge 178:79309dc6340a 111 break;
AnnaBridge 178:79309dc6340a 112 case 115200:
AnnaBridge 178:79309dc6340a 113 uartdivc= 07;
AnnaBridge 178:79309dc6340a 114 uartdivm= 2;
AnnaBridge 178:79309dc6340a 115 uartdivn= 0031;
AnnaBridge 178:79309dc6340a 116 uartosr= 2;
AnnaBridge 178:79309dc6340a 117 break;
AnnaBridge 178:79309dc6340a 118 case 230400:
AnnaBridge 178:79309dc6340a 119 uartdivc= 07;
AnnaBridge 178:79309dc6340a 120 uartdivm= 2;
AnnaBridge 178:79309dc6340a 121 uartdivn= 0031;
AnnaBridge 178:79309dc6340a 122 uartosr= 1;
AnnaBridge 178:79309dc6340a 123 break;
AnnaBridge 178:79309dc6340a 124 case 460800:
AnnaBridge 178:79309dc6340a 125 uartdivc= 07;
AnnaBridge 178:79309dc6340a 126 uartdivm= 2;
AnnaBridge 178:79309dc6340a 127 uartdivn= 0031;
AnnaBridge 178:79309dc6340a 128 uartosr= 0;
AnnaBridge 178:79309dc6340a 129 break;
AnnaBridge 178:79309dc6340a 130 case 921600:
AnnaBridge 178:79309dc6340a 131 uartdivc= 01;
AnnaBridge 178:79309dc6340a 132 uartdivm= 1;
AnnaBridge 178:79309dc6340a 133 uartdivn= 1563;
AnnaBridge 178:79309dc6340a 134 uartosr= 2;
AnnaBridge 178:79309dc6340a 135 break;
AnnaBridge 178:79309dc6340a 136 case 1000000:
AnnaBridge 178:79309dc6340a 137 uartdivc= 01;
AnnaBridge 178:79309dc6340a 138 uartdivm= 1;
AnnaBridge 178:79309dc6340a 139 uartdivn= 1280;
AnnaBridge 178:79309dc6340a 140 uartosr= 2;
AnnaBridge 178:79309dc6340a 141 break;
AnnaBridge 178:79309dc6340a 142 case 1500000:
AnnaBridge 178:79309dc6340a 143 uartdivc= 01;
AnnaBridge 178:79309dc6340a 144 uartdivm= 2;
AnnaBridge 178:79309dc6340a 145 uartdivn= 0341;
AnnaBridge 178:79309dc6340a 146 uartosr= 1;
AnnaBridge 178:79309dc6340a 147 break;
AnnaBridge 178:79309dc6340a 148 case 3000000:
AnnaBridge 178:79309dc6340a 149 uartdivc= 01;
AnnaBridge 178:79309dc6340a 150 uartdivm= 2;
AnnaBridge 178:79309dc6340a 151 uartdivn= 0341;
AnnaBridge 178:79309dc6340a 152 uartosr= 0;
AnnaBridge 178:79309dc6340a 153 break;
AnnaBridge 178:79309dc6340a 154 case 4000000:
AnnaBridge 178:79309dc6340a 155 uartdivc= 01;
AnnaBridge 178:79309dc6340a 156 uartdivm= 1;
AnnaBridge 178:79309dc6340a 157 uartdivn= 1280;
AnnaBridge 178:79309dc6340a 158 uartosr= 0;
AnnaBridge 178:79309dc6340a 159 break;
AnnaBridge 178:79309dc6340a 160 case 5000000:
AnnaBridge 178:79309dc6340a 161 uartdivc= 01;
AnnaBridge 178:79309dc6340a 162 uartdivm= 1;
AnnaBridge 178:79309dc6340a 163 uartdivn= 0614;
AnnaBridge 178:79309dc6340a 164 uartosr= 0;
AnnaBridge 178:79309dc6340a 165 break;
AnnaBridge 178:79309dc6340a 166 case 6000000:
AnnaBridge 178:79309dc6340a 167 uartdivc= 01;
AnnaBridge 178:79309dc6340a 168 uartdivm= 1;
AnnaBridge 178:79309dc6340a 169 uartdivn= 0171;
AnnaBridge 178:79309dc6340a 170 uartosr= 0;
AnnaBridge 178:79309dc6340a 171 break;
AnnaBridge 178:79309dc6340a 172 case 6500000:
AnnaBridge 178:79309dc6340a 173 uartdivc= 01;
AnnaBridge 178:79309dc6340a 174 uartdivm= 1;
AnnaBridge 178:79309dc6340a 175 uartdivn= 0000;
AnnaBridge 178:79309dc6340a 176 uartosr= 0;
AnnaBridge 178:79309dc6340a 177 break;
AnnaBridge 178:79309dc6340a 178 }
AnnaBridge 178:79309dc6340a 179 adi_uart_ConfigBaudRate(hDevice,uartdivc,uartdivm,uartdivn,uartosr);
AnnaBridge 178:79309dc6340a 180 }
AnnaBridge 178:79309dc6340a 181
AnnaBridge 178:79309dc6340a 182 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
AnnaBridge 178:79309dc6340a 183 {
AnnaBridge 178:79309dc6340a 184 int convertedparity = ADI_UART_NO_PARITY;
AnnaBridge 178:79309dc6340a 185 int convertedstopbits = ADI_UART_ONE_STOPBIT;
AnnaBridge 178:79309dc6340a 186
AnnaBridge 178:79309dc6340a 187 if (stop_bits)
AnnaBridge 178:79309dc6340a 188 convertedstopbits = ADI_UART_ONE_AND_HALF_TWO_STOPBITS;
AnnaBridge 178:79309dc6340a 189
AnnaBridge 178:79309dc6340a 190 if (parity == ParityOdd)
AnnaBridge 178:79309dc6340a 191 convertedparity = ADI_UART_ODD_PARITY;
AnnaBridge 178:79309dc6340a 192 else if (parity == ParityEven)
AnnaBridge 178:79309dc6340a 193 convertedparity = ADI_UART_EVEN_PARITY;
AnnaBridge 178:79309dc6340a 194 else if (parity == ParityForced1)
AnnaBridge 178:79309dc6340a 195 convertedparity = ADI_UART_ODD_PARITY_STICKY;
AnnaBridge 178:79309dc6340a 196 else if (parity == ParityForced0)
AnnaBridge 178:79309dc6340a 197 convertedparity = ADI_UART_EVEN_PARITY_STICKY;
AnnaBridge 178:79309dc6340a 198
AnnaBridge 178:79309dc6340a 199 adi_uart_SetConfiguration(hDevice,convertedparity,convertedstopbits, (data_bits - 5));
AnnaBridge 178:79309dc6340a 200 }
AnnaBridge 178:79309dc6340a 201
AnnaBridge 178:79309dc6340a 202 void serial_init(serial_t *obj, PinName tx, PinName rx)
AnnaBridge 178:79309dc6340a 203 {
AnnaBridge 178:79309dc6340a 204 uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
AnnaBridge 178:79309dc6340a 205 uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
AnnaBridge 178:79309dc6340a 206
AnnaBridge 178:79309dc6340a 207 obj->index = pinmap_merge(uart_tx, uart_rx);
AnnaBridge 178:79309dc6340a 208 MBED_ASSERT((int)obj->index != NC);
AnnaBridge 178:79309dc6340a 209
AnnaBridge 178:79309dc6340a 210 adi_uart_Open(0,ADI_UART_DIR_BIDIRECTION,UartDeviceMem,ADI_UART_MEMORY_SIZE,&hDevice);
AnnaBridge 178:79309dc6340a 211
AnnaBridge 178:79309dc6340a 212 serial_baud(obj, 9600);
AnnaBridge 178:79309dc6340a 213 serial_format(obj, 8, ParityNone, 1);
AnnaBridge 178:79309dc6340a 214
AnnaBridge 178:79309dc6340a 215 pinmap_pinout(tx, PinMap_UART_TX);
AnnaBridge 178:79309dc6340a 216 pinmap_pinout(rx, PinMap_UART_RX);
AnnaBridge 178:79309dc6340a 217
AnnaBridge 178:79309dc6340a 218 if (tx != NC) {
AnnaBridge 178:79309dc6340a 219 pin_mode(tx, PullUp);
AnnaBridge 178:79309dc6340a 220 }
AnnaBridge 178:79309dc6340a 221 if (rx != NC) {
AnnaBridge 178:79309dc6340a 222 pin_mode(rx, PullUp);
AnnaBridge 178:79309dc6340a 223 }
AnnaBridge 178:79309dc6340a 224 if (obj->index == STDIO_UART) {
AnnaBridge 178:79309dc6340a 225 stdio_uart_inited = 1;
AnnaBridge 178:79309dc6340a 226 memcpy(&stdio_uart, obj, sizeof(serial_t));
AnnaBridge 178:79309dc6340a 227 }
AnnaBridge 178:79309dc6340a 228 }
AnnaBridge 178:79309dc6340a 229
AnnaBridge 178:79309dc6340a 230 int serial_getc(serial_t *obj)
AnnaBridge 178:79309dc6340a 231 {
AnnaBridge 178:79309dc6340a 232 void *pBuff;
AnnaBridge 178:79309dc6340a 233 uint32_t hw_error;
AnnaBridge 178:79309dc6340a 234
AnnaBridge 178:79309dc6340a 235 adi_uart_SubmitRxBuffer(hDevice, rxbuffer, 1, true);
AnnaBridge 178:79309dc6340a 236 adi_uart_GetRxBuffer(hDevice, &pBuff, &hw_error);
AnnaBridge 178:79309dc6340a 237 return rxbuffer[0];
AnnaBridge 178:79309dc6340a 238 }
AnnaBridge 178:79309dc6340a 239
AnnaBridge 178:79309dc6340a 240 void serial_putc(serial_t *obj, int c)
AnnaBridge 178:79309dc6340a 241 {
AnnaBridge 178:79309dc6340a 242 void *pBuff;
AnnaBridge 178:79309dc6340a 243 uint32_t hw_error;
AnnaBridge 178:79309dc6340a 244
AnnaBridge 178:79309dc6340a 245 txbuffer[0] = c;
AnnaBridge 178:79309dc6340a 246 adi_uart_SubmitTxBuffer(hDevice,txbuffer, 1, true);
AnnaBridge 178:79309dc6340a 247 adi_uart_GetTxBuffer(hDevice, &pBuff, &hw_error);
AnnaBridge 178:79309dc6340a 248 return;
AnnaBridge 178:79309dc6340a 249 }
AnnaBridge 178:79309dc6340a 250
AnnaBridge 178:79309dc6340a 251 int serial_readable(serial_t *obj)
AnnaBridge 178:79309dc6340a 252 {
AnnaBridge 178:79309dc6340a 253 bool bAvailable = false;
AnnaBridge 178:79309dc6340a 254 adi_uart_IsRxBufferAvailable(hDevice, &bAvailable);
AnnaBridge 178:79309dc6340a 255 return bAvailable;
AnnaBridge 178:79309dc6340a 256 }
AnnaBridge 178:79309dc6340a 257
AnnaBridge 178:79309dc6340a 258 int serial_writable(serial_t *obj)
AnnaBridge 178:79309dc6340a 259 {
AnnaBridge 178:79309dc6340a 260 bool bAvailable = false;
AnnaBridge 178:79309dc6340a 261 adi_uart_IsTxBufferAvailable(hDevice, &bAvailable);
AnnaBridge 178:79309dc6340a 262 return bAvailable;
AnnaBridge 178:79309dc6340a 263 }
AnnaBridge 178:79309dc6340a 264
AnnaBridge 178:79309dc6340a 265 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
AnnaBridge 178:79309dc6340a 266 {
AnnaBridge 178:79309dc6340a 267 MBED_ASSERT(obj);
AnnaBridge 178:79309dc6340a 268
AnnaBridge 178:79309dc6340a 269 adi_uart_RegisterCallback(hDevice, &uart_callback, obj);
AnnaBridge 178:79309dc6340a 270 }
AnnaBridge 178:79309dc6340a 271
AnnaBridge 178:79309dc6340a 272 void serial_pinout_tx(PinName tx)
AnnaBridge 178:79309dc6340a 273 {
AnnaBridge 178:79309dc6340a 274 pinmap_pinout(tx, PinMap_UART_TX);
AnnaBridge 178:79309dc6340a 275 }
AnnaBridge 178:79309dc6340a 276
AnnaBridge 178:79309dc6340a 277 void serial_break_set(serial_t *obj)
AnnaBridge 178:79309dc6340a 278 {
AnnaBridge 178:79309dc6340a 279 adi_uart_ForceTxBreak(hDevice, true);
AnnaBridge 178:79309dc6340a 280 }
AnnaBridge 178:79309dc6340a 281
AnnaBridge 178:79309dc6340a 282 void serial_break_clear(serial_t *obj)
AnnaBridge 178:79309dc6340a 283 {
AnnaBridge 178:79309dc6340a 284 adi_uart_ForceTxBreak(hDevice, false);
AnnaBridge 178:79309dc6340a 285 }
AnnaBridge 178:79309dc6340a 286
AnnaBridge 178:79309dc6340a 287 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
AnnaBridge 178:79309dc6340a 288 {
AnnaBridge 178:79309dc6340a 289
AnnaBridge 178:79309dc6340a 290 MBED_ASSERT(obj);
AnnaBridge 178:79309dc6340a 291
AnnaBridge 178:79309dc6340a 292 irq_handler = handler;
AnnaBridge 178:79309dc6340a 293 serial_irq_ids[0] = id;
AnnaBridge 178:79309dc6340a 294 }
AnnaBridge 178:79309dc6340a 295 #endif