Platform drivers for Mbed.
Dependents: EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more
src/uart.cpp@11:a2dcf0ebb5b5, 2020-08-03 (annotated)
- Committer:
- Mahesh Phalke
- Date:
- Mon Aug 03 17:21:20 2020 +0530
- Revision:
- 11:a2dcf0ebb5b5
- Parent:
- 9:9e247b9c9abf
- Child:
- 15:fd2c3c3038bf
Updates to make platform drivers compatible with Mbed-OS 6.0 and onwards
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EndaKilgarriff | 9:9e247b9c9abf | 1 | /***************************************************************************//** |
EndaKilgarriff | 9:9e247b9c9abf | 2 | * @file uart.cpp |
EndaKilgarriff | 9:9e247b9c9abf | 3 | * @brief Implementation of UART No-OS platform driver interfaces |
EndaKilgarriff | 9:9e247b9c9abf | 4 | ******************************************************************************** |
EndaKilgarriff | 9:9e247b9c9abf | 5 | * Copyright (c) 2020 Analog Devices, Inc. |
EndaKilgarriff | 9:9e247b9c9abf | 6 | * |
EndaKilgarriff | 9:9e247b9c9abf | 7 | * All rights reserved. |
EndaKilgarriff | 9:9e247b9c9abf | 8 | * |
EndaKilgarriff | 9:9e247b9c9abf | 9 | * This software is proprietary to Analog Devices, Inc. and its licensors. |
EndaKilgarriff | 9:9e247b9c9abf | 10 | * By using this software you agree to the terms of the associated |
EndaKilgarriff | 9:9e247b9c9abf | 11 | * Analog Devices Software License Agreement. |
EndaKilgarriff | 9:9e247b9c9abf | 12 | *******************************************************************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 13 | |
EndaKilgarriff | 9:9e247b9c9abf | 14 | /******************************************************************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 15 | /***************************** Include Files **********************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 16 | /******************************************************************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 17 | #include <stdio.h> |
EndaKilgarriff | 9:9e247b9c9abf | 18 | #include <mbed.h> |
EndaKilgarriff | 9:9e247b9c9abf | 19 | |
EndaKilgarriff | 9:9e247b9c9abf | 20 | #include "platform_drivers.h" |
EndaKilgarriff | 9:9e247b9c9abf | 21 | #include "uart_extra.h" |
EndaKilgarriff | 9:9e247b9c9abf | 22 | |
EndaKilgarriff | 9:9e247b9c9abf | 23 | /******************************************************************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 24 | /************************ Functions Definitions *******************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 25 | /******************************************************************************/ |
EndaKilgarriff | 9:9e247b9c9abf | 26 | |
EndaKilgarriff | 9:9e247b9c9abf | 27 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 28 | * @brief Read data from UART device. |
EndaKilgarriff | 9:9e247b9c9abf | 29 | * @param desc - Instance of UART. |
EndaKilgarriff | 9:9e247b9c9abf | 30 | * @param data - Pointer to buffer containing data. |
EndaKilgarriff | 9:9e247b9c9abf | 31 | * @param bytes_number - Number of bytes to read. |
EndaKilgarriff | 9:9e247b9c9abf | 32 | * @return SUCCESS in case of success, FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 33 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 34 | int32_t uart_read(struct uart_desc *desc, uint8_t *data, uint32_t bytes_number) |
EndaKilgarriff | 9:9e247b9c9abf | 35 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 36 | mbed::UnbufferedSerial *uart; // pointer to UnbufferedSerial/UART instance |
EndaKilgarriff | 9:9e247b9c9abf | 37 | |
EndaKilgarriff | 9:9e247b9c9abf | 38 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 39 | if (((mbed_uart_desc *)(desc->extra))->uart_port) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 40 | uart = (UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port); |
EndaKilgarriff | 9:9e247b9c9abf | 41 | |
EndaKilgarriff | 9:9e247b9c9abf | 42 | if (data) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 43 | uart->read(data, bytes_number); |
EndaKilgarriff | 9:9e247b9c9abf | 44 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 45 | } |
EndaKilgarriff | 9:9e247b9c9abf | 46 | } |
EndaKilgarriff | 9:9e247b9c9abf | 47 | } |
EndaKilgarriff | 9:9e247b9c9abf | 48 | |
EndaKilgarriff | 9:9e247b9c9abf | 49 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 50 | } |
EndaKilgarriff | 9:9e247b9c9abf | 51 | |
EndaKilgarriff | 9:9e247b9c9abf | 52 | |
EndaKilgarriff | 9:9e247b9c9abf | 53 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 54 | * @brief Write data to UART device. |
EndaKilgarriff | 9:9e247b9c9abf | 55 | * @param desc - Instance of UART. |
EndaKilgarriff | 9:9e247b9c9abf | 56 | * @param data - Pointer to buffer containing data. |
EndaKilgarriff | 9:9e247b9c9abf | 57 | * @param bytes_number - Number of bytes to read. |
EndaKilgarriff | 9:9e247b9c9abf | 58 | * @return SUCCESS in case of success, FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 59 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 60 | int32_t uart_write(struct uart_desc *desc, const uint8_t *data, |
EndaKilgarriff | 9:9e247b9c9abf | 61 | uint32_t bytes_number) |
EndaKilgarriff | 9:9e247b9c9abf | 62 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 63 | mbed::UnbufferedSerial *uart; // pointer to UnbufferedSerial/UART instance |
EndaKilgarriff | 9:9e247b9c9abf | 64 | |
EndaKilgarriff | 9:9e247b9c9abf | 65 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 66 | if (((mbed_uart_desc *)(desc->extra))->uart_port) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 67 | uart = (UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port); |
EndaKilgarriff | 9:9e247b9c9abf | 68 | |
EndaKilgarriff | 9:9e247b9c9abf | 69 | if (data) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 70 | uart->write(data, bytes_number); |
EndaKilgarriff | 9:9e247b9c9abf | 71 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 72 | } |
EndaKilgarriff | 9:9e247b9c9abf | 73 | } |
EndaKilgarriff | 9:9e247b9c9abf | 74 | } |
EndaKilgarriff | 9:9e247b9c9abf | 75 | |
EndaKilgarriff | 9:9e247b9c9abf | 76 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 77 | } |
EndaKilgarriff | 9:9e247b9c9abf | 78 | |
EndaKilgarriff | 9:9e247b9c9abf | 79 | |
EndaKilgarriff | 9:9e247b9c9abf | 80 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 81 | * @brief Submit reading buffer to the UART driver. |
EndaKilgarriff | 9:9e247b9c9abf | 82 | * |
EndaKilgarriff | 9:9e247b9c9abf | 83 | * Buffer is used until bytes_number bytes are read. |
EndaKilgarriff | 9:9e247b9c9abf | 84 | * @param desc: Descriptor of the UART device |
EndaKilgarriff | 9:9e247b9c9abf | 85 | * @param data: Buffer where data will be read |
EndaKilgarriff | 9:9e247b9c9abf | 86 | * @param bytes_number: Number of bytes to be read. |
EndaKilgarriff | 9:9e247b9c9abf | 87 | * @return \ref SUCCESS in case of success, \ref FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 88 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 89 | int32_t uart_read_nonblocking(struct uart_desc *desc, |
EndaKilgarriff | 9:9e247b9c9abf | 90 | uint8_t *data, |
EndaKilgarriff | 9:9e247b9c9abf | 91 | uint32_t bytes_number) |
EndaKilgarriff | 9:9e247b9c9abf | 92 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 93 | mbed::UnbufferedSerial *uart; // pointer to UnbufferedSerial/UART instance |
EndaKilgarriff | 9:9e247b9c9abf | 94 | |
EndaKilgarriff | 9:9e247b9c9abf | 95 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 96 | if (((mbed_uart_desc *)(desc->extra))->uart_port) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 97 | uart = (UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port); |
EndaKilgarriff | 9:9e247b9c9abf | 98 | |
EndaKilgarriff | 9:9e247b9c9abf | 99 | if (data) { |
EndaKilgarriff | 9:9e247b9c9abf | 100 | for (size_t i = 0; i < bytes_number; i++) { |
EndaKilgarriff | 9:9e247b9c9abf | 101 | if (uart->readable() > 0) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 102 | uart->read(&data[i], 1); |
EndaKilgarriff | 9:9e247b9c9abf | 103 | } |
EndaKilgarriff | 9:9e247b9c9abf | 104 | } |
EndaKilgarriff | 9:9e247b9c9abf | 105 | |
EndaKilgarriff | 9:9e247b9c9abf | 106 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 107 | } |
EndaKilgarriff | 9:9e247b9c9abf | 108 | } |
EndaKilgarriff | 9:9e247b9c9abf | 109 | } |
EndaKilgarriff | 9:9e247b9c9abf | 110 | |
EndaKilgarriff | 9:9e247b9c9abf | 111 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 112 | } |
EndaKilgarriff | 9:9e247b9c9abf | 113 | |
EndaKilgarriff | 9:9e247b9c9abf | 114 | |
EndaKilgarriff | 9:9e247b9c9abf | 115 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 116 | * @brief Submit writting buffer to the UART driver. |
EndaKilgarriff | 9:9e247b9c9abf | 117 | * |
EndaKilgarriff | 9:9e247b9c9abf | 118 | * Data from the buffer is sent over the UART, the function returns imediatly. |
EndaKilgarriff | 9:9e247b9c9abf | 119 | * @param desc: Descriptor of the UART device |
EndaKilgarriff | 9:9e247b9c9abf | 120 | * @param data: Buffer where data will be written |
EndaKilgarriff | 9:9e247b9c9abf | 121 | * @param bytes_number: Number of bytes to be written. |
EndaKilgarriff | 9:9e247b9c9abf | 122 | * @return \ref SUCCESS in case of success, \ref FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 123 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 124 | int32_t uart_write_nonblocking(struct uart_desc *desc, |
EndaKilgarriff | 9:9e247b9c9abf | 125 | const uint8_t *data, |
EndaKilgarriff | 9:9e247b9c9abf | 126 | uint32_t bytes_number) |
EndaKilgarriff | 9:9e247b9c9abf | 127 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 128 | mbed::UnbufferedSerial *uart; // pointer to UnbufferedSerial/UART instance |
EndaKilgarriff | 9:9e247b9c9abf | 129 | |
EndaKilgarriff | 9:9e247b9c9abf | 130 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 131 | if (((mbed_uart_desc *)(desc->extra))->uart_port) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 132 | uart = (UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port); |
EndaKilgarriff | 9:9e247b9c9abf | 133 | |
EndaKilgarriff | 9:9e247b9c9abf | 134 | if (data) { |
EndaKilgarriff | 9:9e247b9c9abf | 135 | for (size_t i = 0; i < bytes_number; i++) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 136 | if (uart->writeable() > 0) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 137 | uart->write(&data[i], 1); |
EndaKilgarriff | 9:9e247b9c9abf | 138 | } |
EndaKilgarriff | 9:9e247b9c9abf | 139 | } |
EndaKilgarriff | 9:9e247b9c9abf | 140 | |
EndaKilgarriff | 9:9e247b9c9abf | 141 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 142 | } |
EndaKilgarriff | 9:9e247b9c9abf | 143 | } |
EndaKilgarriff | 9:9e247b9c9abf | 144 | } |
EndaKilgarriff | 9:9e247b9c9abf | 145 | |
EndaKilgarriff | 9:9e247b9c9abf | 146 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 147 | } |
EndaKilgarriff | 9:9e247b9c9abf | 148 | |
EndaKilgarriff | 9:9e247b9c9abf | 149 | |
EndaKilgarriff | 9:9e247b9c9abf | 150 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 151 | * @brief Initialize the UART communication peripheral. |
EndaKilgarriff | 9:9e247b9c9abf | 152 | * @param desc - The UART descriptor. |
EndaKilgarriff | 9:9e247b9c9abf | 153 | * @param param - The structure that contains the UART parameters. |
EndaKilgarriff | 9:9e247b9c9abf | 154 | * @return SUCCESS in case of success, FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 155 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 156 | int32_t uart_init(struct uart_desc **desc, struct uart_init_param *param) |
EndaKilgarriff | 9:9e247b9c9abf | 157 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 158 | mbed::UnbufferedSerial *uart; // pointer to new UnbufferedSerial/UART instance |
EndaKilgarriff | 9:9e247b9c9abf | 159 | mbed_uart_desc *mbed_desc; // Pointer to mbed uart descriptor |
EndaKilgarriff | 9:9e247b9c9abf | 160 | |
EndaKilgarriff | 9:9e247b9c9abf | 161 | if (desc && param) { |
EndaKilgarriff | 9:9e247b9c9abf | 162 | // Create the UART description object for the device |
EndaKilgarriff | 9:9e247b9c9abf | 163 | uart_desc *new_desc = (uart_desc *)malloc(sizeof(uart_desc)); |
EndaKilgarriff | 9:9e247b9c9abf | 164 | if (new_desc == NULL) { |
EndaKilgarriff | 9:9e247b9c9abf | 165 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 166 | } |
EndaKilgarriff | 9:9e247b9c9abf | 167 | |
EndaKilgarriff | 9:9e247b9c9abf | 168 | new_desc->baud_rate = param->baud_rate; |
EndaKilgarriff | 9:9e247b9c9abf | 169 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 170 | // Create and configure a new instance of UnbufferedSerial/UART port |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 171 | uart = new UnbufferedSerial( |
EndaKilgarriff | 9:9e247b9c9abf | 172 | (PinName)(((mbed_uart_init_param *)param->extra)->uart_tx_pin), |
EndaKilgarriff | 9:9e247b9c9abf | 173 | (PinName)(((mbed_uart_init_param *)param->extra)->uart_rx_pin), |
EndaKilgarriff | 9:9e247b9c9abf | 174 | (int)param->baud_rate); |
EndaKilgarriff | 9:9e247b9c9abf | 175 | |
EndaKilgarriff | 9:9e247b9c9abf | 176 | if (uart == NULL) { |
EndaKilgarriff | 9:9e247b9c9abf | 177 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 178 | } |
EndaKilgarriff | 9:9e247b9c9abf | 179 | |
EndaKilgarriff | 9:9e247b9c9abf | 180 | // Create a new mbed descriptor to store new UART instances |
EndaKilgarriff | 9:9e247b9c9abf | 181 | mbed_desc = (mbed_uart_desc *)malloc(sizeof(mbed_uart_desc)); |
EndaKilgarriff | 9:9e247b9c9abf | 182 | if (mbed_desc == NULL) { |
EndaKilgarriff | 9:9e247b9c9abf | 183 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 184 | } |
EndaKilgarriff | 9:9e247b9c9abf | 185 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 186 | mbed_desc->uart_port = (UnbufferedSerial *)uart; |
EndaKilgarriff | 9:9e247b9c9abf | 187 | new_desc->extra = (mbed_uart_desc *)mbed_desc; |
EndaKilgarriff | 9:9e247b9c9abf | 188 | |
EndaKilgarriff | 9:9e247b9c9abf | 189 | *desc = new_desc; |
EndaKilgarriff | 9:9e247b9c9abf | 190 | |
EndaKilgarriff | 9:9e247b9c9abf | 191 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 192 | } |
EndaKilgarriff | 9:9e247b9c9abf | 193 | |
EndaKilgarriff | 9:9e247b9c9abf | 194 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 195 | } |
EndaKilgarriff | 9:9e247b9c9abf | 196 | |
EndaKilgarriff | 9:9e247b9c9abf | 197 | |
EndaKilgarriff | 9:9e247b9c9abf | 198 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 199 | * @brief Free the resources allocated by uart_init(). |
EndaKilgarriff | 9:9e247b9c9abf | 200 | * @param desc - The UART descriptor. |
EndaKilgarriff | 9:9e247b9c9abf | 201 | * @return SUCCESS in case of success, FAILURE otherwise. |
EndaKilgarriff | 9:9e247b9c9abf | 202 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 203 | int32_t uart_remove(struct uart_desc *desc) |
EndaKilgarriff | 9:9e247b9c9abf | 204 | { |
EndaKilgarriff | 9:9e247b9c9abf | 205 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 206 | // Free the UART port object |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 207 | if ((UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port)) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 208 | delete((UnbufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port)); |
EndaKilgarriff | 9:9e247b9c9abf | 209 | } |
EndaKilgarriff | 9:9e247b9c9abf | 210 | |
EndaKilgarriff | 9:9e247b9c9abf | 211 | // Free the UART extra descriptor object |
EndaKilgarriff | 9:9e247b9c9abf | 212 | if ((mbed_uart_desc *)(desc->extra)) { |
EndaKilgarriff | 9:9e247b9c9abf | 213 | free((mbed_uart_desc *)(desc->extra)); |
EndaKilgarriff | 9:9e247b9c9abf | 214 | } |
EndaKilgarriff | 9:9e247b9c9abf | 215 | |
EndaKilgarriff | 9:9e247b9c9abf | 216 | // Free the UART descriptor object |
EndaKilgarriff | 9:9e247b9c9abf | 217 | free(desc); |
EndaKilgarriff | 9:9e247b9c9abf | 218 | |
EndaKilgarriff | 9:9e247b9c9abf | 219 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 220 | } |
EndaKilgarriff | 9:9e247b9c9abf | 221 | |
EndaKilgarriff | 9:9e247b9c9abf | 222 | return FAILURE; |
EndaKilgarriff | 9:9e247b9c9abf | 223 | } |
EndaKilgarriff | 9:9e247b9c9abf | 224 | |
EndaKilgarriff | 9:9e247b9c9abf | 225 | |
EndaKilgarriff | 9:9e247b9c9abf | 226 | /** |
EndaKilgarriff | 9:9e247b9c9abf | 227 | * @brief Get number of UART errors. |
EndaKilgarriff | 9:9e247b9c9abf | 228 | * @param desc - The UART descriptor. |
EndaKilgarriff | 9:9e247b9c9abf | 229 | * @return number of errors. |
EndaKilgarriff | 9:9e247b9c9abf | 230 | */ |
EndaKilgarriff | 9:9e247b9c9abf | 231 | uint32_t uart_get_errors(struct uart_desc *desc) |
EndaKilgarriff | 9:9e247b9c9abf | 232 | { |
EndaKilgarriff | 9:9e247b9c9abf | 233 | if (desc) { |
EndaKilgarriff | 9:9e247b9c9abf | 234 | // Unused variable - fix compiler warning |
EndaKilgarriff | 9:9e247b9c9abf | 235 | } |
EndaKilgarriff | 9:9e247b9c9abf | 236 | |
EndaKilgarriff | 9:9e247b9c9abf | 237 | return SUCCESS; |
EndaKilgarriff | 9:9e247b9c9abf | 238 | } |