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

📄 uartdrv.cpp

📁 coldfire5206芯片的boot程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
so, the value returned must be str_len or 0
*/
INT16  FpgaUartWriteString( UINT16 fpga_uart_index, UCHAR* string, UINT16 str_len)
{
	FPGAUARTALLINFO& uart_all_info = gFpgaUartInfoTable[fpga_uart_index];
	INT16   bytes_to_be_written;
	INT16   bytes_be_written;

	UCHAR *transmit_out_ptr = uart_all_info.transmitOutPtr;

	// return immediately if no bytes to be transmitted
	if (0 == str_len)
		return 0;

	// Calculate the free buffer number
	if (uart_all_info.transmitInPtr >= transmit_out_ptr)
		bytes_to_be_written =  (uart_all_info.transmitBufTail - uart_all_info.transmitBufHead)
		- (uart_all_info.transmitInPtr - transmit_out_ptr);
	else
		bytes_to_be_written = transmit_out_ptr - uart_all_info.transmitInPtr - 1;

	// return if buffer is not enough.
	if (bytes_to_be_written < str_len)
		return 0;

	bytes_to_be_written = str_len;

	bytes_be_written = bytes_to_be_written;

	/* A optimized algorithm for copying data to transmitter buffer,
	the boundary checking is cancelled.
	if ( (uart_all_info.transmitBufTail - uart_all_info.transmitInPtr + 1) <= bytes_to_be_written)
	{
	bytes_to_be_written -= uart_all_info.transmitBufTail - uart_all_info.transmitInPtr + 1;

	while (uart_all_info.transmitInPtr <= uart_all_info.transmitBufTail)
	*uart_all_info.transmitInPtr ++ = *string ++;

	uart_all_info.transmitInPtr = uart_all_info.transmitBufHead;
	}

	// Copy string to transmitter buffer
	while (0 < bytes_to_be_written)
	{
	*uart_all_info.transmitInPtr ++ = *string ++;
	bytes_to_be_written --;
	}*/

	// Copy string to transmitter buffer
	while (0 < bytes_to_be_written)
	{
		*uart_all_info.transmitInPtr ++ = *string ++;

		if (uart_all_info.transmitInPtr > uart_all_info.transmitBufTail)
			uart_all_info.transmitInPtr = uart_all_info.transmitBufHead;

		bytes_to_be_written --;
	}


	uart_all_info.isTxBufferEmpty = FALSE;

	uart_all_info.set |= 0x082; 
	*(uart_all_info.cr) = uart_all_info.set;

	return bytes_be_written;
}

/*
Function Name:  FpgaUartReadString
Description:    Read datas in UART's receive buffer.
Parameters:     length -- How many bytes you want to read
data   -- Where to save the data been read
Return:         actual bytes been read
Output:         Nothing
Note:           The data buffer must has a length of not less than length
you given, if not, something you hate to see may happen.
Test&Revision:  Done
*/
INT16  FpgaUartReadString( UINT16 fpga_uart_index, UCHAR* data, UINT16 length )
{
	FPGAUARTALLINFO& uart_all_info = gFpgaUartInfoTable[fpga_uart_index];
	INT16   bytes_to_be_read;
	INT16   bytes_be_read;

	UCHAR* receive_in_ptr = uart_all_info.receiveInPtr;

	// Calculate how many bytes can be read
	if (receive_in_ptr >= uart_all_info.receiveOutPtr)
		bytes_to_be_read = receive_in_ptr - uart_all_info.receiveOutPtr;
	else
		bytes_to_be_read =   (uart_all_info.receiveBufTail - uart_all_info.receiveBufHead + 1)
		- (uart_all_info.receiveOutPtr - receive_in_ptr);

	// The number of bytes can be read is the minimal of
	// bytes_to_be_read and length
	if (bytes_to_be_read > length)
		bytes_to_be_read = length;

	bytes_be_read = bytes_to_be_read;

	while (0 < bytes_to_be_read)
	{
		*data ++ = *uart_all_info.receiveOutPtr ++;

		if (uart_all_info.receiveOutPtr > uart_all_info.receiveBufTail)
			uart_all_info.receiveOutPtr = uart_all_info.receiveBufHead;

		bytes_to_be_read --;
	}

	return bytes_be_read;
}


/*
Function Name:  FpgaUartReceiveControl
Description:    Provide an interface to disable or enable receive interrupt
Parameters:     Operation: disable or enable interrupt
Return:         Nothing
Output:         Nothing
Test&Revision:  Done
*/
VOID  FpgaUartReceiveControl( UINT16 fpga_uart_index, UCHAR operation)
{
	FPGAUARTALLINFO& uart_all_info = gFpgaUartInfoTable[fpga_uart_index];
	if (UART_DISABLE == operation)
	{ 
		uart_all_info.set &= ~0x41; 
		*(uart_all_info.cr) = uart_all_info.set; 
	}
	if (UART_ENABLE == operation)
	{ 
		uart_all_info.set |= 0x41; 
		*(uart_all_info.cr) = uart_all_info.set; 
	}
}

/*
Function Name:  FpgaUartTransmitControl
Description:    Provide an interface to disable or enable transmit interrupt
Parameters:     Operation: disable or enable interrupt
Return:         Nothing
Output:         Nothing
Test&Revision:  Done
*/
VOID  FpgaUartTransmitControl( UINT16 fpga_uart_index, UCHAR operation)
{
	FPGAUARTALLINFO& uart_all_info = gFpgaUartInfoTable[fpga_uart_index];
	if (UART_DISABLE == operation)
	{
		uart_all_info.set &= ~0x82; 
		*(uart_all_info.cr) = uart_all_info.set;
	}
	else
	{
		uart_all_info.set |= 0x82; 
		*(uart_all_info.cr) = uart_all_info.set; 
	}   
}


/*
Function Name:  FpgaUartISR
Description:    UART interrupt service routine
Parameters:     No
Return:         Nothing
Output:         Nothing
Test&Revision:  Not yet
*/
VOID  FpgaUartISR( UINT16 fpga_uart_index )
{
	FPGAUARTALLINFO& uart_all_info = gFpgaUartInfoTable[fpga_uart_index];
	UCHAR status, data;
	UCHAR* receive_in_ptr_next;

	status = *(uart_all_info.cr);

	if (FPGA_UART_STATUS_RXRDY == (status&FPGA_UART_STATUS_RXRDY))
	{
		data = *(uart_all_info.dr);

		uart_all_info.receivedBytes ++;

		// mask parity error if no parity check
		if ( 0 == (uart_all_info.set & FPGA_UART_HAS_PARITY) )
			status &= ~FPGA_UART_STATUS_PARITY_ERR;

		// Check whether a error occured.
		if ( 0 == (status&(FPGA_UART_STATUS_OVERRUN_ERR|FPGA_UART_STATUS_PARITY_ERR|FPGA_UART_STATUS_FRAME_ERR)) )
		{
			receive_in_ptr_next = uart_all_info.receiveInPtr + 1;
			if (receive_in_ptr_next > uart_all_info.receiveBufTail)
				receive_in_ptr_next = uart_all_info.receiveBufHead;

			// No error found, save character.
			if (uart_all_info.receiveOutPtr != receive_in_ptr_next)
			{
				*uart_all_info.receiveInPtr = data;

				uart_all_info.receiveInPtr = receive_in_ptr_next;
			}
		}
		else
		{
			// report OverRun error if
			if (FPGA_UART_STATUS_OVERRUN_ERR == (status&FPGA_UART_STATUS_OVERRUN_ERR) )
			{
				uart_all_info.overRunError ++;
			}

			// report parity error if occurred
			if (FPGA_UART_STATUS_PARITY_ERR == (status&FPGA_UART_STATUS_PARITY_ERR))
			{
				uart_all_info.parityError ++;
			}

			// report frame error if occurred
			if (FPGA_UART_STATUS_FRAME_ERR == (status&FPGA_UART_STATUS_FRAME_ERR))
			{
				uart_all_info.frameError ++;
			}   
		}

		// clear error status
		*(uart_all_info.cr) = uart_all_info.set | 0x20; 
		*(uart_all_info.cr) = uart_all_info.set & (~0x20); 
	}

	// if transmit interrupt occurred, call the transmit ISR
	if (FPGA_UART_STATUS_TXRDY == (status&FPGA_UART_STATUS_TXRDY))
	{
		if (uart_all_info.transmitOutPtr != uart_all_info.transmitInPtr)
		{
			// transmit a byte
			*(uart_all_info.dr) = *uart_all_info.transmitOutPtr;

			uart_all_info.transmitOutPtr ++;
			if (uart_all_info.transmitOutPtr > uart_all_info.transmitBufTail)
				uart_all_info.transmitOutPtr = uart_all_info.transmitBufHead;
		}
		else
		{
			uart_all_info.isTxBufferEmpty = TRUE;
			uart_all_info.set &= ~0x82; 
			*(uart_all_info.cr) = uart_all_info.set;
		}
	}
}



//---------------------- UART Interrupt ISR ------------------------//
/*
Function Name:  FpgaUart0To3ISR
Description:    FPGA UART0~UART3 interrupt service routine
Parameters:     No
Return:         Nothing
Output:         Nothing
Test&Revision:  Not yet
*/
extern "C" VOID  FpgaExtInt2ISR( VOID )
{
	if (g_stSysFlag.stFSysFlag.ucFlashCircuitType == FLASH_CIRCUIT_VER_6000)
	{
		FpgaUartISR(FPGA_UART_0 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_1 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_2 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_3 - FPGA_UART_0);
	}
	else
	{
		FpgaUartISR(FPGA_UART_0 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_1 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_2 - FPGA_UART_0);
	}
}


/*
Function Name:  FpgaUart4To7ISR
Description:    FPGA UART4~UART7 interrupt service routine
Parameters:     No
Return:         Nothing
Output:         Nothing
Test&Revision:  Not yet
*/
extern "C" VOID  FpgaExtInt3ISR( VOID )
{
	if (g_stSysFlag.stFSysFlag.ucFlashCircuitType == FLASH_CIRCUIT_VER_6000)
	{
		FpgaUartISR(FPGA_UART_4 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_5 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_6 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_7 - FPGA_UART_0);
	}
	else
	{
		FpgaUartISR(FPGA_UART_3 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_4 - FPGA_UART_0);
		FpgaUartISR(FPGA_UART_5 - FPGA_UART_0);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -