/* * Copyright (c) 2015, Infineon Technologies AG * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification,are permitted provided that the * following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided with the distribution. * * Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with * Infineon Technologies AG dave@infineon.com). * */ /** * @file UART.c * @date 24 July, 2015 * @version 2.0.4 * * @brief UART Driver for Infineon XMC4000 * * History * * Version 2.0.4 Added fixed to prevent race conditions * and Initialize/Uninitialize, Power Control * guidelines related modifications
* * Version 1.0.0 Initial version
*/ #include "UART.h" #include "RTE_Device.h" #include "RTE_Components.h" #define ARM_USART_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,4) /* driver version */ // Driver Version static const ARM_DRIVER_VERSION DriverVersion = { ARM_USART_API_VERSION, ARM_USART_DRV_VERSION }; #if (defined(RTE_Drivers_USART) && \ (RTE_UART0 == 0) && \ (RTE_UART1 == 0) && \ (RTE_UART2 == 0) && \ (RTE_UART3 == 0) && \ (RTE_UART4 == 0) && \ (RTE_UART5 == 0)) #error "UART not configured in RTE_Device.h!" #endif // Default UART initialization static const XMC_UART_CH_CONFIG_t uart_default_config = { .baudrate = 100000U, .data_bits = 8U, .frame_length = 8U, .stop_bits = 1U, .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE }; static const ARM_USART_CAPABILITIES DriverCapabilities = { 1, ///< supports UART (Asynchronous) mode 0, ///< supports Synchronous Master mode 0, ///< supports Synchronous Slave mode 1, ///< supports UART Single-wire mode 0, ///< supports UART IrDA mode 0, ///< supports UART Smart Card mode 0, ///< Smart Card Clock generator available 0, ///< RTS Flow Control available 0, ///< CTS Flow Control available 1, ///< Transmit completed event: \ref ARM_USART_EVENT_TX_COMPLETE 0, ///< Signal receive character timeout event: \ref ARM_USART_EVENT_RX_TIMEOUT 0, ///< RTS Line: 0=not available, 1=available 0, ///< CTS Line: 0=not available, 1=available 0, ///< DTR Line: 0=not available, 1=available 0, ///< DSR Line: 0=not available, 1=available 0, ///< DCD Line: 0=not available, 1=available 0, ///< RI Line: 0=not available, 1=available 0, ///< Signal CTS change event: \ref ARM_USART_EVENT_CTS 0, ///< Signal DSR change event: \ref ARM_USART_EVENT_DSR 0, ///< Signal DCD change event: \ref ARM_USART_EVENT_DCD 0 ///< Signal RI change event: \ref ARM_USART_EVENT_RI }; /* UART0 */ #if (RTE_UART0 != 0) static UART_INFO UART0_Info = {0}; static XMC_GPIO_CONFIG_t UART0_rx_conf; static XMC_GPIO_CONFIG_t UART0_tx_conf; /* UART0 Resources */ UART_RESOURCES UART0_Resources = { RTE_UART0_TX_PORT, &UART0_tx_conf, RTE_UART0_TX_AF, RTE_UART0_RX_PORT, &UART0_rx_conf, RTE_UART0_RX_INPUT, XMC_UART0_CH0, USIC0_0_IRQn, USIC0_1_IRQn, RTE_UART0_TX_FIFO_SIZE, RTE_UART0_TX_FIFO_SIZE_NUM, RTE_UART0_RX_FIFO_SIZE, RTE_UART0_RX_FIFO_SIZE_NUM, &UART0_Info }; #endif /* UART1 */ #if (RTE_UART1 != 0) static UART_INFO UART1_Info = {0}; static XMC_GPIO_CONFIG_t UART1_rx_conf; static XMC_GPIO_CONFIG_t UART1_tx_conf; /* UART1 Resources */ UART_RESOURCES UART1_Resources = { RTE_UART1_TX_PORT, &UART1_tx_conf, RTE_UART1_TX_AF, RTE_UART1_RX_PORT, &UART1_rx_conf, RTE_UART1_RX_INPUT, XMC_UART0_CH1, USIC0_2_IRQn, USIC0_3_IRQn, RTE_UART1_TX_FIFO_SIZE, RTE_UART1_TX_FIFO_SIZE_NUM, RTE_UART1_RX_FIFO_SIZE, RTE_UART1_RX_FIFO_SIZE_NUM, &UART1_Info }; #endif /* UART2 */ #if (RTE_UART2 != 0) static UART_INFO UART2_Info = {0}; static XMC_GPIO_CONFIG_t UART2_rx_conf; static XMC_GPIO_CONFIG_t UART2_tx_conf; /* UART2 Resources */ UART_RESOURCES UART2_Resources = { RTE_UART2_TX_PORT, &UART2_tx_conf, RTE_UART2_TX_AF, RTE_UART2_RX_PORT, &UART2_rx_conf, RTE_UART2_RX_INPUT, XMC_UART1_CH0, USIC1_0_IRQn, USIC1_1_IRQn, RTE_UART2_TX_FIFO_SIZE, RTE_UART2_TX_FIFO_SIZE_NUM, RTE_UART2_RX_FIFO_SIZE, RTE_UART2_RX_FIFO_SIZE_NUM, &UART2_Info }; #endif /* UART3 */ #if (RTE_UART3 != 0) static UART_INFO UART3_Info = {0}; static XMC_GPIO_CONFIG_t UART3_rx_conf; static XMC_GPIO_CONFIG_t UART3_tx_conf; /* UART3 Resources */ UART_RESOURCES UART3_Resources = { RTE_UART3_TX_PORT, &UART3_tx_conf, RTE_UART3_TX_AF, RTE_UART3_RX_PORT, &UART3_rx_conf, RTE_UART3_RX_INPUT, XMC_UART1_CH1, USIC1_2_IRQn, USIC1_3_IRQn, RTE_UART3_TX_FIFO_SIZE, RTE_UART3_TX_FIFO_SIZE_NUM, RTE_UART3_RX_FIFO_SIZE, RTE_UART3_RX_FIFO_SIZE_NUM, &UART3_Info }; #endif /* UART4 */ #if (RTE_UART4 != 0) static UART_INFO UART4_Info = {0}; static XMC_GPIO_CONFIG_t UART4_rx_conf; static XMC_GPIO_CONFIG_t UART4_tx_conf; /* UART4 Resources */ UART_RESOURCES UART4_Resources = { RTE_UART4_TX_PORT, &UART4_tx_conf, RTE_UART4_TX_AF, RTE_UART4_RX_PORT, &UART4_rx_conf, RTE_UART4_RX_INPUT, XMC_UART2_CH0, USIC2_0_IRQn, USIC2_1_IRQn, RTE_UART4_TX_FIFO_SIZE, RTE_UART4_TX_FIFO_SIZE_NUM, RTE_UART4_RX_FIFO_SIZE, RTE_UART4_RX_FIFO_SIZE_NUM, &UART4_Info }; #endif /* UART5 */ #if (RTE_UART5 != 0) static UART_INFO UART5_Info = {0}; static XMC_GPIO_CONFIG_t UART5_rx_conf; static XMC_GPIO_CONFIG_t UART5_tx_conf; /* UART5 Resources */ UART_RESOURCES UART5_Resources = { RTE_UART5_TX_PORT, &UART5_tx_conf, RTE_UART5_TX_AF, RTE_UART5_RX_PORT, &UART5_rx_conf, RTE_UART5_RX_INPUT, XMC_UART2_CH1, USIC2_2_IRQn, USIC2_3_IRQn, RTE_UART5_TX_FIFO_SIZE, RTE_UART5_TX_FIFO_SIZE_NUM, RTE_UART5_RX_FIFO_SIZE, RTE_UART5_RX_FIFO_SIZE_NUM, &UART5_Info }; #endif /* UART Resources */ static UART_RESOURCES *uart[6] = { #if (RTE_UART0 != 0) &UART0_Resources, #else NULL, #endif #if (RTE_UART1 != 0) &UART1_Resources, #else NULL, #endif #if (RTE_UART2 != 0) &UART2_Resources, #else NULL, #endif #if (RTE_UART3 != 0) &UART3_Resources, #else NULL, #endif #if (RTE_UART4 != 0) &UART4_Resources, #else NULL, #endif #if (RTE_UART5 != 0) &UART5_Resources, #else NULL, #endif }; /** \fn ARM_DRV_VERSION USARTX_GetVersion (void) \brief Get driver version. \return \ref ARM_DRV_VERSION */ static ARM_DRIVER_VERSION USARTX_GetVersion (void) { return DriverVersion; } /** \fn ARM_UART_CAPABILITIES UART_GetCapabilities (UART_RESOURCES *uart) \brief Get driver capabilities. \param[in] uart Pointer to UART resources \return \ref USART_CAPABILITIES */ static ARM_USART_CAPABILITIES UART_GetCapabilities (UART_RESOURCES *uart) { return DriverCapabilities; } #if (RTE_UART0 != 0) static ARM_USART_CAPABILITIES UART0_GetCapabilities (void) { return UART_GetCapabilities (uart[0]); } #endif #if (RTE_UART1 != 0) static ARM_USART_CAPABILITIES UART1_GetCapabilities (void) { return UART_GetCapabilities (uart[1]); } #endif #if (RTE_UART2 != 0) static ARM_USART_CAPABILITIES UART2_GetCapabilities (void) { return UART_GetCapabilities (uart[2]); } #endif #if (RTE_UART3 != 0) static ARM_USART_CAPABILITIES UART3_GetCapabilities (void) { return UART_GetCapabilities (uart[3]); } #endif #if (RTE_UART4 != 0) static ARM_USART_CAPABILITIES UART4_GetCapabilities (void) { return UART_GetCapabilities (uart[4]); } #endif #if (RTE_UART5 != 0) static ARM_USART_CAPABILITIES UART5_GetCapabilities (void) { return UART_GetCapabilities (uart[5]); } #endif /** \fn ARM_USART_STATUS UART_Initialize (ARM_USART_SignalEvent_t cb_event, UART_RESOURCES *uart) \brief Initialize UART Interface. \param[in] cb_event Pointer to \ref ARM_USART_SignalEvent \param[in] uart Pointer to USART resources \return \ref ARM_USART_STATUS */ static int32_t UART_Initialize (ARM_USART_SignalEvent_t cb_event, UART_RESOURCES *uart) { if(((uart->info->flags)&UART_INITIALIZED) == 0) { // Initialize USART Run-Time Resources uart->info->cb_event= cb_event; uart->info->status.tx_busy = 0; uart->info->status.rx_busy = 0; uart->info->status.tx_underflow = 0; uart->info->status.rx_overflow = 0; uart->info->status.rx_break = 0; uart->info->status.rx_framing_error = 0; uart->info->status.rx_parity_error = 0; uart->info->flags |= UART_INITIALIZED; return ARM_DRIVER_OK; }else return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Initialize (ARM_USART_SignalEvent_t cb_event) { return UART_Initialize (cb_event, uart[5]); } #endif /** \fn int32_t UART_Uninitialize (UART_RESOURCES *uart) \brief De-initialize USART Interface. \param[in] uart Pointer to USART resources \return \ref execution_status */ static int32_t UART_Uninitialize (UART_RESOURCES *uart) { // Reset UART status flags uart->info->flags = 0; uart->info->flags &=~UART_INITIALIZED; return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Uninitialize (void) { return UART_Uninitialize (uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Uninitialize (void) { return UART_Uninitialize (uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Uninitialize (void) { return UART_Uninitialize (uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Uninitialize (void) { return UART_Uninitialize (uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Uninitialize (void) { return UART_Uninitialize (uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Uninitialize (void) { return UART_Uninitialize (uart[5]); } #endif /** \fn ARM_USART_STATUS UART_PowerControl (ARM_POWER_STATE state, UART_RESOURCES *uart) \brief Controls UART Interface Power. \param[in] state Power state \param[in] uart Pointer to USART resources \return \ref USART_STATUS */ static int32_t UART_PowerControl (ARM_POWER_STATE state, UART_RESOURCES *uart) { if(state == ARM_POWER_FULL) { if(((uart->info->flags)&UART_POWERED) == 0) { if(uart->tx_fifo_size_num > uart->rx_fifo_size_num) { uart->info->tx_fifo_pointer = 0; uart->info->rx_fifo_pointer = uart->tx_fifo_size_num; } else { uart->info->tx_fifo_pointer = uart->rx_fifo_size_num; uart->info->rx_fifo_pointer = 0; } XMC_UART_CH_Init(uart->uart,&uart_default_config); XMC_USIC_CH_TXFIFO_Configure(uart->uart,uart->info->tx_fifo_pointer,(XMC_USIC_CH_FIFO_SIZE_t)uart->tx_fifo_size_reg,1U); XMC_UART_CH_SetInputSource(uart->uart,XMC_UART_CH_INPUT_RXD,uart->input); NVIC_ClearPendingIRQ(uart->irq_rx_num); NVIC_ClearPendingIRQ(uart->irq_tx_num); #if(UC_FAMILY == XMC4) NVIC_SetPriority(uart->irq_rx_num,NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0U,0U)); NVIC_SetPriority(uart->irq_tx_num,NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0U,0U)); #else NVIC_SetPriority(uart->irq_rx_num,3U); NVIC_SetPriority(uart->irq_tx_num,3U); #endif NVIC_EnableIRQ(uart->irq_rx_num); NVIC_EnableIRQ(uart->irq_tx_num); uart->info->flags |= UART_POWERED; } } else if(state == ARM_POWER_OFF ) { XMC_UART_CH_Stop(uart->uart); uart->info->flags &=~UART_POWERED; } else return ARM_DRIVER_ERROR_UNSUPPORTED; return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_PowerControl (ARM_POWER_STATE state) { return UART_PowerControl (state, uart[5]); } #endif /** \fn int32_t UART_Send (const uint8_t *data, uint32_t num, UART_RESOURCES *uart) \brief Write data to UART transmitter. \param[in] data Pointer to buffer with data to write to UART transmitter \param[in] num Data buffer size in bytes \param[in] uart Pointer to UART resources \return driver status */ static int32_t UART_Send (const void *data, uint32_t num, UART_RESOURCES *uart){ uint8_t SRno = 0U; if ((data == NULL) || (num == 0)) { // Invalid parameters return ARM_DRIVER_ERROR_PARAMETER; } if ((uart->info->flags & UART_POWERED) == 0) { // UART is not powered return ARM_DRIVER_ERROR; } if (uart->info->status.tx_busy == 1) { // Send is not completed yet return ARM_DRIVER_ERROR_BUSY; } uart->info->status.tx_busy = 1; // Save transmit buffer info uart->info->xfer.tx_buf = (uint8_t *)data; uart->info->xfer.tx_num = num; uart->info->xfer.tx_cnt = 0; #if(UC_FAMILY == XMC4) if((uart->irq_tx_num) < 90) { SRno= uart->irq_tx_num - 84; } else if((uart->irq_tx_num) < 96) { SRno=uart->irq_tx_num - 90; } else { SRno=uart->irq_tx_num - 96; } #elif (UC_FAMILY == XMC1) SRno=uart->irq_tx_num - 9; #endif if(uart->rx_fifo_size_reg==NO_FIFO) { XMC_USIC_CH_EnableEvent(uart->uart,XMC_USIC_CH_EVENT_TRANSMIT_BUFFER); XMC_USIC_CH_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER,SRno); } else { XMC_USIC_CH_TXFIFO_Flush(uart->uart); XMC_USIC_CH_TXFIFO_EnableEvent(uart->uart,XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); XMC_USIC_CH_TXFIFO_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_TXFIFO_INTERRUPT_NODE_POINTER_STANDARD,SRno); } /* Trigger standard tranmit interrupt */ XMC_USIC_CH_TriggerServiceRequest(uart->uart,SRno); return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Send (const void *data, uint32_t num) { return UART_Send (data, num, uart[5]); } #endif /** \fn int32_t UART_Receive (uint8_t *data, uint32_t num, UART_RESOURCES *uart) \brief Read data from UART receiver. \param[out] data Pointer to buffer for data read from USART receiver \param[in] size Data buffer size in bytes \param[in] uart Pointer to UART resources \return driver status */ static int32_t UART_Receive (void *data, uint32_t num,UART_RESOURCES *uart) { uint8_t SRno = 0U; if ((data == NULL) || (num == 0)) { // Invalid parameters return ARM_DRIVER_ERROR_PARAMETER; } if ((uart->info->flags & UART_POWERED) == 0) { // UART is not powered return ARM_DRIVER_ERROR; } // Check if receiver is busy if (uart->info->status.rx_busy == 1) return ARM_DRIVER_ERROR_BUSY; #if (UC_FAMILY == XMC4) if((uart->irq_rx_num) < 90) { SRno= uart->irq_rx_num - 84; } else if((uart->irq_rx_num) < 96) { SRno=uart->irq_rx_num - 90; } else { SRno=uart->irq_rx_num - 96; } #elif (UC_FAMILY == XMC1) SRno=uart->irq_rx_num - 9; #endif // Set RX busy flag uart->info->status.rx_busy = 1; // Save number of data to be received uart->info->xfer.rx_num = num; // Clear RX status uart->info->status.rx_break = 0; uart->info->status.rx_framing_error = 0; uart->info->status.rx_overflow = 0; uart->info->status.rx_parity_error = 0; // Save receive buffer info uart->info->xfer.rx_buf = (uint8_t *)data; uart->info->xfer.rx_cnt = 0; if(uart->rx_fifo_size_reg==NO_FIFO) { XMC_USIC_CH_EnableEvent(uart->uart,XMC_USIC_CH_EVENT_STANDARD_RECEIVE | XMC_USIC_CH_EVENT_ALTERNATIVE_RECEIVE); XMC_USIC_CH_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_INTERRUPT_NODE_POINTER_RECEIVE,SRno); XMC_USIC_CH_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE,SRno); } else { XMC_USIC_CH_RXFIFO_Flush(uart->uart); XMC_USIC_CH_RXFIFO_EnableEvent(uart->uart,XMC_USIC_CH_RXFIFO_EVENT_CONF_STANDARD | XMC_USIC_CH_RXFIFO_EVENT_CONF_ALTERNATE); XMC_USIC_CH_RXFIFO_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_RXFIFO_INTERRUPT_NODE_POINTER_STANDARD,SRno); XMC_USIC_CH_RXFIFO_SetInterruptNodePointer(uart->uart,XMC_USIC_CH_RXFIFO_INTERRUPT_NODE_POINTER_ALTERNATE,SRno); if(num <= uart->rx_fifo_size_num) { XMC_USIC_CH_RXFIFO_Configure(uart->uart,uart->info->rx_fifo_pointer,(XMC_USIC_CH_FIFO_SIZE_t)uart->rx_fifo_size_reg,(uart->info->xfer.rx_num)- 1U); } else { XMC_USIC_CH_RXFIFO_Configure(uart->uart,uart->info->rx_fifo_pointer,(XMC_USIC_CH_FIFO_SIZE_t)uart->rx_fifo_size_reg,uart->rx_fifo_size_num - 1U); } } return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Receive (void *data, uint32_t num) { return UART_Receive (data, num, uart[5]); } #endif /** \fn int32_t UART_Transfer (const void *data_out, void *data_in, uint32_t num, UART_RESOURCES *uart) \brief Start sending/receiving data to/from USART transmitter/receiver. \param[in] data_out Pointer to buffer with data to send to UART transmitter \param[out] data_in Pointer to buffer for data to receive from UART receiver \param[in] num Number of data items to transfer \param[in] uart Pointer to UART resources \return \ref execution_status */ static int32_t UART_Transfer (const void *data_out, void *data_in, uint32_t num, UART_RESOURCES *uart) { return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Transfer (const void *data_out,void *data_in,uint32_t num) { return UART_Transfer (data_out, data_in, num, uart[5]); } #endif /** \fn uint32_t UART_GetTxCount (UART_RESOURCES *uart) \brief Get transmitted data count. \param[in] uart Pointer to UART resources \return number of data items transmitted */ static uint32_t UART_GetTxCount (UART_RESOURCES *uart) { return uart->info->xfer.tx_cnt; } #if (RTE_UART0 != 0) static uint32_t UART0_GetTxCount (void) { return UART_GetTxCount (uart[0]); } #endif #if (RTE_UART1 != 0) static uint32_t UART1_GetTxCount (void) { return UART_GetTxCount (uart[1]); } #endif #if (RTE_UART2 != 0) static uint32_t UART2_GetTxCount (void) { return UART_GetTxCount (uart[2]); } #endif #if (RTE_UART3 != 0) static uint32_t UART3_GetTxCount (void) { return UART_GetTxCount (uart[3]); } #endif #if (RTE_UART4 != 0) static uint32_t UART4_GetTxCount (void) { return UART_GetTxCount (uart[4]); } #endif #if (RTE_UART5 != 0) static uint32_t UART5_GetTxCount (void) { return UART_GetTxCount (uart[5]); } #endif /** \fn uint32_t UART_GetRxCount (UART_RESOURCES *uart) \brief Get received data count. \param[in] uart Pointer to UART resources \return number of data items received */ static uint32_t UART_GetRxCount (UART_RESOURCES *uart) { return uart->info->xfer.rx_cnt; } #if (RTE_UART0 != 0) static uint32_t UART0_GetRxCount (void) { return UART_GetRxCount (uart[0]); } #endif #if (RTE_UART1 != 0) static uint32_t UART1_GetRxCount (void) { return UART_GetRxCount (uart[1]); } #endif #if (RTE_UART2 != 0) static uint32_t UART2_GetRxCount (void) { return UART_GetRxCount (uart[2]); } #endif #if (RTE_UART3 != 0) static uint32_t UART3_GetRxCount (void) { return UART_GetRxCount (uart[3]); } #endif #if (RTE_UART4 != 0) static uint32_t UART4_GetRxCount (void) { return UART_GetRxCount (uart[4]); } #endif #if (RTE_UART5 != 0) static uint32_t UART5_GetRxCount (void) { return UART_GetRxCount (uart[0]); } #endif /** \fn ARM_USART_STATUS UART_GetStatus (UART_RESOURCES *uart) \brief Get UART status. \param[in] uart Pointer to USART resources \return UART status \ref ARM_USART_STATUS */ static ARM_USART_STATUS UART_GetStatus (UART_RESOURCES *usart) { ARM_USART_STATUS status; status.tx_busy = usart->info->status.tx_busy;; status.rx_busy = usart->info->status.rx_busy; status.tx_underflow = usart->info->status.tx_underflow; status.rx_overflow = usart->info->status.rx_overflow; status.rx_break = usart->info->status.rx_break; status.rx_framing_error = usart->info->status.rx_framing_error; status.rx_parity_error = usart->info->status.rx_parity_error; return status; } #if (RTE_UART0 != 0) static ARM_USART_STATUS UART0_GetStatus (void) { return UART_GetStatus(uart[0]); } #endif #if (RTE_UART1 != 0) static ARM_USART_STATUS UART1_GetStatus (void) { return UART_GetStatus(uart[1]); } #endif #if (RTE_UART2 != 0) static ARM_USART_STATUS UART2_GetStatus (void) { return UART_GetStatus(uart[2]); } #endif #if (RTE_UART3 != 0) static ARM_USART_STATUS UART3_GetStatus (void) { return UART_GetStatus(uart[3]); } #endif #if (RTE_UART4 != 0) static ARM_USART_STATUS UART4_GetStatus (void) { return UART_GetStatus(uart[4]); } #endif #if (RTE_UART5 != 0) static ARM_USART_STATUS UART5_GetStatus (void) { return UART_GetStatus(uart[5]); } #endif /** \fn ARM_USART_STATUS UART_SetModemControl (ARM_USART_MODEM_CONTROL control, UART_RESOURCES *uart) \brief Set USART Modem Control line state. \param[in] control \ref ARM_USART_MODEM_CONTROL \param[in] uart Pointer to USART resources \return \ref ARM_USART_STATUS */ static int32_t UART_SetModemControl (ARM_USART_MODEM_CONTROL control, UART_RESOURCES *uart) { return ARM_DRIVER_ERROR; } #if (RTE_UART0 != 0) static int32_t UART0_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_SetModemControl (ARM_USART_MODEM_CONTROL control) { return UART_SetModemControl (control, uart[5]); } #endif /** \fn ARM_USART_MODEM_STATUS UART_GetModemStatus (UART_RESOURCES *uart) \brief Get USART Modem Status lines state. \param[in] uart Pointer to USART resources \return \ref ARM_USART_MODEM_STATUS */ static ARM_USART_MODEM_STATUS UART_GetModemStatus (UART_RESOURCES *uart) { ARM_USART_MODEM_STATUS mst = { 0, 0, 0, 0,}; return mst; } #if (RTE_UART0 != 0) static ARM_USART_MODEM_STATUS UART0_GetModemStatus (void) { return UART_GetModemStatus (uart[0]); } #endif #if (RTE_UART1 != 0) static ARM_USART_MODEM_STATUS UART1_GetModemStatus (void) { return UART_GetModemStatus (uart[1]); } #endif #if (RTE_UART2 != 0) static ARM_USART_MODEM_STATUS UART2_GetModemStatus (void) { return UART_GetModemStatus (uart[2]); } #endif #if (RTE_UART3 != 0) static ARM_USART_MODEM_STATUS UART3_GetModemStatus (void) { return UART_GetModemStatus (uart[3]); } #endif #if (RTE_UART4 != 0) static ARM_USART_MODEM_STATUS UART4_GetModemStatus (void) { return UART_GetModemStatus (uart[4]); } #endif #if (RTE_UART5 != 0) static ARM_USART_MODEM_STATUS UART5_GetModemStatus (void) { return UART_GetModemStatus (uart[5]); } #endif /** \fn int32_t UART_Control (uint32_t control, uint32_t arg, UART_RESOURCES *uart) \brief Control UART Interface. \param[in] control Operation \param[in] arg Argument of operation (optional) \param[in] uart Pointer to USART resources \return common \ref execution_status and driver specific \ref usart_execution_status */ static int32_t UART_Control (uint32_t control, uint32_t arg, UART_RESOURCES *uart) { switch (control & ARM_USART_CONTROL_Msk) { case ARM_USART_MODE_ASYNCHRONOUS: XMC_USIC_CH_SetBaudrate(uart->uart, arg, 16UL); break; case ARM_USART_MODE_SYNCHRONOUS_MASTER: return ARM_USART_ERROR_MODE; case ARM_USART_MODE_SYNCHRONOUS_SLAVE: return ARM_USART_ERROR_MODE; case ARM_USART_MODE_SINGLE_WIRE: XMC_UART_CH_Start(uart->uart); XMC_USIC_CH_SetBaudrate(uart->uart, arg, 16UL); // Configure TX pin uart->pin_tx_config->mode = (XMC_GPIO_MODE_t)(XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN | uart->pin_tx_alternate_function); #if(UC_FAMILY == XMC4) uart->pin_tx_config->output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_MEDIUM_EDGE; #endif break; case ARM_USART_MODE_IRDA: return ARM_USART_ERROR_MODE; case ARM_USART_MODE_SMART_CARD: return ARM_USART_ERROR_MODE; // Default TX value case ARM_USART_SET_DEFAULT_TX_VALUE: return ARM_USART_ERROR_MODE; // IrDA pulse case ARM_USART_SET_IRDA_PULSE: return ARM_USART_ERROR_MODE; // SmartCard guard time case ARM_USART_SET_SMART_CARD_GUARD_TIME: return ARM_USART_ERROR_MODE; // SmartCard clock case ARM_USART_SET_SMART_CARD_CLOCK: return ARM_USART_ERROR_MODE; // SmartCard NACK case ARM_USART_CONTROL_SMART_CARD_NACK: return ARM_USART_ERROR_MODE; // Control TX case ARM_USART_CONTROL_TX: if (arg) { XMC_UART_CH_Start(uart->uart); uart->info->flags |= UART_TX_ENABLED; if ((uart->info->mode != ARM_USART_MODE_SINGLE_WIRE )) { uart->pin_tx_config->mode =(XMC_GPIO_MODE_t)(XMC_GPIO_MODE_OUTPUT_PUSH_PULL | uart->pin_tx_alternate_function); } #if(UC_FAMILY == XMC4) uart->pin_tx_config->output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_MEDIUM_EDGE; #endif // Configure TX pin XMC_GPIO_Init(uart->pin_tx.port,uart->pin_tx.pin, uart->pin_tx_config); } else { uart->info->flags &= ~UART_TX_ENABLED; } return ARM_DRIVER_OK; // Control RX case ARM_USART_CONTROL_RX: XMC_UART_CH_Start(uart->uart); if (arg) { if ((uart->info->mode != ARM_USART_MODE_SINGLE_WIRE )) { // USART RX pin function selected uart->pin_rx_config->mode = XMC_GPIO_MODE_INPUT_PULL_UP; XMC_GPIO_Init(uart->pin_rx.port,uart->pin_rx.pin, uart->pin_rx_config); } uart->info->flags |= UART_RX_ENABLED; } else { uart->info->flags &= ~UART_RX_ENABLED; } return ARM_DRIVER_OK; // Control break case ARM_USART_CONTROL_BREAK: return ARM_USART_ERROR_MODE; // Abort Send case ARM_USART_ABORT_SEND: // Disable transmit holding register empty interrupt XMC_USIC_CH_TXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); XMC_USIC_CH_TXFIFO_Flush(uart->uart); // Clear Send active flag uart->info->status.tx_busy=0; return ARM_DRIVER_OK; // Abort receive case ARM_USART_ABORT_RECEIVE: // Disable receive data available interrupt XMC_USIC_CH_RXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_RXFIFO_EVENT_CONF_STANDARD); XMC_USIC_CH_RXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_RXFIFO_EVENT_CONF_ALTERNATE); XMC_USIC_CH_RXFIFO_Flush(uart->uart); // Clear RX busy status uart->info->status.rx_busy = 0; return ARM_DRIVER_OK; // Abort transfer case ARM_USART_ABORT_TRANSFER: return ARM_USART_ERROR_MODE; // Unsupported command default: return ARM_DRIVER_ERROR_UNSUPPORTED; } // Check if Receiver/Transmitter is busy if ( uart->info->status.rx_busy || (uart->info->status.tx_busy)) { return ARM_DRIVER_ERROR_BUSY; } // USART Data bits switch (control & ARM_USART_DATA_BITS_Msk) { case ARM_USART_DATA_BITS_5: XMC_UART_CH_SetWordLength(uart->uart, 5); XMC_UART_CH_SetFrameLength(uart->uart, 5); break; case ARM_USART_DATA_BITS_6: XMC_UART_CH_SetWordLength(uart->uart, 6); XMC_UART_CH_SetFrameLength(uart->uart, 6); case ARM_USART_DATA_BITS_7: XMC_UART_CH_SetWordLength(uart->uart, 7); XMC_UART_CH_SetFrameLength(uart->uart, 7); break; case ARM_USART_DATA_BITS_8: XMC_UART_CH_SetWordLength(uart->uart, 8); XMC_UART_CH_SetFrameLength(uart->uart, 8); break; case ARM_USART_DATA_BITS_9: XMC_UART_CH_SetWordLength(uart->uart, 9); XMC_UART_CH_SetFrameLength(uart->uart, 9); break; default: return ARM_USART_ERROR_DATA_BITS; } // UART Parity switch (control & ARM_USART_PARITY_Msk) { case ARM_USART_PARITY_NONE: uart->uart->CCR = XMC_USIC_CH_PARITY_MODE_NONE; break; case ARM_USART_PARITY_EVEN: uart->uart->CCR = XMC_USIC_CH_PARITY_MODE_EVEN; break; case ARM_USART_PARITY_ODD: uart->uart->CCR = XMC_USIC_CH_PARITY_MODE_ODD; break; } // USART Stop bits switch (control & ARM_USART_STOP_BITS_Msk) { case ARM_USART_STOP_BITS_1: uart->uart->PCR_ASCMode &= ~((uint32_t)USIC_CH_PCR_ASCMode_STPB_Msk); break; case ARM_USART_STOP_BITS_2: uart->uart->PCR_ASCMode &= ~((uint32_t)USIC_CH_PCR_ASCMode_STPB_Msk); uart->uart->PCR_ASCMode |= ((uint32_t)USIC_CH_PCR_ASCMode_STPB_Msk); break; default: return ARM_USART_ERROR_STOP_BITS; } // UART Flow Control switch (control & ARM_USART_FLOW_CONTROL_Msk) { default: break; } // UART Clock Polarity switch (control & ARM_USART_CPOL_Msk) { default: break; } // UART Clock Phase switch (control & ARM_USART_CPHA_Msk) { default: break; } return ARM_DRIVER_OK; } #if (RTE_UART0 != 0) static int32_t UART0_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[0]); } #endif #if (RTE_UART1 != 0) static int32_t UART1_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[1]); } #endif #if (RTE_UART2 != 0) static int32_t UART2_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[2]); } #endif #if (RTE_UART3 != 0) static int32_t UART3_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[3]); } #endif #if (RTE_UART4 != 0) static int32_t UART4_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[4]); } #endif #if (RTE_UART5 != 0) static int32_t UART5_Control (uint32_t control,uint32_t arg) { return UART_Control (control,arg,uart[5]); } #endif /** \fn void UART_IRQHandler (UART_RESOURCES *uart) \brief UART Interrupt handler. \param[in] uart Pointer to UART resources */ static void UART_IRQHandler (UART_RESOURCES *uart,uint8_t irq) { // Read interrupt if (uart->irq_rx_num== irq) { if(uart->rx_fifo_size_reg==NO_FIFO) { uart->info->xfer.rx_buf[uart->info->xfer.rx_cnt++] =(uint8_t)(uint8_t)XMC_UART_CH_GetReceivedData(uart->uart);; if(uart->info->xfer.rx_cnt == uart->info->xfer.rx_num) { // Clear RX busy flag and set receive transfer complete event uart->info->status.rx_busy = 0; XMC_USIC_CH_DisableEvent(uart->uart,XMC_USIC_CH_EVENT_ALTERNATIVE_RECEIVE); XMC_USIC_CH_DisableEvent(uart->uart,XMC_USIC_CH_EVENT_STANDARD_RECEIVE); if (uart->info->cb_event) uart->info->cb_event(ARM_USART_EVENT_RECEIVE_COMPLETE); } } else { while((XMC_USIC_CH_RXFIFO_IsEmpty(uart->uart) == false)) { /* Read the data from FIFO buffer */ uart->info->xfer.rx_buf[uart->info->xfer.rx_cnt++] =(uint8_t)XMC_UART_CH_GetReceivedData(uart->uart); if(uart->info->xfer.rx_cnt == uart->info->xfer.rx_num) { // Clear RX busy flag and set receive transfer complete event uart->info->status.rx_busy = 0; XMC_USIC_CH_RXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_RXFIFO_EVENT_CONF_STANDARD); XMC_USIC_CH_RXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_RXFIFO_EVENT_CONF_ALTERNATE); if (uart->info->cb_event) uart->info->cb_event(ARM_USART_EVENT_RECEIVE_COMPLETE); break; } } if( (uart->info->xfer.rx_num-uart->info->xfer.rx_cnt) < uart->rx_fifo_size_num) { XMC_USIC_CH_RXFIFO_Configure(uart->uart,uart->info->rx_fifo_pointer,(XMC_USIC_CH_FIFO_SIZE_t)uart->rx_fifo_size_reg,(uart->info->xfer.rx_num-uart->info->xfer.rx_cnt)- 1U); } else { XMC_USIC_CH_RXFIFO_Configure(uart->uart,uart->info->rx_fifo_pointer,(XMC_USIC_CH_FIFO_SIZE_t)uart->rx_fifo_size_reg,uart->rx_fifo_size_num - 1U); } } } // Transmit data register empty if (uart->irq_tx_num == irq) { if(uart->info->xfer.tx_num > uart->info->xfer.tx_cnt) { if(uart->rx_fifo_size_reg==NO_FIFO) { XMC_UART_CH_Transmit(uart->uart,uart->info->xfer.tx_buf[uart->info->xfer.tx_cnt++]); } else { /* Write to FIFO till Fifo is full */ while((XMC_USIC_CH_TXFIFO_IsFull(uart->uart) == false)) { if(uart->info->xfer.tx_num > uart->info->xfer.tx_cnt) { XMC_UART_CH_Transmit(uart->uart,uart->info->xfer.tx_buf[uart->info->xfer.tx_cnt++]); } else { break; } } } } else { if(XMC_USIC_CH_TXFIFO_IsEmpty(uart->uart) == true) { if(uart->rx_fifo_size_reg==NO_FIFO) { /* Disable standard transmit and error event interrupt */ XMC_USIC_CH_DisableEvent(uart->uart,XMC_USIC_CH_EVENT_TRANSMIT_BUFFER); } else { /* Disable standard transmit and error event interrupt */ XMC_USIC_CH_TXFIFO_DisableEvent(uart->uart,XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); } while((XMC_USIC_CH_GetTransmitBufferStatus(uart->uart)& XMC_USIC_CH_TBUF_STATUS_BUSY)); if (uart->info->cb_event) uart->info->cb_event(ARM_USART_EVENT_SEND_COMPLETE); // Clear TX busy flag uart->info->status.tx_busy=0; } } } } #if (RTE_UART0 != 0) void USIC0_0_IRQHandler() { UART_IRQHandler (uart[0],USIC0_0_IRQn ); } void USIC0_1_IRQHandler() { UART_IRQHandler (uart[0],USIC0_1_IRQn); } #endif #if (RTE_UART1 != 0) void USIC0_2_IRQHandler() { UART_IRQHandler (uart[1],USIC0_2_IRQn ); } void USIC0_3_IRQHandler() { UART_IRQHandler (uart[1],USIC0_3_IRQn); } #endif #if (RTE_UART2 != 0) void USIC1_0_IRQHandler() { UART_IRQHandler (uart[2],USIC1_0_IRQn ); } void USIC1_1_IRQHandler() { UART_IRQHandler (uart[2],USIC1_1_IRQn); } #endif #if (RTE_UART3 != 0) void USIC1_2_IRQHandler() { UART_IRQHandler (uart[3],USIC1_2_IRQn ); } void USIC1_3_IRQHandler() { UART_IRQHandler (uart[3],USIC1_3_IRQn); } #endif #if (RTE_UART4 != 0) void USIC2_0_IRQHandler() { UART_IRQHandler (uart[4],USIC2_0_IRQn ); } void USIC2_1_IRQHandler() { UART_IRQHandler (uart[4],USIC2_1_IRQn); } #endif #if (RTE_UART5 != 0) void USIC2_2_IRQHandler() { UART_IRQHandler (uart[5],USIC2_2_IRQn ); } void USIC2_3_IRQHandler() { UART_IRQHandler (uart[5],USIC2_3_IRQn); } #endif #if (RTE_UART0 != 0) ARM_DRIVER_USART Driver_USART0 = { USARTX_GetVersion, UART0_GetCapabilities, UART0_Initialize, UART0_Uninitialize, UART0_PowerControl, UART0_Send, UART0_Receive, UART0_Transfer, UART0_GetTxCount, UART0_GetRxCount, UART0_Control, UART0_GetStatus, UART0_SetModemControl, UART0_GetModemStatus }; #endif #if (RTE_UART1 != 0) ARM_DRIVER_USART Driver_USART1 = { USARTX_GetVersion, UART1_GetCapabilities, UART1_Initialize, UART1_Uninitialize, UART1_PowerControl, UART1_Send, UART1_Receive, UART1_Transfer, UART1_GetTxCount, UART1_GetRxCount, UART1_Control, UART1_GetStatus, UART1_SetModemControl, UART1_GetModemStatus }; #endif #if (RTE_UART2 != 0) ARM_DRIVER_USART Driver_USART2 = { USARTX_GetVersion, UART2_GetCapabilities, UART2_Initialize, UART2_Uninitialize, UART2_PowerControl, UART2_Send, UART2_Receive, UART2_Transfer, UART2_GetTxCount, UART2_GetRxCount, UART2_Control, UART2_GetStatus, UART2_SetModemControl, UART2_GetModemStatus }; #endif #if (RTE_UART3 != 0) ARM_DRIVER_USART Driver_USART3 = { USARTX_GetVersion, UART3_GetCapabilities, UART3_Initialize, UART3_Uninitialize, UART3_PowerControl, UART3_Send, UART3_Receive, UART3_Transfer, UART3_GetTxCount, UART3_GetRxCount, UART3_Control, UART3_GetStatus, UART3_SetModemControl, UART3_GetModemStatus }; #endif #if (RTE_UART4 != 0) ARM_DRIVER_USART Driver_USART4 = { USARTX_GetVersion, UART4_GetCapabilities, UART4_Initialize, UART4_Uninitialize, UART4_PowerControl, UART4_Send, UART4_Receive, UART4_Transfer, UART4_GetTxCount, UART4_GetRxCount, UART4_Control, UART4_GetStatus, UART4_SetModemControl, UART4_GetModemStatus }; #endif #if (RTE_UART5 != 0) ARM_DRIVER_USART Driver_USART5 = { USARTX_GetVersion, UART5_GetCapabilities, UART5_Initialize, UART5_Uninitialize, UART5_PowerControl, UART5_Send, UART5_Receive, UART5_Transfer, UART5_GetTxCount, UART5_GetRxCount, UART5_Control, UART5_GetStatus, UART5_SetModemControl, UART5_GetModemStatus }; #endif