📄 uartfax.c
字号:
else
dtr_level = uart->dtr_level;
#endif
state = uart->state_2;
uart->state_2 = 0;
uart->state = &(uart->state_2);
state |= uart->state_1;
uart->state_1 = 0;
uart->state = &(uart->state_1);
state |= ((((SYS_UWORD32) uart->rts_level) << RTS) |
#if ((BOARD == 8) || (BOARD == 9) || (BOARD == 40) || (BOARD == 41) || (BOARD == 43) || (BOARD == 45))
(((SYS_UWORD32) dtr_level) << DTR) |
#endif
(((SYS_UWORD32) (uart->tx_stopped_by_application |
uart->tx_stopped_by_driver)) << TXSTP) |
(((SYS_UWORD32) (uart->rx_stopped_by_application |
uart->rx_stopped_by_driver)) << RXSTP) |
(((SYS_UWORD32) (uart->buffer_size - bytes_in_rx_buffer)) << RXBLEV));
/*
* Fields SA, SB and X are set according to the flow control:
*
* None RTS/CTS XON/XOFF
* SA DTR DTR DTR
* SB RTS 0 RTS
* X 0 RTS XON:0 XOFF:1 (transmitter)
*
* DTR is supported only on C-Sample.
* DTR/DSR flow control is not supported.
*/
#if ((BOARD == 8) || (BOARD == 9) || (BOARD == 40) || (BOARD == 41) || (BOARD == 43) || (BOARD == 45))
state |= (((SYS_UWORD32) uart->dtr_level) << SA);
#endif
if (uart->flow_control_mode != fc_rts)
state |= (((SYS_UWORD32) uart->rts_level) << SB);
if (uart->flow_control_mode == fc_rts)
state |= (((SYS_UWORD32) uart->rts_level) << X);
else if ((uart->flow_control_mode == fc_xoff) &&
(uart->tx_stopped_by_application ||
uart->tx_stopped_by_driver))
state |= (1 << X);
/*
* Call the readOutFunc function with these parameters.
*/
uart->rd_call_setup = rm_notDefined;
(*(uart->readOutFunc)) (call_source & 0x01, /* From HISR or application */
&(uart->rd_call_setup),
fragments_number,
&(uart->rd_address[0]),
&(uart->rd_size_after_call[0]),
state);
}
/*******************************************************************************
*
* update_writing_callback
*
* Purpose : Updates the sizes array and the addresses array to call the
* writeInFunc function.
*
* Arguments: In : uart : Pointer on the UART structure.
* call_source: 0: application, 1: HISR
* Out: none
*
* Returns : none
*
******************************************************************************/
static void
update_writing_callback (t_uart *uart,
SYS_BOOL call_source)
{
SYS_UWORD8 fragments_number;
volatile SYS_UWORD8 *tx_out;
/*
* Update the array of sizes and the array of addresses.
* A copy of tx_out is used because it may be updated by the interrupt
* handler if this function is called from the application.
*/
tx_out = uart->tx_out;
if (uart->tx_in < tx_out) {
fragments_number = 1;
uart->wr_address[0] = uart->tx_in;
uart->wr_size_before_call[0] =
(SYS_UWORD16) (tx_out - uart->tx_in - 1);
uart->wr_size_after_call[0] = uart->wr_size_before_call[0];
uart->wr_size_before_call[1] = 0;
uart->wr_size_after_call[1] = 0;
} else if (tx_out == &(uart->tx_buffer[0])) {
fragments_number = 1;
uart->wr_address[0] = uart->tx_in;
uart->wr_size_before_call[0] =
uart->buffer_size -
(SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0]));
uart->wr_size_after_call[0] = uart->wr_size_before_call[0];
uart->wr_size_before_call[1] = 0;
uart->wr_size_after_call[1] = 0;
} else {
fragments_number = 2;
uart->wr_address[0] = uart->tx_in;
uart->wr_size_before_call[0] =
uart->buffer_size + 1 -
(SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0]));
uart->wr_size_after_call[0] = uart->wr_size_before_call[0];
uart->wr_address[1] = &(uart->tx_buffer[0]);
uart->wr_size_before_call[1] =
(SYS_UWORD16) (tx_out - &(uart->tx_buffer[0]) - 1);
uart->wr_size_after_call[1] = uart->wr_size_before_call[1];
if (!uart->wr_size_before_call[1])
fragments_number = 1;
}
/*
* Call the writeInFunc function with these parameters;
*/
uart->wr_call_setup = rm_notDefined;
(*(uart->writeInFunc)) (call_source,
&(uart->wr_call_setup),
fragments_number,
&(uart->wr_address[0]),
&(uart->wr_size_after_call[0]));
}
/*******************************************************************************
*
* stop_break
*
* Purpose : The timer is activated to expire when a time corresponding to the
* sending time of 2 characters at least has elapsed. After a break,
* no character may be sent during this period.
*
* Arguments: In : id: parameter not used.
* Out: none
*
* Returns : none
*
******************************************************************************/
static VOID
stop_break (UNSIGNED id)
{
t_uart *uart;
uart = &uart_parameters;
uart->break_to_send = 0;
uart->break_in_progress = 0;
#if ((CHIPSET != 5) && (CHIPSET != 6))
/*
* Disable sleep mode.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP);
#endif
/*
* Unmask Tx interrupt.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI);
}
/*******************************************************************************
*
* hisr_start_break
*
* Purpose : Enables the timer used to control the time without character.
*
* Arguments: In : none
* Out: none
*
* Returns : none
*
******************************************************************************/
static VOID
hisr_start_break (VOID)
{
t_uart *uart;
uart = &uart_parameters;
(void) NU_Control_Timer (&(uart->break_timer_ctrl_block),
NU_DISABLE_TIMER);
(void) NU_Reset_Timer (&(uart->break_timer_ctrl_block),
stop_break,
uart->time_without_character,
0, /* The timer expires once. */
NU_DISABLE_TIMER);
(void) NU_Control_Timer (&(uart->break_timer_ctrl_block),
NU_ENABLE_TIMER);
}
/*******************************************************************************
*
* stop_receiver
*
* Purpose : Activates DTR or RTS or sends XOFF.
*
* Arguments: In : uart: Pointer on the UART structure.
* Out: none
*
* Returns : none
*
******************************************************************************/
static void
stop_receiver (t_uart *uart)
{
#if ((CHIPSET != 5) && (CHIPSET != 6))
/*
* Disable sleep mode.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP);
#endif
switch (uart->flow_control_mode) {
case fc_rts:
/*
* CTS (RTS on UART side) is deactivated (high).
*/
WRITE_UART_REGISTER (
uart, MCR, READ_UART_REGISTER (uart, MCR) & ~MRTS);
break;
case fc_xoff:
uart->xon_xoff_to_send = uart->xoff_character;
uart->send_xon_xoff = 1;
/*
* Unmask Tx interrupt.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI);
break;
}
}
/*******************************************************************************
*
* start_receiver
*
* Purpose : Deactivates DTR or RTS or sends XON.
*
* Arguments: In : uart: Pointer on the UART structure.
* Out: none
*
* Returns : none
*
******************************************************************************/
static void
start_receiver (t_uart *uart)
{
#if ((CHIPSET != 5) && (CHIPSET != 6))
/*
* Disable sleep mode.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP);
#endif
switch (uart->flow_control_mode) {
case fc_rts:
/*
* CTS (RTS on UART side) is activated (low).
*/
WRITE_UART_REGISTER (
uart, MCR, READ_UART_REGISTER (uart, MCR) | MRTS);
break;
case fc_xoff:
uart->xon_xoff_to_send = uart->xon_character;
uart->send_xon_xoff = 1;
/*
* Unmask Tx interrupt.
*/
WRITE_UART_REGISTER (
uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI);
break;
}
}
/*******************************************************************************
*
* add_esc_seq_char_in_rx_buffer
*
* Purpose : Writes one escape sequence character in the RX buffer.
*
* Arguments: In : uart: Pointer on the UART structure.
* Out: none
*
* Returns : none
*
******************************************************************************/
static void
add_esc_seq_char_in_rx_buffer (t_uart *uart)
{
/*
* IF the RX buffer is not full, write an escape sequence character in the
* RX buffer and check wrap-around.
*/
if (!RX_BUFFER_FULL (uart)) {
*(uart->rx_in++) = uart->esc_seq_character;
if (uart->rx_in == &(uart->rx_buffer[0]) + uart->buffer_size + 1)
uart->rx_in = &(uart->rx_buffer[0]);
}
}
/*******************************************************************************
*
* analyze_guard_period_timer_expiration
*
* Purpose : According to the state of the escape sequence detection, 1 or 2
* escape sequence characters may be written into the TX buffer or
* the escape sequence is declared as detected.
* If 1 or 2 escape sequence characters have been detected the
* guard period must not expire.
* If 3 characters have been detected the escape sequence must
* expire.
*
* Arguments: In : id: parameter not used.
* Out: none
*
* Returns : none
*
******************************************************************************/
static VOID
analyze_guard_period_timer_expiration (UNSIGNED id)
{
t_uart *uart;
SYS_UWORD16 bytes_in_rx_buffer;
uart = &uart_parameters;
switch (uart->esc_seq_detection_state) {
case ONE_CHAR_DETECTED:
/*
* 1 escape sequence character has been detected. The guard period has
* ellapsed. This character is written into the TX buffer.
*/
add_esc_seq_char_in_rx_buffer (uart);
break;
case TWO_CHARS_DETECTED:
/*
* 2 escape sequence characters have been detected. The guard period has
* ellapsed. These characters are written into the TX buffer.
*/
add_esc_seq_char_in_rx_buffer (uart);
add_esc_seq_char_in_rx_buffer (uart);
break;
case THREE_CHARS_DETECTED:
/*
* 3 escape sequence characters have been detected and the guard period
* has ellapsed. The escape sequence is detected.
*/
uart->esc_seq_received = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -