diff --git a/README b/README index e9d189108f..ff72e4705f 100644 --- a/README +++ b/README @@ -638,6 +638,23 @@ The following options need to be configured: 'Sane' compilers will generate smaller code if CONFIG_PRE_CON_BUF_SZ is a power of 2 +- Pre-console putc(): + Prior to the console being initialised, console output is + normally silently discarded. This can be annoying if a + panic() happens in this time. + + If the CONFIG_PRE_CONSOLE_PUTC option is defined, then + U-Boot will call board_pre_console_putc() for each output + character in this case, This function should try to output + the character if possible, perhaps on all available UARTs + (it will need to do this directly, since the console code + is not functional yet). Note that if the panic happens + early enough, then it is possible that board_init_f() + (or even arch_cpu_init() on ARM) has not been called yet. + You should init all clocks, GPIOs, etc. that are needed + to get the character out. Baud rates will need to default + to something sensible. + - Boot Delay: CONFIG_BOOTDELAY - in seconds Delay before automatically booting the default image; set to -1 to disable autoboot. diff --git a/common/console.c b/common/console.c index f17875ead0..d34a0f4d87 100644 --- a/common/console.c +++ b/common/console.c @@ -329,14 +329,19 @@ int tstc(void) return serial_tstc(); } -#ifdef CONFIG_PRE_CONSOLE_BUFFER +#if defined(CONFIG_PRE_CONSOLE_BUFFER) || defined(CONFIG_PRE_CONSOLE_PUTC) #define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ) static void pre_console_putc(const char c) { +#ifdef CONFIG_PRE_CONSOLE_BUFFER char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR; buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c; +#endif +#ifdef CONFIG_PRE_CONSOLE_PUTC + board_pre_console_putc(c); +#endif } static void pre_console_puts(const char *s) @@ -347,6 +352,7 @@ static void pre_console_puts(const char *s) static void print_pre_console_buffer(void) { +#ifdef CONFIG_PRE_CONSOLE_BUFFER unsigned long i = 0; char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR; @@ -355,7 +361,9 @@ static void print_pre_console_buffer(void) while (i < gd->precon_buf_idx) putc(buffer[CIRC_BUF_IDX(i++)]); +#endif } + #else static inline void pre_console_putc(const char c) {} static inline void pre_console_puts(const char *s) {} diff --git a/include/common.h b/include/common.h index 05a658cdf9..5cfdd762dc 100644 --- a/include/common.h +++ b/include/common.h @@ -285,6 +285,13 @@ extern ulong monitor_flash_len; int mac_read_from_eeprom(void); extern u8 _binary_dt_dtb_start[]; /* embedded device tree blob */ +/* + * Called when console output is requested before the console is available. + * The board should do its best to get the character out to the user any way + * it can. + */ +void board_pre_console_putc(int ch); + /* common/flash.c */ void flash_perror (int);