diff options
Diffstat (limited to 'c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c')
-rw-r--r-- | c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c index f32a1615fd..8ca8950b99 100644 --- a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c +++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c @@ -17,8 +17,6 @@ #include "../include/system_conf.h" #include "uart.h" -bool BSP_uart_txbusy; - void BSP_uart_init(int baud) { MM_WRITE(MM_UART_DIV, CPU_FREQUENCY/baud/16); @@ -26,40 +24,24 @@ void BSP_uart_init(int baud) void BSP_uart_polled_write(char ch) { - int ip; rtems_interrupt_level level; rtems_interrupt_disable(level); - if (BSP_uart_txbusy) { - /* wait for the end of the transmission by the IRQ-based driver */ - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTTX))); - lm32_interrupt_ack(1 << MM_IRQ_UARTTX); - } + while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); MM_WRITE(MM_UART_RXTX, ch); - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTTX))); - /* if TX was busy, do not ack the IRQ - * so that the IRQ-based driver ISR is run */ - if (!BSP_uart_txbusy) - lm32_interrupt_ack(1 << MM_IRQ_UARTTX); + while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); rtems_interrupt_enable(level); } int BSP_uart_polled_read(void) { - int ip; char r; rtems_interrupt_level level; rtems_interrupt_disable(level); - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTRX))); - lm32_interrupt_ack(1 << MM_IRQ_UARTRX); + while(!(MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT)); r = MM_READ(MM_UART_RXTX); + MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); rtems_interrupt_enable(level); return r; |