sifive_uart: Fix input character dropping in ddb and at a mountroot prompt
These use the raw console interface and poll. Unfortunately, the SiFive UART puts the FIFO empty bit inside the FIFO data register, which means that the act of checking whether a character is available also dequeues any character from the FIFO, requiring the user to press each key twice. However, since we configure the watermark to be 0 and, when the UART has been grabbed for the console, we have interrupts off, we can abuse the interrupt pending register to act as a substitute for the FIFO empty bit. This perhaps suggests that the console interface should move from having rxready and getc to having getc_nonblock and getc (or make getc take a bool), as all the places that call rxready do so to avoid blocking on getc when there is no character available. Reviewed by: kp, philip MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D31025
This commit is contained in:
parent
4c4a6884ad
commit
a1f9cdb1ab
@ -137,9 +137,15 @@ sfuart_putc(struct uart_bas *bas, int c)
|
||||
static int
|
||||
sfuart_rxready(struct uart_bas *bas)
|
||||
{
|
||||
|
||||
return ((uart_getreg(bas, SFUART_RXDATA) &
|
||||
SFUART_RXDATA_EMPTY) == 0);
|
||||
/*
|
||||
* Unfortunately the FIFO empty flag is in the FIFO data register so
|
||||
* reading it would dequeue the character. Instead, rely on the fact
|
||||
* we've configured the watermark to be 0 and that interrupts are off
|
||||
* when using the low-level console function, and read the interrupt
|
||||
* pending state instead.
|
||||
*/
|
||||
return ((uart_getreg(bas, SFUART_IRQ_PENDING) &
|
||||
SFUART_IRQ_PENDING_RXQM) != 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
x
Reference in New Issue
Block a user