diff --git a/common/Kconfig b/common/Kconfig index 983d305..9af0a54 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -594,6 +594,17 @@ endchoice +config PBL_CONSOLE + depends on PBL_IMAGE + depends on !CONSOLE_NONE + bool "Enable console support in PBL" + help + This enables printf/pr_* support in the PBL to get more + informational output earlier during startup. Note that + printf/pr_* need a valid C environment, so the binary + must be running at the address it's linked at and bss must + be cleared. On ARM that would be after setup_c(). + config PARTITION bool prompt "Enable Partitions" @@ -935,18 +946,6 @@ help If enabled this will print initcall traces. -config PBL_CONSOLE - depends on PBL_IMAGE - depends on DEBUG_LL - depends on !CONSOLE_NONE - bool "Enable console support in PBL" - help - This enables printf/pr_* support in the PBL to get more - informational output earlier during startup. Note that - printf/pr_* need a valid C environment, so the binary - must be running at the address it's linked at and bss must - be cleared. On ARM that would be after setup_c(). - endmenu config HAS_DEBUG_LL diff --git a/include/console.h b/include/console.h index 839ec17..a6737c8 100644 --- a/include/console.h +++ b/include/console.h @@ -83,4 +83,10 @@ int console_set_baudrate(struct console_device *cdev, unsigned baudrate); unsigned console_get_baudrate(struct console_device *cdev); +#ifdef CONFIG_PBL_CONSOLE +void pbl_set_putc(void (*putcf)(void *ctx, int c), void *ctx); +#else +static inline void pbl_set_putc(void (*putcf)(void *ctx, int c), void *ctx) {} +#endif + #endif diff --git a/pbl/console.c b/pbl/console.c index a9859ad..3574753 100644 --- a/pbl/console.c +++ b/pbl/console.c @@ -1,6 +1,47 @@ #include #include +static void (*__putc)(void *ctx, int c); +static void *putc_ctx; + +/** + * pbl_set_putc() - setup UART used for PBL console + * @putc: The putc function. + * @ctx: The context pointer passed back to putc + * + * This sets the putc function which is afterwards used to output + * characters in the PBL. + */ +void pbl_set_putc(void (*putcf)(void *ctx, int c), void *ctx) +{ + __putc = putcf; + putc_ctx = ctx; +} + +void console_putc(unsigned int ch, char c) +{ + if (!__putc) + putc_ll(c); + else + __putc(putc_ctx, c); +} + +int console_puts(unsigned int ch, const char *str) +{ + int n = 0; + + while (*str) { + if (*str == '\n') + putc_ll('\r'); + + console_putc(CONSOLE_STDOUT, *str); + str++; + n++; + } + + return n; +} + int printf(const char *fmt, ...) { va_list args; @@ -11,7 +52,7 @@ i = vsprintf(printbuffer, fmt, args); va_end(args); - puts_ll(printbuffer); + console_puts(CONSOLE_STDOUT, printbuffer); return i; } @@ -26,7 +67,7 @@ i = vsprintf(printbuffer, fmt, args); va_end(args); - puts_ll(printbuffer); + console_puts(CONSOLE_STDOUT, printbuffer); return i; } @@ -35,8 +76,3 @@ { return 0; } - -void console_putc(unsigned int ch, char c) -{ - putc_ll(c); -}