Platform drivers for Mbed.

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

Committer:
mahphalke
Date:
Fri Feb 19 15:53:52 2021 +0530
Revision:
15:fd2c3c3038bf
Parent:
11:a2dcf0ebb5b5
Child:
16:61ad39564f45
1. Reverted SPI to use fixed 8-bit format but with time efficient version of spi write function.
2. Integrated USB CDC (Virtual COM Port) functionality into UART module

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
EndaKilgarriff 9:9e247b9c9abf 329 new_desc->extra = (mbed_uart_desc *)mbed_desc;
EndaKilgarriff 9:9e247b9c9abf 330 *desc = new_desc;
EndaKilgarriff 9:9e247b9c9abf 331
EndaKilgarriff 9:9e247b9c9abf 332 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 333 }
EndaKilgarriff 9:9e247b9c9abf 334
EndaKilgarriff 9:9e247b9c9abf 335 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 336 }
EndaKilgarriff 9:9e247b9c9abf 337
EndaKilgarriff 9:9e247b9c9abf 338
EndaKilgarriff 9:9e247b9c9abf 339 /**
EndaKilgarriff 9:9e247b9c9abf 340 * @brief Free the resources allocated by uart_init().
EndaKilgarriff 9:9e247b9c9abf 341 * @param desc - The UART descriptor.
EndaKilgarriff 9:9e247b9c9abf 342 * @return SUCCESS in case of success, FAILURE otherwise.
EndaKilgarriff 9:9e247b9c9abf 343 */
EndaKilgarriff 9:9e247b9c9abf 344 int32_t uart_remove(struct uart_desc *desc)
EndaKilgarriff 9:9e247b9c9abf 345 {
EndaKilgarriff 9:9e247b9c9abf 346 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 347 // Free the UART port object
mahphalke 15:fd2c3c3038bf 348 if (((mbed_uart_desc *)desc->extra)->virtual_com_enable) {
mahphalke 15:fd2c3c3038bf 349 if ((platform_usbcdc *)((mbed_uart_desc *)desc->extra)->uart_port)
mahphalke 15:fd2c3c3038bf 350 delete((platform_usbcdc *)(platform_usbcdc *)((mbed_uart_desc *)
mahphalke 15:fd2c3c3038bf 351 desc->extra)->uart_port);
mahphalke 15:fd2c3c3038bf 352 } else {
mahphalke 15:fd2c3c3038bf 353 if ((BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port)) {
mahphalke 15:fd2c3c3038bf 354 delete((BufferedSerial *)(((mbed_uart_desc *)(desc->extra))->uart_port));
mahphalke 15:fd2c3c3038bf 355 }
EndaKilgarriff 9:9e247b9c9abf 356 }
EndaKilgarriff 9:9e247b9c9abf 357
EndaKilgarriff 9:9e247b9c9abf 358 // Free the UART extra descriptor object
EndaKilgarriff 9:9e247b9c9abf 359 if ((mbed_uart_desc *)(desc->extra)) {
EndaKilgarriff 9:9e247b9c9abf 360 free((mbed_uart_desc *)(desc->extra));
EndaKilgarriff 9:9e247b9c9abf 361 }
EndaKilgarriff 9:9e247b9c9abf 362
EndaKilgarriff 9:9e247b9c9abf 363 // Free the UART descriptor object
EndaKilgarriff 9:9e247b9c9abf 364 free(desc);
EndaKilgarriff 9:9e247b9c9abf 365
EndaKilgarriff 9:9e247b9c9abf 366 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 367 }
EndaKilgarriff 9:9e247b9c9abf 368
EndaKilgarriff 9:9e247b9c9abf 369 return FAILURE;
EndaKilgarriff 9:9e247b9c9abf 370 }
EndaKilgarriff 9:9e247b9c9abf 371
EndaKilgarriff 9:9e247b9c9abf 372
EndaKilgarriff 9:9e247b9c9abf 373 /**
EndaKilgarriff 9:9e247b9c9abf 374 * @brief Get number of UART errors.
EndaKilgarriff 9:9e247b9c9abf 375 * @param desc - The UART descriptor.
EndaKilgarriff 9:9e247b9c9abf 376 * @return number of errors.
EndaKilgarriff 9:9e247b9c9abf 377 */
EndaKilgarriff 9:9e247b9c9abf 378 uint32_t uart_get_errors(struct uart_desc *desc)
EndaKilgarriff 9:9e247b9c9abf 379 {
EndaKilgarriff 9:9e247b9c9abf 380 if (desc) {
EndaKilgarriff 9:9e247b9c9abf 381 // Unused variable - fix compiler warning
EndaKilgarriff 9:9e247b9c9abf 382 }
EndaKilgarriff 9:9e247b9c9abf 383
EndaKilgarriff 9:9e247b9c9abf 384 return SUCCESS;
EndaKilgarriff 9:9e247b9c9abf 385 }