From 8fd465e67e5db00839e7b3a717a816d57b46f198 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Fri, 25 Nov 2016 09:45:35 +1100 Subject: arm/zynq: Wait for the UART TX FIFO to empty on reset. --- c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c | 13 +++++++++++++ c/src/lib/libbsp/arm/xilinx-zynq/include/zynq-uart.h | 5 +++++ c/src/lib/libbsp/arm/xilinx-zynq/startup/bspreset.c | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c b/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c index aa96eba375..f9a1cf91d5 100644 --- a/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c +++ b/c/src/lib/libbsp/arm/xilinx-zynq/console/zynq-uart.c @@ -226,3 +226,16 @@ const console_fns zynq_uart_fns = { .deviceSetAttributes = zynq_uart_set_attribues, .deviceOutputUsesInterrupts = false }; + +void zynq_uart_reset_tx_flush(int minor) +{ + volatile zynq_uart *regs = zynq_uart_get_regs(minor); + int c = 4; + + while (c-- > 0) + zynq_uart_write_polled(minor, '\r'); + + while ((regs->channel_sts & ZYNQ_UART_CHANNEL_STS_TEMPTY) == 0) { + /* Wait */ + } +} diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/include/zynq-uart.h b/c/src/lib/libbsp/arm/xilinx-zynq/include/zynq-uart.h index bb0ff56598..07c883af87 100644 --- a/c/src/lib/libbsp/arm/xilinx-zynq/include/zynq-uart.h +++ b/c/src/lib/libbsp/arm/xilinx-zynq/include/zynq-uart.h @@ -35,6 +35,11 @@ extern "C" { extern const console_fns zynq_uart_fns; +/** + * Flush TX FIFO and wait until it is empty. Used in bsp_reset. + */ +void zynq_uart_reset_tx_flush(int minor); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspreset.c b/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspreset.c index 8d70baa1c6..f86d1f3e05 100644 --- a/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspreset.c +++ b/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspreset.c @@ -12,13 +12,19 @@ * http://www.rtems.org/license/LICENSE. */ +#include #include +#include void bsp_reset(void) { volatile uint32_t *slcr_unlock = (volatile uint32_t *) 0xf8000008; volatile uint32_t *pss_rst_ctrl = (volatile uint32_t *) 0xf8000200; + if (Console_Port_Tbl != NULL) { + zynq_uart_reset_tx_flush((int) Console_Port_Minor); + } + while (true) { *slcr_unlock = 0xdf0d; *pss_rst_ctrl = 0x1; -- cgit v1.2.3