[RFC 1/2] ARM omap: Add null console

Sanjeev Premi premi at ti.com
Wed Jan 11 12:34:43 EST 2012


When using barebox as both 1st and 2nd stage bootloader,
same banner gets printed - date being the only difference.

For the first stage bootloader, prints are definitely
required during initial debug and development phases,
but after that, they can easily be avoided.

And if we don't need prints, then we can do without the
serial driver as well.

With this background, this patch introduces concept of
NULL console. Most Kconfig changes are quite simple.

Separate file console_null.c was created only for ease
of review and maintaining console_simple.c as-is.

In final version, appropriate #ifdefs in console_simple.c
should be used.

Visually, the prompt from barebox.bin comes up is about
a second - and appears to be much faster.

Here is comparison of the size:

   text    data     bss     dec     hex filename
  45801    3300    4024   53125    cf85 barebox  (Before)
  44221    3196    4020   51437    c8ed barebox  (After)

Tested on OMAP3EVM with xload configuration derived from
omap3530_beagle_xload_defconfig.

Signed-off-by: Sanjeev Premi <premi at ti.com>
Cc: Sascha Hauer <s.hauer at pengutronix.de>
Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---

 Although I have marked the change to be specific to
 ARM+OMAP, it could be generally applicable.

 arch/arm/mach-omap/Kconfig |    4 +-
 common/Kconfig             |   11 +++-
 common/Makefile            |    1 +
 common/console_null.c      |  135 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/serial/Kconfig     |    1 +
 5 files changed, 149 insertions(+), 3 deletions(-)
 create mode 100644 common/console_null.c

diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index 72c6850..9edb4a9 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -171,13 +171,13 @@ if MACH_OMAP3EVM
 
 	config OMAP3EVM_UART1
 		bool "Use UART1"
-		depends on MACH_OMAP3EVM
+		depends on MACH_OMAP3EVM && !CONSOLE_NULL
 		help
 		  Say Y here if you would like to use UART1 as console.
 
 	config OMAP3EVM_UART3
 		bool "Use UART3"
-		depends on MACH_OMAP3EVM
+		depends on MACH_OMAP3EVM && !CONSOLE_NULL
 		help
 		  Say Y here if you would like to use UART3 as console.
 	endchoice
diff --git a/common/Kconfig b/common/Kconfig
index ca4f099..a664624 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -377,10 +377,19 @@ config CONSOLE_FULL
 	  This option enables full console support capable of
 	  handling multiple consoles.
 
+config CONSOLE_NULL
+	bool
+	depends on !CONSOLE_FULL
+	prompt "Enable null console"
+	help
+	  This option enables null console i.e. there is no real
+	  read/ write operation.
+
 config CONSOLE_SIMPLE
 	bool
 	default y
-	depends on !CONSOLE_FULL
+	depends on !CONSOLE_FULL && !CONSOLE_NULL
+
 
 config CONSOLE_ACTIVATE_FIRST
 	depends on CONSOLE_FULL
diff --git a/common/Makefile b/common/Makefile
index d1132c3..6705257 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -20,6 +20,7 @@ obj-y += clock.o
 obj-y += version.o
 obj-$(CONFIG_COMMAND_SUPPORT) += command.o
 obj-$(CONFIG_CONSOLE_FULL) += console.o
+obj-$(CONFIG_CONSOLE_NULL) += console_null.o
 obj-$(CONFIG_CONSOLE_SIMPLE) += console_simple.o
 obj-$(CONFIG_DIGEST) += digest.o
 obj-$(CONFIG_ENVIRONMENT_VARIABLES) += env.o
diff --git a/common/console_null.c b/common/console_null.c
new file mode 100644
index 0000000..7b2db37
--- /dev/null
+++ b/common/console_null.c
@@ -0,0 +1,135 @@
+#include <config.h>
+#include <common.h>
+#include <fs.h>
+#include <errno.h>
+
+int printf (const char *fmt, ...)
+{
+	va_list args;
+	uint i;
+	char printbuffer[CFG_PBSIZE];
+
+	va_start (args, fmt);
+
+	/* For this to work, printbuffer must be larger than
+	 * anything we ever want to print.
+	 */
+	i = vsprintf (printbuffer, fmt, args);
+	va_end (args);
+
+	/* Don't put off callers who check for return value */
+	return i;
+}
+EXPORT_SYMBOL(printf);
+
+int vprintf (const char *fmt, va_list args)
+{
+	uint i;
+	char printbuffer[CFG_PBSIZE];
+
+	/* For this to work, printbuffer must be larger than
+	 * anything we ever want to print.
+	 */
+	i = vsprintf (printbuffer, fmt, args);
+
+	/* Don't put off callers who check for return value */
+	return i;
+}
+EXPORT_SYMBOL(vprintf);
+
+int fprintf(int file, const char *fmt, ...)
+{
+	va_list args;
+	uint i;
+	char printbuffer[CFG_PBSIZE];
+
+	va_start (args, fmt);
+
+	/* For this to work, printbuffer must be larger than
+	 * anything we ever want to print.
+	 */
+	i = vsprintf (printbuffer, fmt, args);
+	va_end (args);
+
+	/* Don't put off callers who check for return value */
+	return i;
+}
+EXPORT_SYMBOL(fprintf);
+
+int console_puts(unsigned int ch, const char *str)
+{
+	const char *s = str;
+	int i = 0;
+
+	while (*s)
+		i++;
+
+	/* Don't put off callers who check for return value */
+	return i;
+}
+EXPORT_SYMBOL(console_puts);
+
+void console_putc(unsigned int ch, char c)
+{
+}
+EXPORT_SYMBOL(console_putc);
+
+int fputc(int fd, char c)
+{
+	if (fd == 1)
+		putchar(c);
+	else if (fd == 2)
+		eputc(c);
+	else
+		return write(fd, &c, 1);
+	return 0;
+}
+EXPORT_SYMBOL(fputc);
+
+int fputs(int fd, const char *s)
+{
+	if (fd == 1)
+		puts(s);
+	else if (fd == 2)
+		eputs(s);
+	else
+		return write(fd, s, strlen(s));
+	return 0;
+}
+EXPORT_SYMBOL(fputs);
+
+int tstc(void)
+{
+	return 0;
+}
+EXPORT_SYMBOL(tstc);
+
+int getc(void)
+{
+	return -EINVAL;
+}
+EXPORT_SYMBOL(getc);
+
+void console_flush(void)
+{
+}
+EXPORT_SYMBOL(console_flush);
+
+#ifndef ARCH_HAS_CTRLC
+/* test if ctrl-c was pressed */
+int ctrlc (void)
+{
+	return 0;
+}
+EXPORT_SYMBOL(ctrlc);
+#endif /* ARCH_HAS_CTRC */
+
+int console_register(struct console_device *newcdev)
+{
+	return 0;
+}
+
+int console_unregister(struct console_device *cdev)
+{
+	return -EBUSY;
+}
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 186b596..cc0e583 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -56,6 +56,7 @@ config DRIVER_SERIAL_ALTERA_JTAG
 config DRIVER_SERIAL_NS16550
 	default n
 	bool "NS16550 serial driver"
+	depends on !CONSOLE_NULL
 	help
 	  Enable this to get support for NS16550 based serial devices
 
-- 
1.7.0.4




More information about the barebox mailing list