⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsuartdrv.c

📁 usb 检验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -