summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/or1k/or1ksim/console/uart.c
diff options
context:
space:
mode:
authorHesham ALMatary <heshamelmatary@gmail.com>2015-04-14 10:22:35 -0500
committerJoel Sherrill <joel.sherrill@oarcorp.com>2015-04-14 11:10:14 -0500
commit0a73de2fc802e183affed8b2f6835e29f5c89b4d (patch)
tree323b6b3e3211c8fb2fedbf7ebc2d402bba85fda0 /c/src/lib/libbsp/or1k/or1ksim/console/uart.c
parentscore: Rename _Watchdog_Reset() (diff)
downloadrtems-0a73de2fc802e183affed8b2f6835e29f5c89b4d.tar.bz2
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.
Diffstat (limited to 'c/src/lib/libbsp/or1k/or1ksim/console/uart.c')
-rw-r--r--c/src/lib/libbsp/or1k/or1ksim/console/uart.c35
1 files changed, 11 insertions, 24 deletions
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(