[U-Boot] [PATCH 1/2] console: Support board-specific early console

Thierry Reding thierry.reding at gmail.com
Fri Mar 20 12:30:33 CET 2015


From: Thierry Reding <treding at nvidia.com>

This is mostly useful for debugging the early boot process. Often boards
can provide some low-level code that outputs a character on some debug
port prior to passing the early setup code. Allow boards to implement an
early_putc() function that will be used to redirect printf() and friends
to this debug port until the proper console becomes ready.

Cc: Simon Glass <sjg at chromium.org>
Cc: Tom Rini <trini at konsulko.com>
Signed-off-by: Thierry Reding <treding at nvidia.com>
---
 README           | 17 +++++++++++++++++
 common/console.c | 21 +++++++++++++++++++--
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/README b/README
index b0124d6022e1..a7cb3d86d2d2 100644
--- a/README
+++ b/README
@@ -5014,6 +5014,23 @@ Low Level (hardware related) configuration options:
 		driver that uses this:
 		drivers/mtd/nand/davinci_nand.c
 
+- CONFIG_EARLY_CONSOLE
+		Enables support for an early console. Output from puts() and
+		printf() will be redirected to this early console. A primary
+		use-case for this is early board bring up, where U-Boot does
+		not boot to the proper console yet, but it can also be quite
+		handy to help debug U-Boot's early boot phases.
+
+		Boards that specify this option in their configuration must
+		provide an implementation of the early_putc() function:
+
+			void early_putc(char ch);
+
+		This function should output a single character on a device
+		that is available during early boot. Often this will be a
+		debug UART that has been preconfigured by a bootloader or
+		ROM before executing U-Boot.
+
 Freescale QE/FMAN Firmware Support:
 -----------------------------------
 
diff --git a/common/console.c b/common/console.c
index 3f25e76fe79e..d552dff4ee0f 100644
--- a/common/console.c
+++ b/common/console.c
@@ -479,6 +479,16 @@ void putc(const char c)
 	}
 }
 
+#ifdef CONFIG_EARLY_CONSOLE
+extern void early_putc(char ch);
+
+static void early_puts(const char *s)
+{
+	while (*s)
+		early_putc(*s++);
+}
+#endif
+
 void puts(const char *s)
 {
 #ifdef CONFIG_SANDBOX
@@ -498,6 +508,11 @@ void puts(const char *s)
 		return;
 #endif
 
+#ifdef CONFIG_EARLY_CONSOLE
+	if (!gd->have_console)
+		early_puts(s);
+#endif
+
 	if (!gd->have_console)
 		return pre_console_puts(s);
 
@@ -517,7 +532,8 @@ int printf(const char *fmt, ...)
 	uint i;
 	char printbuffer[CONFIG_SYS_PBSIZE];
 
-#if !defined(CONFIG_SANDBOX) && !defined(CONFIG_PRE_CONSOLE_BUFFER)
+#if !defined(CONFIG_SANDBOX) && !defined(CONFIG_PRE_CONSOLE_BUFFER) && \
+    !defined(CONFIG_EARLY_CONSOLE)
 	if (!gd->have_console)
 		return 0;
 #endif
@@ -540,7 +556,8 @@ int vprintf(const char *fmt, va_list args)
 	uint i;
 	char printbuffer[CONFIG_SYS_PBSIZE];
 
-#if defined(CONFIG_PRE_CONSOLE_BUFFER) && !defined(CONFIG_SANDBOX)
+#if !defined(CONFIG_SANDBOX) && !defined(CONFIG_PRE_CONSOLE_BUFFER) && \
+    !defined(CONFIG_EARLY_CONSOLE)
 	if (!gd->have_console)
 		return 0;
 #endif
-- 
2.3.2



More information about the U-Boot mailing list