📄 uartdrv.cpp
字号:
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 + -