Merge pull request #13041 from kaspar030/fe310_drain_uart_in_init
cpu/fe310: some uart fixes
This commit is contained in:
commit
ad7d0d302e
@ -41,7 +41,9 @@ static inline void _uart_isr(uart_t dev)
|
||||
|
||||
/* Intr cleared automatically when data is read */
|
||||
while ((data & UART_RXFIFO_EMPTY) != (uint32_t)UART_RXFIFO_EMPTY) {
|
||||
isr_ctx[dev].rx_cb(isr_ctx[dev].arg, (uint8_t)(data & 0xff));
|
||||
if (isr_ctx[dev].rx_cb) {
|
||||
isr_ctx[dev].rx_cb(isr_ctx[dev].arg, (uint8_t)(data & 0xff));
|
||||
}
|
||||
data = _REG32(uart_config[dev].addr, UART_REG_RXFIFO);
|
||||
}
|
||||
}
|
||||
@ -60,6 +62,16 @@ void uart_isr(int num)
|
||||
}
|
||||
}
|
||||
|
||||
static void _drain(uart_t dev)
|
||||
{
|
||||
uint32_t data = _REG32(uart_config[dev].addr, UART_REG_RXFIFO);
|
||||
|
||||
/* Intr cleared automatically when data is read */
|
||||
while ((data & UART_RXFIFO_EMPTY) != (uint32_t)UART_RXFIFO_EMPTY) {
|
||||
data = _REG32(uart_config[dev].addr, UART_REG_RXFIFO);
|
||||
}
|
||||
}
|
||||
|
||||
int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
|
||||
{
|
||||
uint32_t uartDiv;
|
||||
@ -107,6 +119,11 @@ int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
|
||||
set_external_isr_cb(uart_config[dev].isr_num, uart_isr);
|
||||
PLIC_enable_interrupt(uart_config[dev].isr_num);
|
||||
PLIC_set_priority(uart_config[dev].isr_num, UART_ISR_PRIO);
|
||||
|
||||
/* avoid trap by emptying RX FIFO */
|
||||
_drain(dev);
|
||||
|
||||
/* enable RX interrupt */
|
||||
_REG32(uart_config[dev].addr, UART_REG_IE) = UART_IP_RXWM;
|
||||
|
||||
/* Enable RX */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user