Platform drivers for Mbed.
Dependents: EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more
src/uart.cpp@16:61ad39564f45, 2021-03-19 (annotated)
- 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?
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> |
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 | } |