mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-08 16:41:55 +00:00
it8380dev: modify uart ISR
Because UART interrupt is rising-edge triggered, and we need to clear
UART IER and restore IER state to make sure interrupt can be triggered
again when following situation occur:
[ISR start] [process rx] [process tx] [ISR end]
RX 0 1 0 1 1
TX 0 1 1 0 0
uart_int_event 0 1 1 1 1
uart_ier 1 1 1 1 1
uart_s1 (0 -> 1) 1 1 1 (keep high)
uart_int_event = (RX | TX)
uart_s1 = (uart_int_event & uart_ier)
UART interrupt = (uart_s1 0->1)
Signed-off-by: Dino Li <dino.li@ite.com.tw>
BRANCH=none
BUG=none
TEST=fixed.
Change-Id: I6498876780aba33795022fa6ecbb77e1c6468146
Reviewed-on: https://chromium-review.googlesource.com/311563
Commit-Ready: Dino Li <dino.li@ite.com.tw>
Tested-by: Dino Li <dino.li@ite.com.tw>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
@@ -104,12 +104,18 @@ void uart_enable_interrupt(void)
|
||||
|
||||
static void uart_ec_interrupt(void)
|
||||
{
|
||||
uint8_t uart_ier;
|
||||
|
||||
/* clear interrupt status */
|
||||
task_clear_pending_irq(IT83XX_IRQ_UART1);
|
||||
|
||||
/* Read input FIFO until empty, then fill output FIFO */
|
||||
uart_process_input();
|
||||
uart_process_output();
|
||||
|
||||
uart_ier = IT83XX_UART_IER(UART_PORT);
|
||||
IT83XX_UART_IER(UART_PORT) = 0;
|
||||
IT83XX_UART_IER(UART_PORT) = uart_ier;
|
||||
}
|
||||
DECLARE_IRQ(IT83XX_IRQ_UART1, uart_ec_interrupt, 1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user