|
|
|
#include "app_uart.h"
|
|
|
|
#include "app_ring_buffer.h"
|
|
|
|
#include "sw_timer.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static uart_req_t App_Uart_Read_Req;;
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t TxBuffer[APP_UART_TX_BUFFER_SIZE];
|
|
|
|
static uint8_t RxBuffer[APP_UART_RX_BUFFER_SIZE];
|
|
|
|
static uint8_t RxData;
|
|
|
|
|
|
|
|
static RING_BUFFER Tx_RingBuffer;
|
|
|
|
static RING_BUFFER Rx_RingBuffer;
|
|
|
|
static int32_t UartError = E_NO_ERROR;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void App_Uart_Interrupt_Handler(void);
|
|
|
|
static void App_Uart_Data_Transmit_Check(void);
|
|
|
|
static void App_Uart_Read_Callback_Initialization(void);
|
|
|
|
static void App_Uart_Read_Callback(uart_req_t* req, int error);
|
|
|
|
|
|
|
|
|
|
|
|
int fputc( int ch, FILE* f )
|
|
|
|
{
|
|
|
|
RingBuffer_Enqueue(&Tx_RingBuffer, ch);
|
|
|
|
//UART_WriteByte(UART_App_INSTANCE, ch);
|
|
|
|
return( ch );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t App_Uart_Initialization(void)
|
|
|
|
{
|
|
|
|
mxc_uart_regs_t* uart = APP_UART_INSTANCE;
|
|
|
|
const sys_cfg_uart_t sys_uart_cfg =
|
|
|
|
{
|
|
|
|
APP_UART_ALTERNATE,
|
|
|
|
UART_FLOW_DISABLE,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* Initialize the UART */
|
|
|
|
uart_cfg_t cfg;
|
|
|
|
cfg.parity = UART_PARITY_DISABLE;
|
|
|
|
cfg.size = UART_DATA_SIZE_8_BITS;
|
|
|
|
cfg.stop = UART_STOP_1;
|
|
|
|
cfg.flow = UART_FLOW_CTRL_DIS;
|
|
|
|
cfg.pol = UART_FLOW_POL_DIS;
|
|
|
|
cfg.baud = APP_UART_BAUDRATE;
|
|
|
|
|
|
|
|
while (!(uart->status & MXC_F_UART_STATUS_TX_EMPTY))
|
|
|
|
{
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize the UART
|
|
|
|
if ((UartError = UART_Init(uart, &cfg, &sys_uart_cfg)) != E_NO_ERROR)
|
|
|
|
{
|
|
|
|
return UartError;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(uart == MXC_UART0)
|
|
|
|
{
|
|
|
|
NVIC_ClearPendingIRQ(UART0_IRQn);
|
|
|
|
NVIC_DisableIRQ(UART0_IRQn);
|
|
|
|
NVIC_SetVector(UART0_IRQn, App_Uart_Interrupt_Handler);
|
|
|
|
NVIC_EnableIRQ(UART0_IRQn);
|
|
|
|
}
|
|
|
|
else if(uart == MXC_UART1)
|
|
|
|
{
|
|
|
|
NVIC_ClearPendingIRQ(UART1_IRQn);
|
|
|
|
NVIC_DisableIRQ(UART1_IRQn);
|
|
|
|
NVIC_SetVector(UART1_IRQn, App_Uart_Interrupt_Handler);
|
|
|
|
NVIC_EnableIRQ(UART1_IRQn);
|
|
|
|
}
|
|
|
|
|
|
|
|
UART_ClearFlags (uart, 0xFFFFFFFF);
|
|
|
|
//MXC_UART_EnableInt (uart, MXC_F_UART_REVA_INT_EN_RX_FIFO_THRESH|MXC_F_UART_REVA_INT_EN_TX_FIFO_ALMOST_EMPTY);
|
|
|
|
|
|
|
|
RingBuffer_Initialization(&Tx_RingBuffer, true, APP_UART_TX_BUFFER_SIZE, TxBuffer);
|
|
|
|
RingBuffer_Initialization(&Rx_RingBuffer, true, APP_UART_RX_BUFFER_SIZE, RxBuffer);
|
|
|
|
|
|
|
|
App_Uart_Read_Callback_Initialization();
|
|
|
|
|
|
|
|
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 0, App_Uart_Data_Transmit_Check);
|
|
|
|
return E_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void App_Uart_Read_Callback_Initialization(void)
|
|
|
|
{
|
|
|
|
App_Uart_Read_Req.data = &RxData;
|
|
|
|
App_Uart_Read_Req.len = 1;
|
|
|
|
App_Uart_Read_Req.callback = App_Uart_Read_Callback;
|
|
|
|
UART_ReadAsync(APP_UART_INSTANCE, &App_Uart_Read_Req);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void App_Uart_Interrupt_Handler(void)
|
|
|
|
{
|
|
|
|
UART_Handler(APP_UART_INSTANCE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void App_Uart_Read_Callback(uart_req_t* req, int error)
|
|
|
|
{
|
|
|
|
RingBuffer_Enqueue(&Rx_RingBuffer, RxData);
|
|
|
|
App_Uart_Read_Callback_Initialization();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void App_Uart_Data_Transmit_Check(void)
|
|
|
|
{
|
|
|
|
if(RingBuffer_Get_DataSize(&Tx_RingBuffer) != 0 && UART_Busy(APP_UART_INSTANCE) == E_NO_ERROR)
|
|
|
|
{
|
|
|
|
uint8_t TxData;
|
|
|
|
RingBuffer_GetData(&Tx_RingBuffer, &TxData);
|
|
|
|
UART_WriteByte(APP_UART_INSTANCE, TxData);
|
|
|
|
RingBuffer_PopData(&Tx_RingBuffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int32_t App_Uart_Transmit(uint8_t TxData)
|
|
|
|
{
|
|
|
|
RingBuffer_Enqueue(&Tx_RingBuffer, TxData);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t App_Uart_Transmit_Len(uint8_t* pTxBuffer, uint16_t TxLen)
|
|
|
|
{
|
|
|
|
uint32_t i;
|
|
|
|
for(i = 0 ; i < TxLen ; i++)
|
|
|
|
App_Uart_Transmit(pTxBuffer[i]);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t App_Uart_Print(uint8_t* pTxBuffer)
|
|
|
|
{
|
|
|
|
uint32_t index = 0;
|
|
|
|
while(pTxBuffer[index] != NULL)
|
|
|
|
{
|
|
|
|
App_Uart_Transmit(pTxBuffer[index]);
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int32_t App_Uart_Get_Last_Error(void)
|
|
|
|
{
|
|
|
|
return UartError;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool App_Uart_Get_Recv_Data(uint8_t* pRxData)
|
|
|
|
{
|
|
|
|
if(RingBuffer_Get_DataSize(&Rx_RingBuffer) == 0)
|
|
|
|
return false;
|
|
|
|
return RingBuffer_Dequeue(&Rx_RingBuffer, pRxData);
|
|
|
|
}
|
|
|
|
|
|
|
|
int printf_none(const char *fmt, ...)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|