Signed-off-by: Peter Tyser <[EMAIL PROTECTED]> --- README | 11 +++++++++++ common/console.c | 34 +++++++++++++++++++++++++++++----- common/serial.c | 6 ++++-- include/common.h | 3 +++ lib_arm/board.c | 12 ++++++++++++ lib_i386/board.c | 13 ++++++++++++- lib_m68k/board.c | 12 ++++++++++++ lib_mips/board.c | 12 ++++++++++++ lib_ppc/board.c | 13 ++++++++++++- lib_sh/board.c | 12 ++++++++++++ 10 files changed, 119 insertions(+), 9 deletions(-)
diff --git a/README b/README index 37449d1..1346fe0 100644 --- a/README +++ b/README @@ -453,6 +453,17 @@ The following options need to be configured: default i/o. Serial console can be forced with environment 'console=serial'. + CONFIG_DEBUG_CONSOLE + Enables a basic serial console while still executing from + flash. The debug console can be used to initially enter SPD + information, debug memory issues, debug i2c issues, etc + early in the boot process. The debug console is started + when an error occurs during hardware initialization (eg + DDR can't be configured), or if the user presses ctrl-c + early in the boot process. The address to store the + early console's command buffer must be specified with the + CFG_DEBUG_CONSOLE_ADDR define. + When CONFIG_SILENT_CONSOLE is defined, all console messages (by U-Boot and Linux!) can be silenced with the "silent" environment variable. See diff --git a/common/console.c b/common/console.c index daf0180..a967737 100644 --- a/common/console.c +++ b/common/console.c @@ -249,15 +249,16 @@ void vprintf (const char *fmt, va_list args) } /* test if ctrl-c was pressed */ -static int ctrlc_disabled = 0; /* see disable_ctrl() */ -static int ctrlc_was_pressed = 0; +static int ctrlc_disabled __attribute__ ((section(".data"))) = 0; +static int ctrlc_was_pressed __attribute__ ((section(".data"))) = 0; int ctrlc (void) { if (!ctrlc_disabled && gd->have_console) { if (tstc ()) { switch (getc ()) { case 0x03: /* ^C - Control C */ - ctrlc_was_pressed = 1; + if (gd->flags & GD_FLG_RELOC) + ctrlc_was_pressed = 1; return 1; default: break; @@ -274,7 +275,8 @@ int disable_ctrlc (int disable) { int prev = ctrlc_disabled; /* save previous state */ - ctrlc_disabled = disable; + if (gd->flags & GD_FLG_RELOC) + ctrlc_disabled = disable; return prev; } @@ -285,13 +287,35 @@ int had_ctrlc (void) void clear_ctrlc (void) { - ctrlc_was_pressed = 0; + if (gd->flags & GD_FLG_RELOC) + ctrlc_was_pressed = 0; } char * console_buffer_addr(void) { +#ifdef CONFIG_DEBUG_CONSOLE + return (gd->flags & GD_FLG_RELOC ? + console_buffer : CFG_DEBUG_CONSOLE_ADDR); +#else return console_buffer; +#endif +} + +#ifdef CONFIG_DEBUG_CONSOLE +void debug_console (void) +{ + char *console_buffer = console_buffer_addr(); + + while (1) { + if (readline("(debug) => ") <= 0) + continue; + if (!strcmp(console_buffer, "exit")) + break; + + run_command(console_buffer, 0); + } } +#endif #ifdef CONFIG_MODEM_SUPPORT_DEBUG char screen[1024]; diff --git a/common/serial.c b/common/serial.c index bfda7ca..eb65c4c 100644 --- a/common/serial.c +++ b/common/serial.c @@ -29,8 +29,10 @@ DECLARE_GLOBAL_DATA_PTR; #if defined(CONFIG_SERIAL_MULTI) -static struct serial_device *serial_devices = NULL; -static struct serial_device *serial_current = NULL; +static struct serial_device *serial_devices + __attribute__ ((section(".data"))) = NULL; +static struct serial_device *serial_current + __attribute__ ((section(".data"))) = NULL; #if !defined(CONFIG_LWMON) && !defined(CONFIG_PXA27X) struct serial_device *__default_serial_console (void) diff --git a/include/common.h b/include/common.h index 69f5af4..a2621a7 100644 --- a/include/common.h +++ b/include/common.h @@ -629,6 +629,9 @@ int had_ctrlc (void); /* have we had a Control-C since last clear? */ void clear_ctrlc (void); /* clear the Control-C condition */ int disable_ctrlc (int); /* 1 to disable, 0 to enable Control-C detect */ char *console_buffer_addr(void); +#ifdef CONFIG_DEBUG_CONSOLE +void debug_console(void); +#endif /* * STDIO based functions (can always be used) diff --git a/lib_arm/board.c b/lib_arm/board.c index 1f5409b..252a884 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -297,6 +297,9 @@ init_fnc_t *init_sequence[] = { #endif dram_init, /* configure available RAM banks */ display_dram_config, +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL, }; @@ -324,7 +327,16 @@ void start_armboot (void) for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang (); +#endif } } diff --git a/lib_i386/board.c b/lib_i386/board.c index 22191e6..9c52ac8 100644 --- a/lib_i386/board.c +++ b/lib_i386/board.c @@ -222,7 +222,9 @@ init_fnc_t *init_sequence[] = { serial_init, /* serial communications setup */ display_banner, display_dram_config, - +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL, }; @@ -254,7 +256,16 @@ void start_i386boot (void) show_boot_progress(0xa130|i); if ((*init_fnc_ptr)() != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang (); +#endif } } show_boot_progress(0x23); diff --git a/lib_m68k/board.c b/lib_m68k/board.c index dedc9e4..faf2b93 100644 --- a/lib_m68k/board.c +++ b/lib_m68k/board.c @@ -253,6 +253,9 @@ init_fnc_t *init_sequence[] = { testdram, #endif /* CFG_DRAM_TEST */ INIT_FUNC_WATCHDOG_INIT +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL, /* Terminate this list */ }; @@ -297,7 +300,16 @@ board_init_f (ulong bootflag) for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang (); +#endif } } diff --git a/lib_mips/board.c b/lib_mips/board.c index 09b8b3b..ff8caa4 100644 --- a/lib_mips/board.c +++ b/lib_mips/board.c @@ -178,6 +178,9 @@ init_fnc_t *init_sequence[] = { display_banner, /* say that we are here */ checkboard, init_func_ram, +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL, }; @@ -203,7 +206,16 @@ void board_init_f(ulong bootflag) for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang (); +#endif } } diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 262b972..1ff7411 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -360,7 +360,9 @@ init_fnc_t *init_sequence[] = { testdram, #endif /* CFG_DRAM_TEST */ INIT_FUNC_WATCHDOG_RESET - +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL, /* Terminate this list */ }; @@ -427,7 +429,16 @@ void board_init_f (ulong bootflag) for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr) () != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang (); +#endif } } diff --git a/lib_sh/board.c b/lib_sh/board.c index eb81bd9..8a0df48 100644 --- a/lib_sh/board.c +++ b/lib_sh/board.c @@ -163,6 +163,9 @@ init_fnc_t *init_sequence[] = #if defined(CONFIG_CMD_NET) sh_net_init, /* SH specific eth init */ #endif +#if defined(CONFIG_DEBUG_CONSOLE) + ctrlc, /* Let user break out of boot sequence if ctrl-c is pressed */ +#endif NULL /* Terminate this list */ }; @@ -196,7 +199,16 @@ void sh_generic_init (void) for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr , i++) { if ((*init_fnc_ptr) () != 0) { +#ifdef CONFIG_DEBUG_CONSOLE + if (!gd->have_console) + hang(); + + printf("ERROR: init function at %p failed\n", + *init_fnc_ptr); + debug_console(); +#else hang(); +#endif } } -- 1.5.4.3 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot