X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common%2Fconsole.c;h=1177f7d396b889effbb9973b77966a013f15ee96;hb=436da3cd233e7166b5ce9293dbd28092cf37bcc9;hp=2add047880ea63a5fec679f8e18d0c3e1f5abc2d;hpb=9eb468da3fd8753de55ab271d6ff5ed7f36d7ea2;p=u-boot diff --git a/common/console.c b/common/console.c index 2add047880..1177f7d396 100644 --- a/common/console.c +++ b/common/console.c @@ -24,15 +24,11 @@ #include #include #include -#include +#include #include DECLARE_GLOBAL_DATA_PTR; -#ifdef CONFIG_AMIGAONEG3SE -int console_changed = 0; -#endif - #ifdef CONFIG_SYS_CONSOLE_IS_IN_ENV /* * if overwrite_console returns 1, the stdin, stderr and stdout @@ -48,7 +44,7 @@ extern int overwrite_console(void); #endif /* CONFIG_SYS_CONSOLE_IS_IN_ENV */ -static int console_setfile(int file, device_t * dev) +static int console_setfile(int file, struct stdio_dev * dev) { int error = 0; @@ -96,8 +92,8 @@ static int console_setfile(int file, device_t * dev) #if defined(CONFIG_CONSOLE_MUX) /** Console I/O multiplexing *******************************************/ -static device_t *tstcdev; -device_t **console_devices[MAX_FILES]; +static struct stdio_dev *tstcdev; +struct stdio_dev **console_devices[MAX_FILES]; int cd_count[MAX_FILES]; /* @@ -119,7 +115,7 @@ static int console_getc(int file) static int console_tstc(int file) { int i, ret; - device_t *dev; + struct stdio_dev *dev; disable_ctrlc(1); for (i = 0; i < cd_count[file]; i++) { @@ -141,7 +137,7 @@ static int console_tstc(int file) static void console_putc(int file, const char c) { int i; - device_t *dev; + struct stdio_dev *dev; for (i = 0; i < cd_count[file]; i++) { dev = console_devices[file][i]; @@ -153,7 +149,7 @@ static void console_putc(int file, const char c) static void console_puts(int file, const char *s) { int i; - device_t *dev; + struct stdio_dev *dev; for (i = 0; i < cd_count[file]; i++) { dev = console_devices[file][i]; @@ -167,7 +163,7 @@ static inline void console_printdevs(int file) iomux_printdevs(file); } -static inline void console_doenv(int file, device_t *dev) +static inline void console_doenv(int file, struct stdio_dev *dev) { iomux_doenv(file, dev->name); } @@ -197,7 +193,7 @@ static inline void console_printdevs(int file) printf("%s\n", stdio_devices[file]->name); } -static inline void console_doenv(int file, device_t *dev) +static inline void console_doenv(int file, struct stdio_dev *dev) { console_setfile(file, dev); } @@ -205,7 +201,7 @@ static inline void console_doenv(int file, device_t *dev) /** U-Boot INITIAL CONSOLE-NOT COMPATIBLE FUNCTIONS *************************/ -void serial_printf(const char *fmt, ...) +int serial_printf(const char *fmt, ...) { va_list args; uint i; @@ -216,10 +212,11 @@ void serial_printf(const char *fmt, ...) /* For this to work, printbuffer must be larger than * anything we ever want to print. */ - i = vsprintf(printbuffer, fmt, args); + i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args); va_end(args); serial_puts(printbuffer); + return i; } int fgetc(int file) @@ -273,7 +270,7 @@ void fputs(int file, const char *s) console_puts(file, s); } -void fprintf(int file, const char *fmt, ...) +int fprintf(int file, const char *fmt, ...) { va_list args; uint i; @@ -284,11 +281,12 @@ void fprintf(int file, const char *fmt, ...) /* For this to work, printbuffer must be larger than * anything we ever want to print. */ - i = vsprintf(printbuffer, fmt, args); + i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args); va_end(args); /* Send to desired file */ fputs(file, printbuffer); + return i; } /** U-Boot INITIAL CONSOLE-COMPATIBLE FUNCTION *****************************/ @@ -300,6 +298,9 @@ int getc(void) return 0; #endif + if (!gd->have_console) + return 0; + if (gd->flags & GD_FLG_DEVINIT) { /* Get from the standard input */ return fgetc(stdin); @@ -316,6 +317,9 @@ int tstc(void) return 0; #endif + if (!gd->have_console) + return 0; + if (gd->flags & GD_FLG_DEVINIT) { /* Test the standard input */ return ftstc(stdin); @@ -325,6 +329,39 @@ int tstc(void) return serial_tstc(); } +#ifdef CONFIG_PRE_CONSOLE_BUFFER +#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ) + +static void pre_console_putc(const char c) +{ + char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR; + + buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c; +} + +static void pre_console_puts(const char *s) +{ + while (*s) + pre_console_putc(*s++); +} + +static void print_pre_console_buffer(void) +{ + unsigned long i = 0; + char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR; + + if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ) + i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ; + + while (i < gd->precon_buf_idx) + putc(buffer[CIRC_BUF_IDX(i++)]); +} +#else +static inline void pre_console_putc(const char c) {} +static inline void pre_console_puts(const char *s) {} +static inline void print_pre_console_buffer(void) {} +#endif + void putc(const char c) { #ifdef CONFIG_SILENT_CONSOLE @@ -337,6 +374,9 @@ void putc(const char c) return; #endif + if (!gd->have_console) + return pre_console_putc(c); + if (gd->flags & GD_FLG_DEVINIT) { /* Send to the standard output */ fputc(stdout, c); @@ -358,6 +398,9 @@ void puts(const char *s) return; #endif + if (!gd->have_console) + return pre_console_puts(s); + if (gd->flags & GD_FLG_DEVINIT) { /* Send to the standard output */ fputs(stdout, s); @@ -367,36 +410,48 @@ void puts(const char *s) } } -void printf(const char *fmt, ...) +int printf(const char *fmt, ...) { va_list args; uint i; char printbuffer[CONFIG_SYS_PBSIZE]; +#ifndef CONFIG_PRE_CONSOLE_BUFFER + if (!gd->have_console) + return 0; +#endif + va_start(args, fmt); /* For this to work, printbuffer must be larger than * anything we ever want to print. */ - i = vsprintf(printbuffer, fmt, args); + i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args); va_end(args); /* Print the string */ puts(printbuffer); + return i; } -void vprintf(const char *fmt, va_list args) +int vprintf(const char *fmt, va_list args) { uint i; char printbuffer[CONFIG_SYS_PBSIZE]; +#ifndef CONFIG_PRE_CONSOLE_BUFFER + if (!gd->have_console) + return 0; +#endif + /* For this to work, printbuffer must be larger than * anything we ever want to print. */ - i = vsprintf(printbuffer, fmt, args); + i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args); /* Print the string */ puts(printbuffer); + return i; } /* test if ctrl-c was pressed */ @@ -459,7 +514,7 @@ inline void dbg(const char *fmt, ...) /* For this to work, printbuffer must be larger than * anything we ever want to print. */ - i = vsprintf(printbuffer, fmt, args); + i = vsnprintf(printbuffer, sizeof(printbuffer), fmt, args); va_end(args); if ((screen + sizeof(screen) - 1 - cursor) @@ -479,11 +534,11 @@ inline void dbg(const char *fmt, ...) /** U-Boot INIT FUNCTIONS *************************************************/ -device_t *search_device(int flags, char *name) +struct stdio_dev *search_device(int flags, const char *name) { - device_t *dev; + struct stdio_dev *dev; - dev = device_get_by_name(name); + dev = stdio_get_by_name(name); if (dev && (dev->flags & flags)) return dev; @@ -491,10 +546,10 @@ device_t *search_device(int flags, char *name) return NULL; } -int console_assign(int file, char *devname) +int console_assign(int file, const char *devname) { int flag; - device_t *dev; + struct stdio_dev *dev; /* Check for valid file */ switch (file) { @@ -529,15 +584,44 @@ int console_init_f(void) gd->flags |= GD_FLG_SILENT; #endif + print_pre_console_buffer(); + return 0; } +void stdio_print_current_devices(void) +{ +#ifndef CONFIG_SYS_CONSOLE_INFO_QUIET + /* Print information */ + puts("In: "); + if (stdio_devices[stdin] == NULL) { + puts("No input devices available!\n"); + } else { + printf ("%s\n", stdio_devices[stdin]->name); + } + + puts("Out: "); + if (stdio_devices[stdout] == NULL) { + puts("No output devices available!\n"); + } else { + printf ("%s\n", stdio_devices[stdout]->name); + } + + puts("Err: "); + if (stdio_devices[stderr] == NULL) { + puts("No error devices available!\n"); + } else { + printf ("%s\n", stdio_devices[stderr]->name); + } +#endif /* CONFIG_SYS_CONSOLE_INFO_QUIET */ +} + #ifdef CONFIG_SYS_CONSOLE_IS_IN_ENV /* Called after the relocation - use desired console functions */ int console_init_r(void) { char *stdinname, *stdoutname, *stderrname; - device_t *inputdev = NULL, *outputdev = NULL, *errdev = NULL; + struct stdio_dev *inputdev = NULL, *outputdev = NULL, *errdev = NULL; #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE int i; #endif /* CONFIG_SYS_CONSOLE_ENV_OVERWRITE */ @@ -601,29 +685,7 @@ done: gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */ -#ifndef CONFIG_SYS_CONSOLE_INFO_QUIET - /* Print information */ - puts("In: "); - if (stdio_devices[stdin] == NULL) { - puts("No input devices available!\n"); - } else { - console_printdevs(stdin); - } - - puts("Out: "); - if (stdio_devices[stdout] == NULL) { - puts("No output devices available!\n"); - } else { - console_printdevs(stdout); - } - - puts("Err: "); - if (stdio_devices[stderr] == NULL) { - puts("No error devices available!\n"); - } else { - console_printdevs(stderr); - } -#endif /* CONFIG_SYS_CONSOLE_INFO_QUIET */ + stdio_print_current_devices(); #ifdef CONFIG_SYS_CONSOLE_ENV_OVERWRITE /* set the environment variables (will overwrite previous env settings) */ @@ -645,24 +707,28 @@ done: /* Called after the relocation - use desired console functions */ int console_init_r(void) { - device_t *inputdev = NULL, *outputdev = NULL; + struct stdio_dev *inputdev = NULL, *outputdev = NULL; int i; - struct list_head *list = device_get_list(); + struct list_head *list = stdio_get_list(); struct list_head *pos; - device_t *dev; + struct stdio_dev *dev; #ifdef CONFIG_SPLASH_SCREEN /* * suppress all output if splash screen is enabled and we have - * a bmp to display + * a bmp to display. We redirect the output from frame buffer + * console to serial console in this case or suppress it if + * "silent" mode was requested. */ - if (getenv("splashimage") != NULL) - gd->flags |= GD_FLG_SILENT; + if (getenv("splashimage") != NULL) { + if (!(gd->flags & GD_FLG_SILENT)) + outputdev = search_device (DEV_FLAGS_OUTPUT, "serial"); + } #endif /* Scan devices looking for input and output devices */ list_for_each(pos, list) { - dev = list_entry(pos, device_t, list); + dev = list_entry(pos, struct stdio_dev, list); if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) { inputdev = dev; @@ -694,29 +760,7 @@ int console_init_r(void) gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */ -#ifndef CONFIG_SYS_CONSOLE_INFO_QUIET - /* Print information */ - puts("In: "); - if (stdio_devices[stdin] == NULL) { - puts("No input devices available!\n"); - } else { - printf("%s\n", stdio_devices[stdin]->name); - } - - puts("Out: "); - if (stdio_devices[stdout] == NULL) { - puts("No output devices available!\n"); - } else { - printf("%s\n", stdio_devices[stdout]->name); - } - - puts("Err: "); - if (stdio_devices[stderr] == NULL) { - puts("No error devices available!\n"); - } else { - printf("%s\n", stdio_devices[stderr]->name); - } -#endif /* CONFIG_SYS_CONSOLE_INFO_QUIET */ + stdio_print_current_devices(); /* Setting environment variables */ for (i = 0; i < 3; i++) {