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 */
|
/* Intr cleared automatically when data is read */
|
||||||
while ((data & UART_RXFIFO_EMPTY) != (uint32_t)UART_RXFIFO_EMPTY) {
|
while ((data & UART_RXFIFO_EMPTY) != (uint32_t)UART_RXFIFO_EMPTY) {
|
||||||
|
if (isr_ctx[dev].rx_cb) {
|
||||||
isr_ctx[dev].rx_cb(isr_ctx[dev].arg, (uint8_t)(data & 0xff));
|
isr_ctx[dev].rx_cb(isr_ctx[dev].arg, (uint8_t)(data & 0xff));
|
||||||
|
}
|
||||||
data = _REG32(uart_config[dev].addr, UART_REG_RXFIFO);
|
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)
|
int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
|
||||||
{
|
{
|
||||||
uint32_t uartDiv;
|
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);
|
set_external_isr_cb(uart_config[dev].isr_num, uart_isr);
|
||||||
PLIC_enable_interrupt(uart_config[dev].isr_num);
|
PLIC_enable_interrupt(uart_config[dev].isr_num);
|
||||||
PLIC_set_priority(uart_config[dev].isr_num, UART_ISR_PRIO);
|
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;
|
_REG32(uart_config[dev].addr, UART_REG_IE) = UART_IP_RXWM;
|
||||||
|
|
||||||
/* Enable RX */
|
/* Enable RX */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user