Platform drivers for Mbed.

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

Committer:
mahphalke
Date:
Fri Mar 19 12:10:16 2021 +0530
Revision:
16:61ad39564f45
Parent:
15:fd2c3c3038bf
Added uart changes

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>
mahphalke 15:fd2c3c3038bf 19 #include <USBCDC.h>
EndaKilgarriff 9:9e247b9c9abf 20
EndaKilgarriff 9:9e247b9c9abf 21 #include "platform_drivers.h"
EndaKilgarriff 9:9e247b9c9abf 22 #include "uart_extra.h"
EndaKilgarriff 9:9e247b9c9abf 23
EndaKilgarriff 9:9e247b9c9abf 24 /******************************************************************************/
mahphalke 15:fd2c3c3038bf 25 /************************ Macros/Constants ************************************/
mahphalke 15:fd2c3c3038bf 26 /******************************************************************************/
mahphalke 15:fd2c3c3038bf 27
mahphalke 15:fd2c3c3038bf 28 /* Max size for USB CDC packet during transmit/receive */
mahphalke 15:fd2c3c3038bf 29 #define USB_CDC_MAX_PACKET_SIZE 64
mahphalke 15:fd2c3c3038bf 30
mahphalke 15:fd2c3c3038bf 31 /******************************************************************************/
mahphalke 15:fd2c3c3038bf 32 /*************************** Types Declarations *******************************/
mahphalke 15:fd2c3c3038bf 33 /******************************************************************************/
mahphalke 15:fd2c3c3038bf 34
mahphalke 15:fd2c3c3038bf 35 /* Derived USBCDC class to access protected members of USBCDC class */
mahphalke 15:fd2c3c3038bf 36 class platform_usbcdc :public USBCDC
mahphalke 15:fd2c3c3038bf 37 {
mahphalke 15:fd2c3c3038bf 38 public:
mahphalke 15:fd2c3c3038bf 39 /* Call parent class (USBCDC) constructor explicitly */
mahphalke 15:fd2c3c3038bf 40 platform_usbcdc(bool connect_blocking, uint16_t vendor_id, uint16_t product_id,
mahphalke 15:fd2c3c3038bf 41 uint16_t product_release)
mahphalke 15:fd2c3c3038bf 42 : USBCDC(connect_blocking, vendor_id, product_id, product_release)
mahphalke 15:fd2c3c3038bf 43 {
mahphalke 15:fd2c3c3038bf 44
mahphalke 15:fd2c3c3038bf 45 }
mahphalke 15:fd2c3c3038bf 46
mahphalke 15:fd2c3c3038bf 47 public:
mahphalke 15:fd2c3c3038bf 48 void change_terminal_connected(bool connected);
mahphalke 15:fd2c3c3038bf 49 bool data_available(uint32_t rx_size);
mahphalke 15:fd2c3c3038bf 50 bool data_transmited(void);
mahphalke 15:fd2c3c3038bf 51 };
mahphalke 15:fd2c3c3038bf 52
mahphalke 15:fd2c3c3038bf 53 /******************************************************************************/
EndaKilgarriff 9:9e247b9c9abf 54 /************************ Functions Definitions *******************************/
EndaKilgarriff 9:9e247b9c9abf 55 /******************************************************************************/
EndaKilgarriff 9:9e247b9c9abf 56
EndaKilgarriff 9:9e247b9c9abf 57 /**
mahphalke 15:fd2c3c3038bf 58 * @brief Change the terminal connection status (for non-terminal) based USB interface
mahphalke 15:fd2c3c3038bf 59 * @param status- new connection status
mahphalke 15:fd2c3c3038bf 60 * @note This functions is used to change the terminal connection status of USB client
mahphalke 15:fd2c3c3038bf 61 * interface which is different than the 'console terminal'. The console terminals acknowledge
mahphalke 15:fd2c3c3038bf 62 * back to USB host when USB connection is opened on the console terminal and Mbed USBCDC
mahphalke 15:fd2c3c3038bf 63 * class automatically changes the '_terminal_connected' status accordingly. However, for
mahphalke 15:fd2c3c3038bf 64 * custom PC applications (non terminal), the terminal connection status needs to be changed
mahphalke 15:fd2c3c3038bf 65 * manually. The '_terminal_connected' is protected member of USBCDC parent class and thus can
mahphalke 15:fd2c3c3038bf 66 * be accessed through 'platform_usbcdc' derived class using below function.
mahphalke 15:fd2c3c3038bf 67 */
mahphalke 15:fd2c3c3038bf 68 void platform_usbcdc::change_terminal_connected(bool status)
mahphalke 15:fd2c3c3038bf 69 {
mahphalke 15:fd2c3c3038bf 70 _terminal_connected = status;
mahphalke 15:fd2c3c3038bf 71 }
mahphalke 15:fd2c3c3038bf 72
mahphalke 15:fd2c3c3038bf 73
mahphalke 15:fd2c3c3038bf 74 /**
mahphalke 15:fd2c3c3038bf 75 * @brief Check if new USB data is available
mahphalke 15:fd2c3c3038bf 76 * @return true if new data available, else false
mahphalke 15:fd2c3c3038bf 77 */
mahphalke 15:fd2c3c3038bf 78 bool platform_usbcdc::data_available(uint32_t rx_size)
mahphalke 15:fd2c3c3038bf 79 {
mahphalke 15:fd2c3c3038bf 80 uint32_t size = 0;
mahphalke 15:fd2c3c3038bf 81
mahphalke 15:fd2c3c3038bf 82 if (!_rx_in_progress) {
mahphalke 15:fd2c3c3038bf 83 size = _rx_size > 0xFF ? 0xFF : _rx_size;
mahphalke 15:fd2c3c3038bf 84 }
mahphalke 15:fd2c3c3038bf 85
mahphalke 15:fd2c3c3038bf 86 if (size >= rx_size)
mahphalke 15:fd2c3c3038bf 87 return true;
mahphalke 15:fd2c3c3038bf 88 else
mahphalke 15:fd2c3c3038bf 89 return false;
mahphalke 15:fd2c3c3038bf 90 }
mahphalke 15:fd2c3c3038bf 91
mahphalke 15:fd2c3c3038bf 92
mahphalke 15:fd2c3c3038bf 93 /**
mahphalke 15:fd2c3c3038bf 94 * @brief Check if old USB data is transmitted
mahphalke 15:fd2c3c3038bf 95 * @return true if transmit not in progress, else false
mahphalke 15:fd2c3c3038bf 96 */
mahphalke 15:fd2c3c3038bf 97 bool platform_usbcdc::data_transmited(void)
mahphalke 15:fd2c3c3038bf 98 {
mahphalke 15:fd2c3c3038bf 99 if (_tx_in_progress)
mahphalke 15:fd2c3c3038bf 100 return false;
mahphalke 15:fd2c3c3038bf 101 else
mahphalke 15:fd2c3c3038bf 102 return true;
mahphalke 15:fd2c3c3038bf 103 }
mahphalke 15:fd2c3c3038bf 104
mahphalke 15:fd2c3c3038bf 105
mahphalke 15:fd2c3c3038bf 106 /**
EndaKilgarriff 9:9e247b9c9abf 107 * @brief Read data from UART device.
EndaKilgarriff 9:9e247b9c9abf 108 * @param desc - Instance of UART.
EndaKilgarriff 9:9e247b9c9abf 109 * @param data - Pointer to buffer containing data.
EndaKilgarriff 9:9e247b9c9abf 110 * @param bytes_number - Number of bytes to read.
EndaKilgarriff 9:9e247b9c9abf 111 * @return SUCCESS in case of success, FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 112 */
EndaKilgarriff 9:9e247b9c9abf 113 int32_t uart_read(struct uart_desc *desc, uint8_t *data, uint32_t bytes_number)
EndaKilgarriff 9:9e247b9c9abf 114 {
mahphalke 15:fd2c3c3038bf 115 uint8_t cnt;
mahphalke 15:fd2c3c3038bf 116 mbed::BufferedSerial *uart; // pointer to BufferedSerial/UART instance
mahphalke 15:fd2c3c3038bf 117 platform_usbcdc *usb_cdc_dev; // Pointer to usb cdc device class instance
mahphalke 15:fd2c3c3038bf 118 uint32_t size_rd;
EndaKilgarriff 9:9e247b9c9abf 119
mahphalke 15:fd2c3c3038bf 120 if (desc && data) {
EndaKilgarriff 9:9e247b9c9abf 121 if (((mbed_uart_desc *)(desc->extra))->uart_port) {
mahphalke 15:fd2c3c3038bf 122 if (((mbed_uart_desc *)desc->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 123 usb_cdc_dev = (platform_usbcdc *)((mbed_uart_desc *)(
mahphalke 15:fd2c3c3038bf 124 desc->extra))->uart_port;
mahphalke 15:fd2c3c3038bf 125
mahphalke 15:fd2c3c3038bf 126 while (!usb_cdc_dev->data_available(bytes_number)) {
mahphalke 15:fd2c3c3038bf 127 /* Wait until new data is available */
mahphalke 15:fd2c3c3038bf 128 }
mahphalke 15:fd2c3c3038bf 129
mahphalke 15:fd2c3c3038bf 130 /* Change terminal connection status manually */
mahphalke 15:fd2c3c3038bf 131 usb_cdc_dev->change_terminal_connected(true);
EndaKilgarriff 9:9e247b9c9abf 132
mahphalke 15:fd2c3c3038bf 133 usb_cdc_dev->receive_nb(data, bytes_number, &size_rd);
mahphalke 15:fd2c3c3038bf 134 } else {
mahphalke 15:fd2c3c3038bf 135 uart = (BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port);
mahphalke 15:fd2c3c3038bf 136
mahphalke 15:fd2c3c3038bf 137 for (cnt = 0; cnt < bytes_number; cnt++) {
mahphalke 15:fd2c3c3038bf 138 uart->read(data + cnt, 1);
mahphalke 15:fd2c3c3038bf 139 }
EndaKilgarriff 9:9e247b9c9abf 140 }
mahphalke 15:fd2c3c3038bf 141
mahphalke 15:fd2c3c3038bf 142 return bytes_number;
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 Write data to UART device.
EndaKilgarriff 9:9e247b9c9abf 152 * @param desc - Instance of UART.
EndaKilgarriff 9:9e247b9c9abf 153 * @param data - Pointer to buffer containing data.
EndaKilgarriff 9:9e247b9c9abf 154 * @param bytes_number - Number of bytes to read.
EndaKilgarriff 9:9e247b9c9abf 155 * @return SUCCESS in case of success, FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 156 */
EndaKilgarriff 9:9e247b9c9abf 157 int32_t uart_write(struct uart_desc *desc, const uint8_t *data,
EndaKilgarriff 9:9e247b9c9abf 158 uint32_t bytes_number)
EndaKilgarriff 9:9e247b9c9abf 159 {
mahphalke 15:fd2c3c3038bf 160 mbed::BufferedSerial *uart; // pointer to BufferedSerial/UART instance
mahphalke 15:fd2c3c3038bf 161 platform_usbcdc *usb_cdc_dev; // Pointer to usb cdc device class instance
mahphalke 15:fd2c3c3038bf 162 uint32_t d_sz;
mahphalke 15:fd2c3c3038bf 163 uint32_t indx = 0;
EndaKilgarriff 9:9e247b9c9abf 164
mahphalke 15:fd2c3c3038bf 165 if (desc && data) {
EndaKilgarriff 9:9e247b9c9abf 166 if (((mbed_uart_desc *)(desc->extra))->uart_port) {
mahphalke 15:fd2c3c3038bf 167 if (((mbed_uart_desc *)desc->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 168 usb_cdc_dev = (platform_usbcdc *)((mbed_uart_desc *)(
mahphalke 15:fd2c3c3038bf 169 desc->extra))->uart_port;
mahphalke 15:fd2c3c3038bf 170
mahphalke 15:fd2c3c3038bf 171 while (bytes_number) {
mahphalke 15:fd2c3c3038bf 172 while (!usb_cdc_dev->data_transmited()) {
mahphalke 15:fd2c3c3038bf 173 /* Wait until old data is transmitted */
mahphalke 15:fd2c3c3038bf 174 }
mahphalke 15:fd2c3c3038bf 175
mahphalke 15:fd2c3c3038bf 176 /* Make sure packet size is less than max CDC packet size during data transmit */
mahphalke 15:fd2c3c3038bf 177 d_sz = (bytes_number > (USB_CDC_MAX_PACKET_SIZE - 1)) ?
mahphalke 15:fd2c3c3038bf 178 (USB_CDC_MAX_PACKET_SIZE - 1) :
mahphalke 15:fd2c3c3038bf 179 bytes_number;
EndaKilgarriff 9:9e247b9c9abf 180
mahphalke 15:fd2c3c3038bf 181 /* Change terminal connection status manually */
mahphalke 15:fd2c3c3038bf 182 usb_cdc_dev->change_terminal_connected(true);
mahphalke 15:fd2c3c3038bf 183
mahphalke 15:fd2c3c3038bf 184 usb_cdc_dev->send_nb((uint8_t *)&data[indx], d_sz, &d_sz);
mahphalke 15:fd2c3c3038bf 185
mahphalke 15:fd2c3c3038bf 186 bytes_number -= d_sz;
mahphalke 15:fd2c3c3038bf 187 indx += d_sz;
mahphalke 15:fd2c3c3038bf 188 }
mahphalke 15:fd2c3c3038bf 189
mahphalke 15:fd2c3c3038bf 190 return bytes_number;
mahphalke 15:fd2c3c3038bf 191 } else {
mahphalke 15:fd2c3c3038bf 192 uart = (BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port);
mahphalke 15:fd2c3c3038bf 193 return uart->write(data, bytes_number);
EndaKilgarriff 9:9e247b9c9abf 194 }
EndaKilgarriff 9:9e247b9c9abf 195 }
EndaKilgarriff 9:9e247b9c9abf 196 }
EndaKilgarriff 9:9e247b9c9abf 197
EndaKilgarriff 9:9e247b9c9abf 198 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 199 }
EndaKilgarriff 9:9e247b9c9abf 200
EndaKilgarriff 9:9e247b9c9abf 201
EndaKilgarriff 9:9e247b9c9abf 202 /**
EndaKilgarriff 9:9e247b9c9abf 203 * @brief Submit reading buffer to the UART driver.
EndaKilgarriff 9:9e247b9c9abf 204 *
EndaKilgarriff 9:9e247b9c9abf 205 * Buffer is used until bytes_number bytes are read.
EndaKilgarriff 9:9e247b9c9abf 206 * @param desc: Descriptor of the UART device
EndaKilgarriff 9:9e247b9c9abf 207 * @param data: Buffer where data will be read
EndaKilgarriff 9:9e247b9c9abf 208 * @param bytes_number: Number of bytes to be read.
EndaKilgarriff 9:9e247b9c9abf 209 * @return \ref SUCCESS in case of success, \ref FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 210 */
EndaKilgarriff 9:9e247b9c9abf 211 int32_t uart_read_nonblocking(struct uart_desc *desc,
EndaKilgarriff 9:9e247b9c9abf 212 uint8_t *data,
EndaKilgarriff 9:9e247b9c9abf 213 uint32_t bytes_number)
EndaKilgarriff 9:9e247b9c9abf 214 {
mahphalke 15:fd2c3c3038bf 215 mbed::BufferedSerial *uart; // pointer to BufferedSerial/UART instance
EndaKilgarriff 9:9e247b9c9abf 216
EndaKilgarriff 9:9e247b9c9abf 217 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 218 if (((mbed_uart_desc *)(desc->extra))->uart_port) {
mahphalke 15:fd2c3c3038bf 219 uart = (BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port);
EndaKilgarriff 9:9e247b9c9abf 220
EndaKilgarriff 9:9e247b9c9abf 221 if (data) {
EndaKilgarriff 9:9e247b9c9abf 222 for (size_t i = 0; i < bytes_number; i++) {
EndaKilgarriff 9:9e247b9c9abf 223 if (uart->readable() > 0) {
Mahesh Phalke 11:a2dcf0ebb5b5 224 uart->read(&data[i], 1);
EndaKilgarriff 9:9e247b9c9abf 225 }
EndaKilgarriff 9:9e247b9c9abf 226 }
EndaKilgarriff 9:9e247b9c9abf 227
mahphalke 15:fd2c3c3038bf 228 return bytes_number;
EndaKilgarriff 9:9e247b9c9abf 229 }
EndaKilgarriff 9:9e247b9c9abf 230 }
EndaKilgarriff 9:9e247b9c9abf 231 }
EndaKilgarriff 9:9e247b9c9abf 232
EndaKilgarriff 9:9e247b9c9abf 233 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 234 }
EndaKilgarriff 9:9e247b9c9abf 235
EndaKilgarriff 9:9e247b9c9abf 236
EndaKilgarriff 9:9e247b9c9abf 237 /**
EndaKilgarriff 9:9e247b9c9abf 238 * @brief Submit writting buffer to the UART driver.
EndaKilgarriff 9:9e247b9c9abf 239 *
EndaKilgarriff 9:9e247b9c9abf 240 * Data from the buffer is sent over the UART, the function returns imediatly.
EndaKilgarriff 9:9e247b9c9abf 241 * @param desc: Descriptor of the UART device
EndaKilgarriff 9:9e247b9c9abf 242 * @param data: Buffer where data will be written
EndaKilgarriff 9:9e247b9c9abf 243 * @param bytes_number: Number of bytes to be written.
EndaKilgarriff 9:9e247b9c9abf 244 * @return \ref SUCCESS in case of success, \ref FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 245 */
EndaKilgarriff 9:9e247b9c9abf 246 int32_t uart_write_nonblocking(struct uart_desc *desc,
EndaKilgarriff 9:9e247b9c9abf 247 const uint8_t *data,
EndaKilgarriff 9:9e247b9c9abf 248 uint32_t bytes_number)
EndaKilgarriff 9:9e247b9c9abf 249 {
mahphalke 15:fd2c3c3038bf 250 mbed::BufferedSerial *uart; // pointer to BufferedSerial/UART instance
EndaKilgarriff 9:9e247b9c9abf 251
EndaKilgarriff 9:9e247b9c9abf 252 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 253 if (((mbed_uart_desc *)(desc->extra))->uart_port) {
mahphalke 15:fd2c3c3038bf 254 uart = (BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port);
EndaKilgarriff 9:9e247b9c9abf 255
EndaKilgarriff 9:9e247b9c9abf 256 if (data) {
EndaKilgarriff 9:9e247b9c9abf 257 for (size_t i = 0; i < bytes_number; i++) {
mahphalke 15:fd2c3c3038bf 258 uart->write(&data[i], 1);
EndaKilgarriff 9:9e247b9c9abf 259 }
EndaKilgarriff 9:9e247b9c9abf 260
mahphalke 15:fd2c3c3038bf 261 return bytes_number;
EndaKilgarriff 9:9e247b9c9abf 262 }
EndaKilgarriff 9:9e247b9c9abf 263 }
EndaKilgarriff 9:9e247b9c9abf 264 }
EndaKilgarriff 9:9e247b9c9abf 265
EndaKilgarriff 9:9e247b9c9abf 266 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 267 }
EndaKilgarriff 9:9e247b9c9abf 268
EndaKilgarriff 9:9e247b9c9abf 269
EndaKilgarriff 9:9e247b9c9abf 270 /**
EndaKilgarriff 9:9e247b9c9abf 271 * @brief Initialize the UART communication peripheral.
EndaKilgarriff 9:9e247b9c9abf 272 * @param desc - The UART descriptor.
EndaKilgarriff 9:9e247b9c9abf 273 * @param param - The structure that contains the UART parameters.
EndaKilgarriff 9:9e247b9c9abf 274 * @return SUCCESS in case of success, FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 275 */
EndaKilgarriff 9:9e247b9c9abf 276 int32_t uart_init(struct uart_desc **desc, struct uart_init_param *param)
EndaKilgarriff 9:9e247b9c9abf 277 {
mahphalke 15:fd2c3c3038bf 278 mbed::BufferedSerial *uart; // Pointer to new BufferedSerial/UART instance
mahphalke 15:fd2c3c3038bf 279 platform_usbcdc *usb_cdc_dev; // Pointer to usb cdc device class instance
mahphalke 15:fd2c3c3038bf 280 mbed_uart_desc *mbed_desc; // Pointer to mbed uart descriptor
EndaKilgarriff 9:9e247b9c9abf 281
EndaKilgarriff 9:9e247b9c9abf 282 if (desc && param) {
EndaKilgarriff 9:9e247b9c9abf 283 // Create the UART description object for the device
EndaKilgarriff 9:9e247b9c9abf 284 uart_desc *new_desc = (uart_desc *)malloc(sizeof(uart_desc));
EndaKilgarriff 9:9e247b9c9abf 285 if (new_desc == NULL) {
EndaKilgarriff 9:9e247b9c9abf 286 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 287 }
EndaKilgarriff 9:9e247b9c9abf 288
EndaKilgarriff 9:9e247b9c9abf 289 new_desc->baud_rate = param->baud_rate;
EndaKilgarriff 9:9e247b9c9abf 290
mahphalke 15:fd2c3c3038bf 291 if (((mbed_uart_init_param *)param->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 292 // Create a new instance of platform_usbcdc class
mahphalke 15:fd2c3c3038bf 293 usb_cdc_dev = new platform_usbcdc(false,
mahphalke 15:fd2c3c3038bf 294 ((mbed_uart_init_param *)param->extra)->vendor_id,
mahphalke 15:fd2c3c3038bf 295 ((mbed_uart_init_param *)param->extra)->product_id,
mahphalke 15:fd2c3c3038bf 296 ((mbed_uart_init_param *)param->extra)->product_release);
mahphalke 15:fd2c3c3038bf 297 if (!usb_cdc_dev)
mahphalke 15:fd2c3c3038bf 298 return FAILURE;
mahphalke 15:fd2c3c3038bf 299 } else {
mahphalke 15:fd2c3c3038bf 300 // Create and configure a new instance of BufferedSerial/UART port
mahphalke 15:fd2c3c3038bf 301 uart = new BufferedSerial(
mahphalke 15:fd2c3c3038bf 302 (PinName)(((mbed_uart_init_param *)param->extra)->uart_tx_pin),
mahphalke 15:fd2c3c3038bf 303 (PinName)(((mbed_uart_init_param *)param->extra)->uart_rx_pin),
mahphalke 15:fd2c3c3038bf 304 (int)param->baud_rate);
EndaKilgarriff 9:9e247b9c9abf 305
mahphalke 15:fd2c3c3038bf 306 if (!uart)
mahphalke 15:fd2c3c3038bf 307 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 308 }
EndaKilgarriff 9:9e247b9c9abf 309
EndaKilgarriff 9:9e247b9c9abf 310 // Create a new mbed descriptor to store new UART instances
EndaKilgarriff 9:9e247b9c9abf 311 mbed_desc = (mbed_uart_desc *)malloc(sizeof(mbed_uart_desc));
EndaKilgarriff 9:9e247b9c9abf 312 if (mbed_desc == NULL) {
EndaKilgarriff 9:9e247b9c9abf 313 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 314 }
EndaKilgarriff 9:9e247b9c9abf 315
mahphalke 15:fd2c3c3038bf 316 if (((mbed_uart_init_param *)param->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 317 mbed_desc->uart_port = (platform_usbcdc *)usb_cdc_dev;
mahphalke 15:fd2c3c3038bf 318
mahphalke 15:fd2c3c3038bf 319 /* Establish connection with the USB CDC communication port */
mahphalke 15:fd2c3c3038bf 320 usb_cdc_dev->connect();
mahphalke 15:fd2c3c3038bf 321 mdelay(2000);
mahphalke 15:fd2c3c3038bf 322
mahphalke 15:fd2c3c3038bf 323 /* Change terminal connection status manually */
mahphalke 15:fd2c3c3038bf 324 usb_cdc_dev->change_terminal_connected(true);
mahphalke 15:fd2c3c3038bf 325 } else {
mahphalke 15:fd2c3c3038bf 326 mbed_desc->uart_port = (BufferedSerial *)uart;
mahphalke 15:fd2c3c3038bf 327 }
mahphalke 15:fd2c3c3038bf 328
mahphalke 16:61ad39564f45 329 mbed_desc->virtual_com_enable = ((mbed_uart_init_param *)param->extra)->virtual_com_enable;
EndaKilgarriff 9:9e247b9c9abf 330 new_desc->extra = (mbed_uart_desc *)mbed_desc;
EndaKilgarriff 9:9e247b9c9abf 331 *desc = new_desc;
EndaKilgarriff 9:9e247b9c9abf 332
EndaKilgarriff 9:9e247b9c9abf 333 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 334 }
EndaKilgarriff 9:9e247b9c9abf 335
EndaKilgarriff 9:9e247b9c9abf 336 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 337 }
EndaKilgarriff 9:9e247b9c9abf 338
EndaKilgarriff 9:9e247b9c9abf 339
EndaKilgarriff 9:9e247b9c9abf 340 /**
EndaKilgarriff 9:9e247b9c9abf 341 * @brief Free the resources allocated by uart_init().
EndaKilgarriff 9:9e247b9c9abf 342 * @param desc - The UART descriptor.
EndaKilgarriff 9:9e247b9c9abf 343 * @return SUCCESS in case of success, FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 344 */
EndaKilgarriff 9:9e247b9c9abf 345 int32_t uart_remove(struct uart_desc *desc)
EndaKilgarriff 9:9e247b9c9abf 346 {
EndaKilgarriff 9:9e247b9c9abf 347 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 348 // Free the UART port object
mahphalke 15:fd2c3c3038bf 349 if (((mbed_uart_desc *)desc->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 350 if ((platform_usbcdc *)((mbed_uart_desc *)desc->extra)->uart_port)
mahphalke 15:fd2c3c3038bf 351 delete((platform_usbcdc *)(platform_usbcdc *)((mbed_uart_desc *)
mahphalke 15:fd2c3c3038bf 352 desc->extra)->uart_port);
mahphalke 15:fd2c3c3038bf 353 } else {
mahphalke 15:fd2c3c3038bf 354 if ((BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port)) {
mahphalke 15:fd2c3c3038bf 355 delete((BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port));
mahphalke 15:fd2c3c3038bf 356 }
EndaKilgarriff 9:9e247b9c9abf 357 }
EndaKilgarriff 9:9e247b9c9abf 358
EndaKilgarriff 9:9e247b9c9abf 359 // Free the UART extra descriptor object
EndaKilgarriff 9:9e247b9c9abf 360 if ((mbed_uart_desc *)(desc->extra)) {
EndaKilgarriff 9:9e247b9c9abf 361 free((mbed_uart_desc *)(desc->extra));
EndaKilgarriff 9:9e247b9c9abf 362 }
EndaKilgarriff 9:9e247b9c9abf 363
EndaKilgarriff 9:9e247b9c9abf 364 // Free the UART descriptor object
EndaKilgarriff 9:9e247b9c9abf 365 free(desc);
EndaKilgarriff 9:9e247b9c9abf 366
EndaKilgarriff 9:9e247b9c9abf 367 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 368 }
EndaKilgarriff 9:9e247b9c9abf 369
EndaKilgarriff 9:9e247b9c9abf 370 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 371 }
EndaKilgarriff 9:9e247b9c9abf 372
EndaKilgarriff 9:9e247b9c9abf 373
EndaKilgarriff 9:9e247b9c9abf 374 /**
EndaKilgarriff 9:9e247b9c9abf 375 * @brief Get number of UART errors.
EndaKilgarriff 9:9e247b9c9abf 376 * @param desc - The UART descriptor.
EndaKilgarriff 9:9e247b9c9abf 377 * @return number of errors.
EndaKilgarriff 9:9e247b9c9abf 378 */
EndaKilgarriff 9:9e247b9c9abf 379 uint32_t uart_get_errors(struct uart_desc *desc)
EndaKilgarriff 9:9e247b9c9abf 380 {
EndaKilgarriff 9:9e247b9c9abf 381 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 382 // Unused variable - fix compiler warning
EndaKilgarriff 9:9e247b9c9abf 383 }
EndaKilgarriff 9:9e247b9c9abf 384
EndaKilgarriff 9:9e247b9c9abf 385 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 386 }