/**
******************************************************************************************************************************************************************************************
*@file                       cpu_uart.c
*@author         
*@data                       
*@version                    v1.0
*@par Copyright(c):
*
*@par History:
*     version:author,date,desc
*     v1.0   :create this file
*
*******************************************************************************************************************************************************************************************
*/

#include "cpu_uart.h"
#include "cpu_sysctrl.h"

/*******************************************************************************
* 函数名   : uart_init
* 说明     : uart 的初始化
* 参数     : -uartx,        	  uart串口,UART0、UART1
             -uart_init_struct,   uart参数配置，参考 uart_fifo_struct 定义
* 返回值   : None.
* 示例     : uart_init(UART1, &uart_init_structure);	
*******************************************************************************/
void uart_init(uart_typedef_t* uartx, uart_init_struct* uart_init_structure)
{
	uint32_t tmpBaudRate;
	
	// LCR = 1.
	uartx->LCR |= UART_LCR_DLAB;
	
	tmpBaudRate = SystemCoreClock * 1.0 /16/uart_init_structure->uart_baudrate + 0.5;
	uartx->SEL0.DLL = (tmpBaudRate & 0x00FF);
	uartx->SEL1.DLH = ((tmpBaudRate >> 8) & 0x00FF);	
	// LCR = 0.
	uartx->LCR &= ~UART_LCR_DLAB;
	
	uartx->LCR = uart_init_structure->uart_word_len | uart_init_structure->uart_stop_bits | uart_init_structure->uart_parity;
}


/*******************************************************************************
* 函数名   : uart_auto_flow_ctrl_cmd
* 说明     : uart自动流控使能
* 参数     : -uartx,        uart串口,UART0、UART1
             -new_state,    使能或不使能,参考 functional_state_t 定义 
* 返回值   : None.
* 示例     : uart_auto_flow_ctrl_cmd(UART1, ENABLE);	
*******************************************************************************/
void uart_auto_flow_ctrl_cmd(uart_typedef_t* uartx, functional_state_t new_state)
{
	if (DISABLE != new_state)
	{
		uartx->MCR |= UART_MCR_AFCE;
	}
	else
	{
		uartx->MCR &= ~UART_MCR_AFCE;
	}
}

/*******************************************************************************
* 函数名   : uart_it_config
* 说明     : uart中断配置
* 参数     : -uartx,        uart串口,UART0、UART1
			 -uart_it,	    中断类型，参考 cpu_uart.h 定义
             -new_state,    使能或不使能,参考 functional_state_t 定义
* 返回值   : None
* 示例     : uart_it_config(UART1,UART_IT_RX_RECVD,ENABLE);	
*******************************************************************************/
void uart_it_config(uart_typedef_t* uartx, uint32_t uart_it, functional_state_t new_state)
{
	// IER register can be accessed only when the DLAB bit (LCR[7]) is cleared.
	uartx->LCR &= ~UART_LCR_DLAB;
	if(new_state)
	{
		uartx->SEL1.IER |= uart_it;
	}
	else
	{
		uartx->SEL1.IER &= ~uart_it;
	}
}

/*******************************************************************************
* 函数名   : uart_send_data
* 说明     : uart数据发送
* 参数     : -uartx,   uart串口,UART0、UART1
             -data,    发送的数据
* 返回值   : None
* 示例     : uart_send_data(UART1,'s');
*******************************************************************************/
void uart_send_data(uart_typedef_t* uartx, uint8_t data)
{
	
	uartx->SEL0.THR = (data & 0xFF);
}

/*******************************************************************************
* 函数名   : uart_is_tx_empty
* 说明     : uart接收为空
* 参数     : -uartx,  uart串口,UART0、UART1
* 返回值   : TRUE     表示发送移位寄存器（TSR）和发送保持寄存器（THR）同时为空
	         FALSE 	  表示发送移位寄存器（TSR）或发送保持寄存器（THR）不为空
* 示例     : uart_is_tx_empty(UART1);
*******************************************************************************/
boolean uart_is_tx_empty(uart_typedef_t* uartx)
{
	if(uartx == UART0)
	{
	    if ((uartx->LSR & UART_LSR_TEMT) || ((CRM->CG_CTRL & CRM_PeriphClock_UART0) != CRM_PeriphClock_UART0))
	    {
	        return TRUE;
	    }
	    else
	    {
	        return FALSE;
	    }
	}
	else if(uartx == UART1)
	{
	    if ((uartx->LSR & UART_LSR_TEMT) || ((CRM->CG_CTRL & CRM_PeriphClock_UART1) != CRM_PeriphClock_UART1))
	    {
	        return TRUE;
	    }
	    else
	    {
	        return FALSE;
	    }
	}
	return TRUE;
}


/*******************************************************************************
* 函数名   : uart_fifo_cmd
* 说明     : uart fifo使能
* 参数     : -uartx,        uart串口,UART0、UART1
             -new_state,    使能或不使能,参考 functional_state_t 定义
* 返回值   : None
* 示例     : uart_fifo_cmd(UART1, ENABLE);
*******************************************************************************/
void uart_fifo_cmd(uart_typedef_t* uartx,functional_state_t new_state)
{
	/* FCR Write Only So Here we Use FCR Shadow Register SFE(WR) */
	if (DISABLE != new_state)
		uartx->SFE |= UART_SFE_SHADOW_FIFO_ENABLE;
	else
		uartx->SFE &= ~UART_SFE_SHADOW_FIFO_ENABLE;
}

/*******************************************************************************
* 函数名   : uart_is_received_data_ready
* 说明     : uart接收数据就绪
* 参数     : -uartx,  uart串口,UART0、UART1
* 返回值   : TRUE     表示有有效数据
	         FALSE    表示没有有效数据
* 示例     : uart_is_received_data_ready(UART1);
*******************************************************************************/
boolean uart_is_received_data_ready(uart_typedef_t * uartx)
{
	if(uartx->LSR & UART_LSR_DR)
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_receive_data
* 说明     : uart接收数据
* 参数     : -uartx,  uart串口,UART0、UART1
* 返回值   : None
* 示例     : uart_receive_data(UART1);
*******************************************************************************/
uint8_t uart_receive_data(uart_typedef_t* uartx)
{
	return (uint8_t)(uartx->SEL0.RBR & 0xFF);
}

/*******************************************************************************
* 函数名   : uart_set_rts
* 说明     : rts使能
* 参数     : -uartx,  uart串口,UART0、UART1
* 返回值   : None
* 示例     : uart_set_rts(UART1);
*******************************************************************************/
void uart_set_rts(uart_typedef_t* uartx)
{
	uartx->MCR |= UART_MCR_RTS;
}

/*******************************************************************************
* 函数名   : uart_reset_rts
* 说明     : rts不使能
* 参数     : -uartx,  uart串口,UART0、UART1
* 返回值   : None
* 示例     : uart_reset_rts(UART1);
*******************************************************************************/
void uart_reset_rts(uart_typedef_t* uartx)
{
	uartx->MCR &= ~UART_MCR_RTS;
}

/*******************************************************************************
* 函数名   : uart_fifo_set_trigger_level
* 说明     : 设置uart fifo触发阈值
* 参数     : -uartx,     	uart串口,UART0、UART1
			 -tx_trigger,   发送FIFO的触发阈值
             -rx_trigger,   接收FIFO满触发的阈值
* 返回值   : None
* 示例     : uart_fifo_set_trigger_level(UART1,2,4);
*******************************************************************************/
void uart_fifo_set_trigger_level(uart_typedef_t* uartx,uint32_t tx_trigger,uint32_t rx_trigger)
{
	uartx->SRT = rx_trigger;
	uartx->STET = tx_trigger;
	
}

/*******************************************************************************
* 函数名   : uart_get_ti_dentity
* 说明     : 获取中断状态
* 参数     : -uartx,   uart串口,UART0、UART1
* 返回值   : 中断状态
* 示例     : uart_get_ti_dentity(UART1);
*******************************************************************************/
uint32_t uart_get_ti_dentity(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	//return (uartx->OFFSET_8.IIR);
	return( uartx->SEL2.IIR );
}

/*******************************************************************************
* 函数名   : uart_get_line_status
* 说明     : 获取串口line状态
* 参数     : -uartx,   uart串口,UART0、UART1
* 返回值   : line状态
* 示例     : uart_get_line_status(UART1);
*******************************************************************************/
uint32_t uart_get_line_status(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	return (uartx->LSR);
}


/*******************************************************************************
* 函数名   : uart_structinit
* 说明     : uart初始化
* 参数     : -uart_init_struct   uart的参数配置,参考 uart_fifo_struct 定义
* 返回值   : None
* 示例     : uart_get_line_status(&uart_init_struct);
*******************************************************************************/
void uart_struct_init(uart_init_struct* uart_init_struct)
{
	/* uart_init_struct members default value */
	uart_init_struct->uart_baudrate = 9600;
	uart_init_struct->uart_word_len = UART_WordLength_5b;
	uart_init_struct->uart_stop_bits = UART_StopBits_1;
	uart_init_struct->uart_parity = UART_Parity_No ;
}

/*******************************************************************************
* 函数名   : uart_fifo_init
* 说明     : uart fifo初始化
* 参数     : -uart        				uart串口,UART0、UART1
			 -uart_fifo_init_struct 	uart fifo的结构体类型,参考 uart_fifo_struct 定义
* 返回值   : None
* 示例     : uart_fifo_init(uart1,&uart_fifo_init_struct);
*******************************************************************************/
void uart_fifo_init(uart_typedef_t* uartx, uart_fifo_struct* uart_fifo_init_struct)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	/**************************  FIFO Tx Interrupt Config ******************************/

	if (DISABLE != uart_fifo_init_struct->FIFO_TX_TriggerIntEnable)
		uartx->SEL1.IER |= UART_IER_PTIME;
	else
		uartx->SEL1.IER &= ~UART_IER_PTIME;

	/**************************  FIFO Config ******************************/
	
	/* FCR Write Only So Here we Use FCR Shadow Register SDMAM(WR) */
	if (uartx->SFE | UART_SFE_SFE)
		uartx->SFE &= ~UART_SFE_SFE;

	if (UART_FIFO_DMA_Mode_0 == uart_fifo_init_struct->FIFO_DMA_Mode)
	{
		uartx->SDMAM &= ~UART_SDMAM_SDMAM;
	}
	else if(UART_FIFO_DMA_Mode_1 == uart_fifo_init_struct->FIFO_DMA_Mode)
	{
		uartx->SDMAM |= UART_SDMAM_SDMAM;
	}

	/* FCR Write Only So Here we Use FCR Shadow Register SRT and STET(WR) */
	uartx->SRT = uart_fifo_init_struct->FIFO_RX_Trigger;
	uartx->STET = uart_fifo_init_struct->FIFO_TX_Trigger;

	if (DISABLE != uart_fifo_init_struct->FIFO_Enable)
		uartx->SFE |= UART_SFE_SFE;
	else
		uartx->SFE &= ~UART_SFE_SFE;
}

/*******************************************************************************
* 函数名   : uart_fifo_structinit
* 说明     : uart fifo初始化
* 参数     : -uart_fifo_init_struct       uart fifo的结构体类型,参考 uart_fifo_struct 定义
* 返回值   : None
* 示例     : uart_fifo_structinit(&uart_fifo_init_struct);
*******************************************************************************/
void uart_fifo_struct_init(uart_fifo_struct* uart_fifo_init_struct)
{
	uart_fifo_init_struct->FIFO_Enable = DISABLE;
	uart_fifo_init_struct->FIFO_DMA_Mode = UART_FIFO_DMA_Mode_0;
	uart_fifo_init_struct->FIFO_RX_Trigger = UART_FIFO_RX_Trigger_1_2_Full;
	uart_fifo_init_struct->FIFO_TX_Trigger = UART_FIFO_TX_Trigger_1_2_Full;
	uart_fifo_init_struct->FIFO_TX_TriggerIntEnable = DISABLE;
}

/*******************************************************************************
* 函数名   : uart_is_tx_fifo_trigger
* 说明     : uart fifo发送触发
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			使能THRE中断
			 FALSE			未使能THRE中断
* 示例     : uart_is_tx_fifo_trigger(UART1);
*******************************************************************************/
boolean uart_is_tx_fifo_trigger(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->LSR & UART_LINE_STATUS_TX_HOLDING_REGISTER_EMPTY))
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_is_rx_fifo_full
* 说明     : uart接收fifo满
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			接收FIFO满
			 FALSE			接收FIFO未满
* 示例     : uart_is_tx_fifo_trigger(UART1);
*******************************************************************************/
boolean uart_is_rx_fifo_full(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->USR & UART_STATUS_RX_FIFO_FULL))
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_is_rx_fifo_no_empty
* 说明     : uart接收fifo不为空
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			接收FIFO非空
			 FALSE			接收FIFO空
* 示例     : uart_is_rx_fifo_no_empty(UART1);
*******************************************************************************/
boolean uart_is_rx_fifo_no_empty(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->USR & UART_STATUS_RX_FIFO_NOT_EMPTY))
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_is_tx_fifo_empty
* 说明     : uart发送fifo为空
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			发送FIFO空
			 FALSE			发送FIFO非空
* 示例     : uart_is_tx_fifo_empty(UART1);
*******************************************************************************/
boolean uart_is_tx_fifo_empty(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->USR & UART_STATUS_TX_FIFO_EMPTY))
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_is_tx_fifo_not_full
* 说明     : uart发送fifo未满
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			发送FIFO未满
			 FALSE			发送FIFO已满
* 示例     : uart_is_tx_fifo_not_full(UART1);
*******************************************************************************/
boolean uart_is_tx_fifo_not_full(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->USR & UART_STATUS_TX_FIFO_NOT_FULL))
		return TRUE;
	else
		return FALSE;
}

/*******************************************************************************
* 函数名   : uart_is_uart_busy
* 说明     : uart忙
* 参数     : -uartx,        uart串口,UART0、UART1
* 返回值   : TRUE			UART外设忙（正在进行串行数据传输）
			 FALSE			UART外设空闲或不活动
* 示例     : uart_is_uart_busy(UART1);
*******************************************************************************/
boolean uart_is_uart_busy(uart_typedef_t* uartx)
{
	assert_param(IS_UART_ALL_PERIPH(uartx));
	if (0 != (uartx->USR & UART_STATUS_BUSY))
		return TRUE;
	else
		return FALSE;
}

