Platform drivers for Mbed.

Dependents:   EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more

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?

UserRevisionLine numberNew 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 }