Update platform drivers
src/uart.cpp
- Committer:
- EndaKilgarriff
- Date:
- 2020-06-17
- Revision:
- 10:b5115cd6b916
- Parent:
- 9:9e247b9c9abf
File content as of revision 10:b5115cd6b916:
/***************************************************************************//** * @file uart.cpp * @brief Implementation of UART No-OS platform driver interfaces ******************************************************************************** * Copyright (c) 2020 Analog Devices, Inc. * * All rights reserved. * * This software is proprietary to Analog Devices, Inc. and its licensors. * By using this software you agree to the terms of the associated * Analog Devices Software License Agreement. *******************************************************************************/ /******************************************************************************/ /***************************** Include Files **********************************/ /******************************************************************************/ #include <stdio.h> #include <mbed.h> #include "platform_drivers.h" #include "uart_extra.h" /******************************************************************************/ /************************ Functions Definitions *******************************/ /******************************************************************************/ /** * @brief Read data from UART device. * @param desc - Instance of UART. * @param data - Pointer to buffer containing data. * @param bytes_number - Number of bytes to read. * @return SUCCESS in case of success, FAILURE otherwise. */ int32_t uart_read(struct uart_desc *desc, uint8_t *data, uint32_t bytes_number) { mbed::Serial *uart; // pointer to Serial/UART instance if (desc) { if (((mbed_uart_desc *)(desc->extra))->uart_port) { uart = (Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port); if (data) { for (size_t i = 0; i < bytes_number; i++) { data[i] = uart->getc(); } return SUCCESS; } } } return FAILURE; } /** * @brief Write data to UART device. * @param desc - Instance of UART. * @param data - Pointer to buffer containing data. * @param bytes_number - Number of bytes to read. * @return SUCCESS in case of success, FAILURE otherwise. */ int32_t uart_write(struct uart_desc *desc, const uint8_t *data, uint32_t bytes_number) { mbed::Serial *uart; // pointer to Serial/UART instance if (desc) { if (((mbed_uart_desc *)(desc->extra))->uart_port) { uart = (Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port); if (data) { for (size_t i = 0; i < bytes_number; i++) { uart->putc(data[i]); } return SUCCESS; } } } return FAILURE; } /** * @brief Submit reading buffer to the UART driver. * * Buffer is used until bytes_number bytes are read. * @param desc: Descriptor of the UART device * @param data: Buffer where data will be read * @param bytes_number: Number of bytes to be read. * @return \ref SUCCESS in case of success, \ref FAILURE otherwise. */ int32_t uart_read_nonblocking(struct uart_desc *desc, uint8_t *data, uint32_t bytes_number) { mbed::Serial *uart; // pointer to Serial/UART instance if (desc) { if (((mbed_uart_desc *)(desc->extra))->uart_port) { uart = (Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port); if (data) { for (size_t i = 0; i < bytes_number; i++) { if (uart->readable() > 0) { data[i] = uart->getc(); } } return SUCCESS; } } } return FAILURE; } /** * @brief Submit writting buffer to the UART driver. * * Data from the buffer is sent over the UART, the function returns imediatly. * @param desc: Descriptor of the UART device * @param data: Buffer where data will be written * @param bytes_number: Number of bytes to be written. * @return \ref SUCCESS in case of success, \ref FAILURE otherwise. */ int32_t uart_write_nonblocking(struct uart_desc *desc, const uint8_t *data, uint32_t bytes_number) { mbed::Serial *uart; // pointer to Serial/UART instance if (desc) { if (((mbed_uart_desc *)(desc->extra))->uart_port) { uart = (Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port); if (data) { for (size_t i = 0; i < bytes_number; i++) { if (uart->writable() > 0) { uart->putc(data[i]); } } return SUCCESS; } } } return FAILURE; } /** * @brief Initialize the UART communication peripheral. * @param desc - The UART descriptor. * @param param - The structure that contains the UART parameters. * @return SUCCESS in case of success, FAILURE otherwise. */ int32_t uart_init(struct uart_desc **desc, struct uart_init_param *param) { mbed::Serial *uart; // pointer to new Serial/UART instance mbed_uart_desc *mbed_desc; // Pointer to mbed uart descriptor if (desc && param) { // Create the UART description object for the device uart_desc *new_desc = (uart_desc *)malloc(sizeof(uart_desc)); if (new_desc == NULL) { return FAILURE; } new_desc->baud_rate = param->baud_rate; // Create and configure a new instance of Serial/UART port uart = new Serial( (PinName)(((mbed_uart_init_param *)param->extra)->uart_tx_pin), (PinName)(((mbed_uart_init_param *)param->extra)->uart_rx_pin), (int)param->baud_rate); if (uart == NULL) { return FAILURE; } // Create a new mbed descriptor to store new UART instances mbed_desc = (mbed_uart_desc *)malloc(sizeof(mbed_uart_desc)); if (mbed_desc == NULL) { return FAILURE; } mbed_desc->uart_port = (Serial *)uart; new_desc->extra = (mbed_uart_desc *)mbed_desc; *desc = new_desc; return SUCCESS; } return FAILURE; } /** * @brief Free the resources allocated by uart_init(). * @param desc - The UART descriptor. * @return SUCCESS in case of success, FAILURE otherwise. */ int32_t uart_remove(struct uart_desc *desc) { if (desc) { // Free the UART port object if ((Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port)) { delete((Serial *)(((mbed_uart_desc *)(desc->extra))->uart_port)); } // Free the UART extra descriptor object if ((mbed_uart_desc *)(desc->extra)) { free((mbed_uart_desc *)(desc->extra)); } // Free the UART descriptor object free(desc); return SUCCESS; } return FAILURE; } /** * @brief Get number of UART errors. * @param desc - The UART descriptor. * @return number of errors. */ uint32_t uart_get_errors(struct uart_desc *desc) { if (desc) { // Unused variable - fix compiler warning } return SUCCESS; }