From: Martin Aberg <mab...@gaisler.com>

The cons layer decides which of the registered console device is granted as
system console. When a device specific console driver performs its first_open,
it inherits UART parameters from boot loader only if it is the system console.
---
 c/src/lib/libbsp/sparc/shared/include/cons.h      |  8 +++++---
 c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c | 10 ++++++----
 c/src/lib/libbsp/sparc/shared/uart/cons.c         |  4 ++++
 3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/include/cons.h 
b/c/src/lib/libbsp/sparc/shared/include/cons.h
index 9a26a26..c30e41c 100644
--- a/c/src/lib/libbsp/sparc/shared/include/cons.h
+++ b/c/src/lib/libbsp/sparc/shared/include/cons.h
@@ -20,12 +20,14 @@
 
 struct console_dev;
 
-#define CONSOLE_FLAG_SYSCON      0x01
+#define CONSOLE_FLAG_SYSCON             0x01
+#define CONSOLE_FLAG_SYSCON_GRANT       0x02
 
 struct console_dev {
        rtems_termios_device_context base;
-       /* Set to CONSOLE_FLAG_SYSCON if this UART should be system console 
and/or
-        * debug console.
+       /* Set CONSOLE_FLAG_SYSCON to request this device to be system console
+        * and/or debug console. CONSOLE_FLAG_SYSCON_GRANT will be set on the
+        * device which was selected as system console.
         */
        int flags;
        char *fsname; /* File system prefix */
diff --git a/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c 
b/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c
index 1547e78..379d9ff 100644
--- a/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c
+++ b/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c
@@ -440,10 +440,12 @@ static bool first_open(
 
        uart->tty = tty;
 
-       /* Preserve values set by bootloader */
-       get_attributes(base, term);
-       term->c_oflag |= ONLCR;
-       set_attributes(base, term);
+       /* Inherit UART hardware parameters from bootloader on system console */
+       if (uart->condev.flags & CONSOLE_FLAG_SYSCON_GRANT) {
+               get_attributes(base, term);
+               term->c_oflag |= ONLCR;
+               set_attributes(base, term);
+       }
 
        /* Enable TX/RX */
        uart->regs->ctrl |= APBUART_CTRL_RE | APBUART_CTRL_TE;
diff --git a/c/src/lib/libbsp/sparc/shared/uart/cons.c 
b/c/src/lib/libbsp/sparc/shared/uart/cons.c
index 8426add..37f448c 100644
--- a/c/src/lib/libbsp/sparc/shared/uart/cons.c
+++ b/c/src/lib/libbsp/sparc/shared/uart/cons.c
@@ -89,6 +89,10 @@ void console_dev_register(struct console_dev *dev)
                /* Not enough console structures */
                return;
        }
+       dev->flags &= ~CONSOLE_FLAG_SYSCON_GRANT;
+       if (con->flags & FLAG_SYSCON) {
+               dev->flags |= CONSOLE_FLAG_SYSCON_GRANT;
+       }
 
        /* Assign Console */
        con->dev = dev;
-- 
2.7.4

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to