[U-Boot] [RFC][PATCH] Pre-console buffer

Graeme Russ graeme.russ at gmail.com
Sat Aug 27 14:54:05 CEST 2011


This cropped up as an aside to another thread so I thought I would give
it a go. It's pretty rough-and-ready but it does the trick :)

---
 arch/x86/cpu/cpu.c                 |    2 +
 arch/x86/include/asm/global_data.h |   14 +++++----
 common/console.c                   |   56 ++++++++++++++++++++++++++++--------
 include/configs/eNET.h             |    5 ++-
 4 files changed, 58 insertions(+), 19 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index cac12c0..602fb51 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -90,6 +90,8 @@ int x86_cpu_init_f(void)
 	const u32 em_rst = ~X86_CR0_EM;
 	const u32 mp_ne_set = X86_CR0_MP | X86_CR0_NE;

+	printf("Example pre-console printf()\n");
+
 	/* initialize FPU, reset EM, set MP and NE */
 	asm ("fninit\n" \
 	     "movl %%cr0, %%eax\n" \
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 2902e61..4ebc5bd 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -44,6 +44,7 @@ typedef	struct global_data {
 	unsigned long	env_addr;	/* Address  of Environment struct */
 	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
 	unsigned long	bus_clk;
+	unsigned long	con_buf_idx;	/* Console buffer index */
 	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */
 	unsigned long	start_addr_sp;	/* start_addr_stackpointer */
 	phys_size_t	ram_size;	/* RAM size */
@@ -65,13 +66,14 @@ extern gd_t *gd;
 #define GD_ENV_ADDR		5
 #define GD_CPU_CLK		6
 #define GD_BUS_CLK		7
-#define GD_RELOC_ADDR		8
-#define GD_START_ADDR_SP	9
-#define GD_RAM_SIZE		10
-#define GD_RESET_STATUS		11
-#define GD_JT			12
+#define GD_CON_BUF_IDX		8
+#define GD_RELOC_ADDR		9
+#define GD_START_ADDR_SP	10
+#define GD_RAM_SIZE		11
+#define GD_RESET_STATUS		12
+#define GD_JT			13

-#define GD_SIZE			13
+#define GD_SIZE			14

 /*
  * Global Data Flags
diff --git a/common/console.c b/common/console.c
index acc4df3..1fa862d 100644
--- a/common/console.c
+++ b/common/console.c
@@ -323,6 +323,28 @@ int tstc(void)
 	return serial_tstc();
 }

+void pre_console_putc(const char c)
+{
+	char *buffer =  (char *)CONFIG_SYS_TMP_CON_BUF_ADDR;
+
+	if (gd->con_buf_idx < CONFIG_SYS_TMP_CON_BUF_SZ)
+		buffer[gd->con_buf_idx++] = c;
+}
+
+void pre_console_puts(const char *s)
+{
+	while (*s)
+		pre_console_putc(*s++);
+}
+
+void print_pre_console_buffer(void)
+{
+	char *buffer =  (char *)CONFIG_SYS_TMP_CON_BUF_ADDR;
+
+	buffer[gd->con_buf_idx] = 0x00;
+	puts(buffer);
+}
+
 void putc(const char c)
 {
 #ifdef CONFIG_SILENT_CONSOLE
@@ -334,13 +356,16 @@ void putc(const char c)
 	if (gd->flags & GD_FLG_DISABLE_CONSOLE)
 		return;
 #endif
-
-	if (gd->flags & GD_FLG_DEVINIT) {
-		/* Send to the standard output */
-		fputc(stdout, c);
+	if (gd->flags & GD_FLG_HAVE_CONSOLE) {
+		if (gd->flags & GD_FLG_DEVINIT) {
+			/* Send to the standard output */
+			fputc(stdout, c);
+		} else {
+			/* Send directly to the handler */
+			serial_putc(c);
+		}
 	} else {
-		/* Send directly to the handler */
-		serial_putc(c);
+		pre_console_putc(c);
 	}
 }

@@ -355,13 +380,16 @@ void puts(const char *s)
 	if (gd->flags & GD_FLG_DISABLE_CONSOLE)
 		return;
 #endif
-
-	if (gd->flags & GD_FLG_DEVINIT) {
-		/* Send to the standard output */
-		fputs(stdout, s);
+	if (gd->flags & GD_FLG_HAVE_CONSOLE) {
+		if (gd->flags & GD_FLG_DEVINIT) {
+			/* Send to the standard output */
+			fputs(stdout, s);
+		} else {
+			/* Send directly to the handler */
+			serial_puts(s);
+		}
 	} else {
-		/* Send directly to the handler */
-		serial_puts(s);
+		pre_console_puts(s);
 	}
 }

@@ -529,6 +557,10 @@ int console_init_f(void)
 		gd->flags |= GD_FLG_SILENT;
 #endif

+	printf("console initialised - dumping buffer\n");
+	print_pre_console_buffer();
+	printf("buffer dumped\n");
+
 	return 0;
 }

diff --git a/include/configs/eNET.h b/include/configs/eNET.h
index 548d52c..4fb971f 100644
--- a/include/configs/eNET.h
+++ b/include/configs/eNET.h
@@ -164,8 +164,11 @@
 #define CONFIG_SYS_STACK_SIZE			(32 * 1024)
 #define CONFIG_SYS_CAR_ADDR			0x19200000
 #define CONFIG_SYS_CAR_SIZE			(16 * 1024)
+#define CONFIG_SYS_TMP_CON_BUF_SZ		(1 * 1024)
 #define CONFIG_SYS_INIT_SP_ADDR			(CONFIG_SYS_CAR_ADDR + \
-						 CONFIG_SYS_CAR_SIZE)
+						 CONFIG_SYS_CAR_SIZE - \
+						 CONFIG_SYS_TMP_CON_BUF_SZ)
+#define CONFIG_SYS_TMP_CON_BUF_ADDR		CONFIG_SYS_INIT_SP_ADDR + 1
 #define CONFIG_SYS_MONITOR_BASE			CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_MONITOR_LEN			(256 * 1024)
 #define CONFIG_SYS_MALLOC_LEN			(CONFIG_ENV_SECT_SIZE + \
--
1.7.5.2.317.g391b14



More information about the U-Boot mailing list