[PATCH 34.5 v2 6/6] LEON3: added TX-wait-complete and CR on NL support for UART
Daniel Hellstrom
daniel at gaisler.com
Thu Apr 19 13:21:25 UTC 2012
Signed-off-by: Daniel Hellstrom <daniel at gaisler.com>
---
c/src/lib/libbsp/sparc/leon3/console/console.c | 11 +++++++----
c/src/lib/libbsp/sparc/leon3/console/debugputs.c | 18 ++++++++++++++++--
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c
index aece47a..fc6d5b0 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/console.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
@@ -50,8 +50,11 @@ int syscon_uart_index __attribute__((weak)) = 0;
extern void apbuart_outbyte_polled(
ambapp_apb_uart *regs,
- char ch
-);
+ unsigned char ch,
+ int do_cr_on_newline,
+ int wait_sent
+ );
+
/* body is in debugputs.c */
@@ -157,7 +160,7 @@ ssize_t console_write_polled(int minor, const char *buf, size_t len)
port = minor - 1;
while (nwrite < len) {
- apbuart_outbyte_polled(apbuarts[port].regs, *buf++);
+ apbuart_outbyte_polled(apbuarts[port].regs, *buf++, 1, 0);
nwrite++;
}
return nwrite;
@@ -324,7 +327,7 @@ rtems_device_driver console_initialize(
* On a MP system one should not open UARTs that other OS instances use.
*/
if (syscon_uart_index < uarts) {
- status = rtems_io_register_name( "/dev/console", major, 0 );
+ status = rtems_io_register_name("/dev/console", major, 0);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
}
diff --git a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
index 7058cf8..080d4fa 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/debugputs.c
@@ -89,9 +89,12 @@ int bsp_debug_uart_init(void)
*/
void apbuart_outbyte_polled(
ambapp_apb_uart *regs,
- unsigned char ch
+ unsigned char ch,
+ int do_cr_on_newline,
+ int wait_sent
)
{
+send:
while ( (regs->status & LEON_REG_UART_STATUS_THE) == 0 ) {
/* Lower bus utilization while waiting for UART */
asm volatile ("nop"::); asm volatile ("nop"::);
@@ -100,6 +103,17 @@ void apbuart_outbyte_polled(
asm volatile ("nop"::); asm volatile ("nop"::);
}
regs->data = (unsigned int) ch;
+
+ if ((ch == '\n') && do_cr_on_newline) {
+ ch = '\r';
+ goto send;
+ }
+
+ /* Wait until the character has been sent? */
+ if (wait_sent) {
+ while ((regs->status & LEON_REG_UART_STATUS_THE) == 0)
+ ;
+ }
}
/*
@@ -129,7 +143,7 @@ static void bsp_out_char(char c)
return;
}
- apbuart_outbyte_polled(dbg_uart, c);
+ apbuart_outbyte_polled(dbg_uart, c, 1, 1);
}
/*
--
1.7.0.4
More information about the devel
mailing list