📄 xsuartdrv.c
字号:
#include "XsUartDrv.h"
#include "XsUartRegs.h"
#include "RegCtl.h"
#include "XsGpioDrv.h"
#include "SitsangBrdRegs.h"
#include "XsClkMgrDrv.h"
#include "SitsangBrdDrv.h"
#include "UtilFunc.h"
#include "stdio.h"
unsigned int g_DefaultUartDevice = UART_FF;
unsigned int g_UartRegs = FFUARTREG_PHY_BASE_ADDR;
/*
** internal function declare
*/
void XsUartDrv_InitGpio(UartDeviceT Device);
/**
* Initialize the UART for working on polling mode , default to 8N1/38400 baud rate
note: run this function in physical addressing mode,
**/
void XsUartDrv_InitDefault1(volatile UartRegsT *pUart)
{
unsigned int divisor;
unsigned int value;
//set GPIO direction
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO34_OFS, XS_GPIO_DIR_IN); // GP34-38 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO35_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO36_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO37_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO38_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO39_OFS, XS_GPIO_DIR_OUT); //GP39,GP40,GP41 as output
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO40_OFS, XS_GPIO_DIR_OUT);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO41_OFS, XS_GPIO_DIR_OUT);
//set GPIO pin function
//these macros equal to LOAD_FIELD(GPIO_GAFR1_L_ADDR, 0xa955, 4, 16);
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF34_OFS, XS_GPIO_ALT_FUNC_1); //FFRXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF35_OFS, XS_GPIO_ALT_FUNC_1); //CTS
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF36_OFS, XS_GPIO_ALT_FUNC_1); //DCD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF37_OFS, XS_GPIO_ALT_FUNC_1); //DSR
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF38_OFS, XS_GPIO_ALT_FUNC_1); //RI
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF39_OFS, XS_GPIO_ALT_FUNC_2); //FFTXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF40_OFS, XS_GPIO_ALT_FUNC_2); //DTR
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF41_OFS, XS_GPIO_ALT_FUNC_2); //RTS
//enable clock
CLKMGR_ENABLE_CLK(CKEN_CK_FFUART_OFS);
// clear sticky status first
pUart->LCR = 0x0;
pUart->FCR = 0x0;
pUart->MCR = 0x0;
pUart->ISR = 0x0;
pUart->IER = 0x0;
// Clear the Rx FIFO
pUart->FCR = FCR_TRFIFOE | FCR_RESETRF;
// Clear the Tx FIFO
pUart->FCR = FCR_TRFIFOE | FCR_RESETTF;
// Set Serial Line Control Register (LCR)
// DLAB = 1
pUart->LCR = LCR_DLAB1 | LCR_WLS8;
// To Configure the baud rate generators for UART:
// DLAB = 1 to access DLL and DLH
// Load DLL and DLH with divisor (divisor = 8 for 115200)
// DLAB = 0
divisor = 14745600 / (16 * BAUD_RATE_DEFAULT);
if (divisor < FFDIVISOR_MIN )
divisor = FFDIVISOR_MIN;
//DLL index equals UDATA, DLH index equals IER
pUart->DLL_FIELD = divisor & 0xff;
pUart->DLH_FIELD = (divisor & 0xff00) >> 8;
pUart->LCR &= ~LCR_DLAB1;
// Close loop back mode
pUart->MCR &= ~MCR_LOOP;
pUart->MCR |= MCR_DTR | MCR_RTS | MCR_OUT2; //????????
// Read MSR once to clear delta bits (bits 3:0)
value = pUart->MSR;
// Enable FIFOs and reset FIFOs and set interrupt trigger level
pUart->FCR = FCR_TRFIFOE| FCR_RESETRF| FCR_RESETTF;
// Disable DMA, configure NRZ, IRQ, and enable UART unit
// Just make sure that DMA is disabled and UART is enabled
pUart->IER = IER_UUE;
//enable device power and periphery device
SET_BIT(BRD_PCR_ADDR, PCR_RS232_ON_OFS);
SET_BIT(BRD_PCR_ADDR, PCR_PER_ON_OFS);
} //XsUartDrv_InitDefault
// Init the UART1 port with parameters
void XsUartDrv_Init(volatile UartRegsT *pUart, UartDeviceT Device, unsigned int BaudRate, UartBitsT Bits, UartParityT Parity, UartStopBitT Stop, UartFlowControlT FlowCtrl)
{
unsigned int divisor;
unsigned int value;
unsigned int lcr_temp;
//init global variable
g_UartRegs = FFUARTREG_PHY_BASE_ADDR;
//set GPIO pin
XsUartDrv_InitGpio(Device);
//enable clock
if(Device == UART_FF)
CLKMGR_ENABLE_CLK(CKEN_CK_FFUART_OFS);
else if(Device == UART_BT)
CLKMGR_ENABLE_CLK(CKEN_CK_BTUART_OFS);
else if(Device == UART_STD)
CLKMGR_ENABLE_CLK(CKEN_CK_STUART_OFS);
else if(Device == UART_IRDA)
CLKMGR_ENABLE_CLK(CKEN_CK_STUART_OFS); //also enable STD UART
// clear sticky status first
pUart->LCR = 0x0;
pUart->FCR = 0x0;
pUart->MCR = 0x0;
pUart->ISR = 0x0;
pUart->IER = 0x0;
// Clear the Rx FIFO
pUart->FCR = FCR_TRFIFOE | FCR_RESETRF;
// Clear the Tx FIFO
pUart->FCR = FCR_TRFIFOE | FCR_RESETTF;
//Handle parameters
lcr_temp = 0;
ASSIGN_BIT_VAL(&lcr_temp, LCR_PEN_OFS, (Parity==UART_PARITY));
ASSIGN_BIT_VAL(&lcr_temp, LCR_STB_OFS, (Stop==UART_TWOSTOPBITS));
LOAD_FIELD(&lcr_temp, (UART_5BITS + (Bits - UART_5BITS)), LCR_WLS_OFS, LCR_WLS_SZ);
// Set Serial Line Control Register (LCR)
// DLAB = 1
pUart->LCR = LCR_DLAB1 | lcr_temp;
// To Configure the baud rate generators for UART:
// DLAB = 1 to access DLL and DLH
// Load DLL and DLH with divisor (divisor = 8 for 115200)
// DLAB = 0
divisor = 14745600 / (16 * BaudRate);
if (divisor < FFDIVISOR_MIN )
divisor = FFDIVISOR_MIN;
//DLL index equals UDATA, DLH index equals IER
pUart->DLL_FIELD = divisor & 0xff;
pUart->DLH_FIELD = (divisor & 0xff00) >> 8;
pUart->LCR &= ~LCR_DLAB1;
// Close loop back mode
pUart->MCR &= ~MCR_LOOP;
pUart->MCR |= MCR_DTR | MCR_RTS | MCR_OUT2; //????????
// Read MSR once to clear delta bits (bits 3:0)
value = pUart->MSR;
// Enable FIFOs and reset FIFOs and set interrupt trigger level
pUart->FCR = FCR_TRFIFOE| FCR_RESETRF| FCR_RESETTF;
// Disable DMA, configure NRZ, IRQ, and enable UART unit
// Just make sure that DMA is disabled and UART is enabled
pUart->IER = IER_UUE;
} //XsUartDrv_Init
/*
** init UART device GPIO pin
*/
void XsUartDrv_InitGpio(UartDeviceT Device)
{
if( (Device != UART_FF) &&
(Device != UART_BT) &&
(Device != UART_STD) &&
(Device != UART_IRDA)
)
Device = UART_FF;
if(Device == UART_FF)
{
//set GPIO direction
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO34_OFS, XS_GPIO_DIR_IN); // GP34-38 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO35_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO36_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO37_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO38_OFS, XS_GPIO_DIR_IN);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO39_OFS, XS_GPIO_DIR_OUT); //GP39,GP40,GP41 as output
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO40_OFS, XS_GPIO_DIR_OUT);
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO41_OFS, XS_GPIO_DIR_OUT);
//set GPIO pin function
//these macros equal to LOAD_FIELD(GPIO_GAFR1_L_ADDR, 0xa955, 4, 16);
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF34_OFS, XS_GPIO_ALT_FUNC_1); //FFRXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF35_OFS, XS_GPIO_ALT_FUNC_1); //CTS
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF36_OFS, XS_GPIO_ALT_FUNC_1); //DCD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF37_OFS, XS_GPIO_ALT_FUNC_1); //DSR
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF38_OFS, XS_GPIO_ALT_FUNC_1); //RI
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF39_OFS, XS_GPIO_ALT_FUNC_2); //FFTXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF40_OFS, XS_GPIO_ALT_FUNC_2); //DTR
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF41_OFS, XS_GPIO_ALT_FUNC_2); //RTS
}
else if(Device == UART_BT)
{
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO42_OFS, XS_GPIO_DIR_IN); // BTRXD/GP42 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO43_OFS, XS_GPIO_DIR_OUT); // BTTXD/GP43 as output
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO44_OFS, XS_GPIO_DIR_IN); // CTS/GP44 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO45_OFS, XS_GPIO_DIR_OUT); // RTS/GP45 as output
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF42_OFS, XS_GPIO_ALT_FUNC_1); //BTRXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF43_OFS, XS_GPIO_ALT_FUNC_2); //BTTXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF44_OFS, XS_GPIO_ALT_FUNC_1); //CTS
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF45_OFS, XS_GPIO_ALT_FUNC_2); //RTS
}
else if(Device == UART_STD)
{
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO46_OFS, XS_GPIO_DIR_IN); // RXD/GP46 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO47_OFS, XS_GPIO_DIR_OUT); // TXD/GP47 as output
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF46_OFS, XS_GPIO_ALT_FUNC_2); //RXD
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF47_OFS, XS_GPIO_ALT_FUNC_1); //TXD
}
else if(Device == UART_IRDA)
{
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO46_OFS, XS_GPIO_DIR_IN); // RXD(ICP)/GP46 as input
ASSIGN_BIT_VAL(GPIO_GPDR1_ADDR, GXXR_GPIO47_OFS, XS_GPIO_DIR_OUT); // TXD(ICP)/GP47 as output
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF46_OFS, XS_GPIO_ALT_FUNC_1); //RXD(ICP)
GPIO_SET_ALT_FUNC(GPIO_GROUP2, GAFR_AF47_OFS, XS_GPIO_ALT_FUNC_2); //TXD(ICP)
}
}
void XsUartDrv_SetDefaultUartDevice(UartDeviceT Device)
{
switch(Device)
{
case UART_FF:
g_UartRegs = FFUARTREG_PHY_BASE_ADDR;
break;
case UART_BT:
g_UartRegs = BTUARTREG_PHY_BASE_ADDR;
break;
case UART_STD:
g_UartRegs = STUARTREG_PHY_BASE_ADDR;
break;
case UART_IRDA:
g_UartRegs = STUARTREG_PHY_BASE_ADDR;
break;
default:
g_UartRegs = FFUARTREG_PHY_BASE_ADDR;
break;
}
}
/*
** send a char using FFUART's physical register
*/
void XsUartDrv_SendChar_Phy(char *pch)
{
FFUART_FFTHR = *pch;
while( !(GET_BIT(FFUART_FFLSR_ADDR, LSR_TEMT_OFS)) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -