From 0a73de2fc802e183affed8b2f6835e29f5c89b4d Mon Sep 17 00:00:00 2001 From: Hesham ALMatary Date: Tue, 14 Apr 2015 10:22:35 -0500 Subject: or1ksim: Fix bug at UART driver. Fix some UART register addresses and implementation bugs that were causing malfunction of console driver on real hardware. hello and ticker samples are tested and working fine now on mor1kx based SoC on Atlys FPGA board. BSP_OR1K_OR1KSIM_PERIPHCLK has been changed to 50MHz as with mor1kx/atlys SoC; this change has no effect on the current simulators that RTEMS run on. --- c/src/lib/libbsp/or1k/or1ksim/console/uart.c | 35 +++++++++------------------- 1 file changed, 11 insertions(+), 24 deletions(-) (limited to 'c/src/lib/libbsp/or1k/or1ksim/console/uart.c') diff --git a/c/src/lib/libbsp/or1k/or1ksim/console/uart.c b/c/src/lib/libbsp/or1k/or1ksim/console/uart.c index bb86bae251..87b1aeaa07 100644 --- a/c/src/lib/libbsp/or1k/or1ksim/console/uart.c +++ b/c/src/lib/libbsp/or1k/or1ksim/console/uart.c @@ -46,39 +46,34 @@ static uint32_t uart_get_baud(const console_tbl *ct) static void uart_set_baud(int baud) { - int divisor = (OR1KSIM_BSP_CLOCK_FREQ) / (16 * baud); - OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_CTRL) |= + uint16_t divisor = (OR1KSIM_BSP_CLOCK_FREQ) / (16 * baud); + OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_CTRL) = OR1KSIM_BSP_UART_REG_LINE_CTRL_DLAB; OR1KSIM_REG(OR1KSIM_BSP_UART_REG_DEV_LATCH_LOW) = divisor & 0xff; OR1KSIM_REG(OR1KSIM_BSP_UART_REG_DEV_LATCH_HIGH) = - (divisor >> 8) & 0xff; - - OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_CTRL) &= - ~(OR1KSIM_BSP_UART_REG_LINE_CTRL_DLAB); + (divisor >> 8); } static void uart_initialize(int minor) { - /* Disable all interrupts */ - OR1KSIM_REG(OR1KSIM_BSP_UART_REG_INT_ENABLE) = 0x00; + /* Set baud rate */ + uart_set_baud(OR1KSIM_UART_DEFAULT_BAUD); + + /* Set data pattern configuration */ + OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_CTRL) = + OR1KSIM_BSP_UART_REG_LINE_CTRL_WLEN8; /* Reset receiver and transmitter */ OR1KSIM_REG(OR1KSIM_BSP_UART_REG_FIFO_CTRL) = OR1KSIM_BSP_UART_REG_FIFO_CTRL_ENABLE_FIFO | OR1KSIM_BSP_UART_REG_FIFO_CTRL_CLEAR_RCVR | - OR1KSIM_BSP_UART_REG_FIFO_CTRL_CLEAR_XMIT | OR1KSIM_BSP_UART_REG_FIFO_CTRL_TRIGGER_14; - /* Set data pattern configuration */ - OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_CTRL) = - OR1KSIM_BSP_UART_REG_LINE_CTRL_WLEN8 & - (OR1KSIM_BSP_UART_REG_LINE_CTRL_STOP | - OR1KSIM_BSP_UART_REG_LINE_CTRL_PARITY); + /* Disable all interrupts */ + OR1KSIM_REG(OR1KSIM_BSP_UART_REG_INT_ENABLE) = 0x00; - /* Set baud rate */ - uart_set_baud(OR1KSIM_UART_DEFAULT_BAUD); } static int uart_first_open(int major, int minor, void *arg) @@ -115,9 +110,6 @@ static int uart_read_polled(int minor) static void uart_write_polled(int minor, char c) { unsigned char lsr; - const uint32_t transmit_finished = - (OR1KSIM_BSP_UART_REG_LINE_STATUS_TEMT | - OR1KSIM_BSP_UART_REG_LINE_STATUS_THRE); /* Wait until there is no pending data in the transmitter FIFO (empty) */ do { @@ -125,11 +117,6 @@ static void uart_write_polled(int minor, char c) } while (!(lsr & OR1KSIM_BSP_UART_REG_LINE_STATUS_THRE)); OR1KSIM_REG(OR1KSIM_BSP_UART_REG_TX) = c; - - /* Wait until trasmit data is finished */ - do { - lsr = OR1KSIM_REG(OR1KSIM_BSP_UART_REG_LINE_STATUS); - } while ( (lsr & transmit_finished) != transmit_finished ); } static ssize_t uart_write( -- cgit v1.2.3