All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali.rohar@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 14/15] New command bootmenu: ANSI terminal Boot Menu support
Date: Sun, 18 Dec 2011 22:34:10 +0100	[thread overview]
Message-ID: <1324244051-25756-14-git-send-email-pali.rohar@gmail.com> (raw)
In-Reply-To: <1324244051-25756-1-git-send-email-pali.rohar@gmail.com>

 * Configuration is done via env variables bootmenu_delay and bootmenu_<num>:

    bootmenu_delay=<delay>
    bootmenu_<num>="<title>=<commands>"

    (title and commands are separated by first char '=')

    <delay> is delay in seconds of autobooting first entry
    <num> is boot menu entry, starting from zero
    <title> is text shown in boot screen
    <commands> are commands which will be executed when menu entry is selected

 * First argument of bootmenu command override bootmenu_delay env
 * If env bootmenu_delay or bootmenu arg is not specified, delay is 10 seconds
 * If delay is 0, no entry will be shown on screen and first will be called
 * If delay is less then 0, no autoboot delay will be used
 * Boot Menu will stop finding next menu entry if last was not defined
 * Boot Menu always add menu entry "U-Boot console" at end of all entries

 * Example using:

    setenv bootmenu_0 Boot 1. kernel=bootm 0x82000000  # Set first menu entry
    setenv bootmenu_1 Boot 2. kernel=bootm 0x83000000  # Set second menu entry
    setenv bootmenu_2 Reset board=reset                # Set third menu entry
    setenv bootmenu_3 U-Boot boot order=boot           # Set fourth menu entry
    setenv bootmenu_4  # Empty string is end of all bootmenu entries
    bootmenu 20        # Run bootmenu with autoboot delay 20s

Signed-off-by: Pali Roh?r <pali.rohar@gmail.com>
---
 common/Makefile          |    1 +
 common/cmd_bootmenu.c    |  366 ++++++++++++++++++++++++++++++++++++++++++++++
 include/config_cmd_all.h |    1 +
 3 files changed, 368 insertions(+), 0 deletions(-)
 create mode 100644 common/cmd_bootmenu.c

diff --git a/common/Makefile b/common/Makefile
index e1efd45..7402bfb 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -67,6 +67,7 @@ COBJS-$(CONFIG_CMD_SOURCE) += cmd_source.o
 COBJS-$(CONFIG_CMD_BDI) += cmd_bdinfo.o
 COBJS-$(CONFIG_CMD_BEDBUG) += bedbug.o cmd_bedbug.o
 COBJS-$(CONFIG_CMD_BMP) += cmd_bmp.o
+COBJS-$(CONFIG_CMD_BOOTMENU) += cmd_bootmenu.o
 COBJS-$(CONFIG_CMD_BOOTLDR) += cmd_bootldr.o
 COBJS-$(CONFIG_CMD_CACHE) += cmd_cache.o
 COBJS-$(CONFIG_CMD_CLEAR) += cmd_clear.o
diff --git a/common/cmd_bootmenu.c b/common/cmd_bootmenu.c
new file mode 100644
index 0000000..931ed18
--- /dev/null
+++ b/common/cmd_bootmenu.c
@@ -0,0 +1,366 @@
+/*
+ * (C) Copyright 2011 Pali Roh?r <pali.rohar@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <watchdog.h>
+#include <linux/string.h>
+
+#ifdef CONFIG_SYS_HUSH_PARSER
+#include <hush.h>
+#endif
+
+static char *get_option(int n)
+{
+
+	char name[] = "bootmenu_\0\0";
+
+	if (n < 0 || n > 99)
+		return NULL;
+
+	sprintf(name+9, "%d", n);
+
+	return getenv(name);
+
+}
+
+static char *get_end_of_title(char *str)
+{
+
+	if (!str)
+		return NULL;
+
+	return strchr(str, '=');
+
+}
+
+static int print_title(char *begin, char *end)
+{
+
+	if (!begin || !end || end < begin)
+		return 1;
+
+	while (begin != end)
+		putc(*(begin++));
+
+	return 0;
+
+}
+
+static int print_entry(int n, int reverse)
+{
+
+	char *str = get_option(n);
+	char *end = get_end_of_title(str);
+
+	if (!end)
+		return 1;
+
+	printf(ANSI_CURSOR_POSITION, n+4, 1);
+
+	if (reverse)
+		puts(ANSI_COLOR_REVERSE);
+
+	puts("     ");
+	print_title(str, end);
+	puts(ANSI_CLEAR_LINE_TO_END);
+
+	if (reverse)
+		puts(ANSI_COLOR_RESET);
+
+	return 0;
+
+}
+
+static int print_menu(int active)
+{
+
+	int n = 0;
+
+	printf(ANSI_CURSOR_POSITION, 1, 1);
+	puts(ANSI_CLEAR_LINE);
+	printf(ANSI_CURSOR_POSITION, 2, 1);
+	puts("  *** U-Boot BOOT MENU ***");
+	puts(ANSI_CLEAR_LINE_TO_END);
+	printf(ANSI_CURSOR_POSITION, 3, 1);
+	puts(ANSI_CLEAR_LINE);
+
+	while (1) {
+
+		int ret = print_entry(n, n == active ? 1 : 0);
+
+		if (ret == 1)
+			break;
+
+		++n;
+
+	}
+
+	printf(ANSI_CURSOR_POSITION, n+4, 1);
+
+	if (n == active)
+		puts(ANSI_COLOR_REVERSE);
+
+	puts("     U-Boot console");
+	puts(ANSI_CLEAR_LINE_TO_END);
+
+	if (n == active)
+		puts(ANSI_COLOR_RESET);
+
+	printf(ANSI_CURSOR_POSITION, n+5, 1);
+	puts(ANSI_CLEAR_LINE);
+	printf(ANSI_CURSOR_POSITION, n+6, 1);
+	puts("  Press UP/DOWN to move, ENTER to select");
+	puts(ANSI_CLEAR_LINE_TO_END);
+	printf(ANSI_CURSOR_POSITION, n+7, 1);
+	puts(ANSI_CLEAR_LINE);
+
+	return n;
+
+}
+
+int do_bootmenu(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+
+	int active = 0;
+	int abort = 0;
+	int key = 0; /* 0 - NONE, 1 - UP, 2 - DOWN, 3 - SELECT */
+	int esc = 0;
+	int count = 0;
+	int delay = 10;
+	int instant = 0;
+	char *delay_str = NULL;
+
+	if (argc >= 2)
+		delay_str = argv[1];
+
+	if (!delay_str)
+		delay_str = getenv("bootmenu_delay");
+
+	if (delay_str)
+		delay = (int)simple_strtol(delay_str, NULL, 10);
+
+	if (delay == 0) {
+
+		/* prevent setting U-Boot console as first menu entry */
+		if (get_end_of_title(get_option(0)))
+			count = 1;
+
+		instant = 1;
+
+	}
+
+	if (delay < 0)
+		abort = 1;
+
+	if (!instant) {
+
+		puts(ANSI_CURSOR_HIDE);
+		puts(ANSI_CLEAR_CONSOLE);
+		printf(ANSI_CURSOR_POSITION, 1, 1);
+
+	}
+
+	while (1) {
+
+		if (abort || delay > 0)
+			count = print_menu(active);
+
+		if (!abort) {
+
+			if (delay > 0)
+				printf("  Hit any key to stop autoboot: %2d ",
+						delay);
+
+			while (delay > 0) {
+
+				int i;
+
+				for (i = 0; i < 100; ++i) {
+
+					if (tstc()) {
+
+						abort = 1;
+						key = getc();
+
+						if (key == '\e') {
+							esc = 1;
+							key = 0;
+						} else if (key == '\r')
+							key = 3;
+						else
+							key = 0;
+
+						break;
+
+					}
+
+					WATCHDOG_RESET();
+					udelay(10000);
+
+				}
+
+				if (abort)
+					break;
+
+				--delay;
+				printf("\b\b\b%2d ", delay);
+
+			}
+
+			if (delay <= 0)
+				key = 3;
+
+		} else {
+
+			while (!tstc()) {
+
+				WATCHDOG_RESET();
+				udelay(10000);
+
+			}
+
+			key = getc();
+
+			if (esc == 0) {
+
+				if (key == '\e') {
+					esc = 1;
+					key = 0;
+				}
+
+			} else if (esc == 1) {
+
+				if (key == '[') {
+					esc = 2;
+					key = 0;
+				} else
+					esc = 0;
+
+			} else if (esc == 2 || esc == 3) {
+
+				if (esc == 2 && key == '1') {
+					esc = 3;
+					key = 0;
+				} else
+					esc = 0;
+
+				if (key == 'A')
+					key = 1;
+				else if (key == 'B')
+					key = 2;
+				else
+					key = 0;
+
+			}
+
+			if (key == '\r')
+				key = 3;
+
+		}
+
+		if (key == 1) {
+
+			if (active > 0)
+				--active;
+
+		} else if (key == 2) {
+
+			if (active < count)
+				++active;
+
+		} else if (key == 3) {
+
+			char *str;
+			char *end;
+
+			putc('\n');
+
+			if (!instant) {
+
+				puts(ANSI_CURSOR_SHOW);
+				puts(ANSI_CLEAR_CONSOLE);
+				printf(ANSI_CURSOR_POSITION, 1, 1);
+
+			}
+
+			WATCHDOG_RESET();
+
+			/* last entry is always U-Boot console */
+			if (active == count) {
+
+				puts("Starting U-Boot console\n\n");
+				return 0;
+
+			}
+
+			str = get_option(active);
+			end = get_end_of_title(str);
+
+			if (!end) {
+
+				printf("Invalid Boot Menu entry %d\n", active);
+				puts("Starting U-Boot console\n\n");
+				return 0;
+
+			}
+
+			if (!end[1]) {
+
+				printf("Invalid Boot Menu entry %d: ", active);
+				print_title(str, end);
+				puts("\nStarting U-Boot console\n\n");
+				return 0;
+
+			}
+
+			printf("Booting Boot Menu entry %d: ", active);
+			print_title(str, end);
+			puts(" ...\n\n");
+
+#ifndef CONFIG_SYS_HUSH_PARSER
+			run_command(end+1, 0);
+#else
+			parse_string_outer(end+1, FLAG_PARSE_SEMICOLON |
+					FLAG_EXIT_FROM_LOOP);
+#endif
+
+			printf("\nFailed booting Boot Menu entry %d: ", active);
+			print_title(str, end);
+			puts("\nStarting U-Boot console\n\n");
+			return 0;
+
+		}
+
+	}
+
+	/* never happends */
+	return 1;
+
+}
+
+U_BOOT_CMD(
+	bootmenu, 2, 1, do_bootmenu,
+	"ANSI terminal bootmenu",
+	"[delay]\n"
+	"    - show ANSI terminal bootmenu with autoboot delay (default 10s)"
+);
diff --git a/include/config_cmd_all.h b/include/config_cmd_all.h
index 3f25eba..8c0a648 100644
--- a/include/config_cmd_all.h
+++ b/include/config_cmd_all.h
@@ -20,6 +20,7 @@
 #define CONFIG_CMD_BEDBUG	/* Include BedBug Debugger	*/
 #define CONFIG_CMD_BMP		/* BMP support			*/
 #define CONFIG_CMD_BOOTD	/* bootd			*/
+#define CONFIG_CMD_BOOTMENU	/* ANSI terminal Boot Menu	*/
 #define CONFIG_CMD_BSP		/* Board Specific functions	*/
 #define CONFIG_CMD_CACHE	/* icache, dcache		*/
 #define CONFIG_CMD_CDP		/* Cisco Discovery Protocol	*/
-- 
1.7.5.4

  parent reply	other threads:[~2011-12-18 21:34 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-01  8:42 [U-Boot] Help: U-Boot on Nokia RX-51 (aka N900) Pali Rohár
2011-09-01  8:46 ` Marek Vasut
2011-09-01  9:06   ` Pali Rohár
2011-09-01  9:39     ` Marek Vasut
2011-09-01  9:02 ` Stefano Babic
2011-09-01  9:09   ` Pali Rohár
2011-09-01  9:24     ` Stefano Babic
2011-09-01 10:49       ` Pali Rohár
2011-09-01 11:04         ` Marek Vasut
2011-09-01 11:34           ` [U-Boot] [PATCH 01/15] Make bootm optionally use pre-existing atags for Linux kernel boot Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 02/15] Store existing atags at startup if chainloading Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 03/15] Nokia RX-51 aka N900 support Pali Rohár
2011-09-01 13:57               ` Mike Frysinger
2011-10-09  0:20                 ` Pali Rohár
2011-10-09 15:59                   ` Mike Frysinger
2011-10-12 15:10                     ` Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 04/15] Only delay boot if keyboard open Pali Rohár
2011-09-01 13:58               ` Mike Frysinger
2011-10-08 23:29                 ` Pali Rohár
2011-10-09 16:00                   ` Mike Frysinger
2011-09-01 11:34             ` [U-Boot] [PATCH 05/15] Change Wireless LAN mode from M4 to M0 Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 06/15] Look for boot.scr on 'mmc 0:3' instead 'mmc 0' and add support for loading boot.scr from 'mmc 2:1' Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 07/15] RX-51: Fixed compilation on top of master (changes from Beagle Board) Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 08/15] RX-51: Add support for resetting twl4030 watchdog Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 09/15] RX-51: Fix keymap Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 10/15] include/common.h: Add some macros for ANSI escape codes Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 11/15] drivers/video/cfb_console.c: Added support " Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 12/15] New command bootmenu: ANSI terminal Boot Menu support Pali Rohár
2011-09-01 13:59               ` Mike Frysinger
2011-10-08 23:31                 ` Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 13/15] New config variable CONFIG_MENU Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 14/15] New config variable CONFIG_PREMONITOR Pali Rohár
2011-09-01 11:34             ` [U-Boot] [PATCH 15/15] RX-51: Add support for bootmenu Pali Rohár
2011-09-01 13:52             ` [U-Boot] [PATCH 01/15] Make bootm optionally use pre-existing atags for Linux kernel boot Mike Frysinger
2011-10-08 23:37               ` Pali Rohár
2011-09-01 11:53         ` [U-Boot] Help: U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-10-09  0:24           ` Pali Rohár
2011-09-01 17:11 ` Pali Rohár
2011-12-17 16:59 ` [U-Boot] " Pali Rohár
2011-12-17 17:03   ` [U-Boot] [PATCH 01/16] arch/arm/cpu/armv7/omap3/lowlevel_init.S: save_boot_params Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 02/16] arch/arm/lib/bootm.c: Optionally use existing atags Pali Rohár
2011-12-18 18:54       ` Mike Frysinger
2011-12-18 20:12         ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 03/16] include/twl4030.h: Add power bus message definitions Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 04/16] include/common.h: Add some ANSI escape codes definitions Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 05/16] common/main.c: Fix function readline Pali Rohár
2011-12-18 18:58       ` Mike Frysinger
2011-12-18 20:12         ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 06/16] drivers/video/cfb_console.c: Fix function console_scrollup Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 07/16] drivers/video/cfb_console.c: Add function console_swap_colors Pali Rohár
2011-12-18 18:57       ` Mike Frysinger
2011-12-18 19:00         ` Pali Rohár
2011-12-18 20:06           ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 08/16] drivers/video/cfb_console.c: Add function console_clear and console_clear_line Pali Rohár
2011-12-18 19:00       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 09/16] drivers/video/cfb_console.c: Add functions for moving with cursor Pali Rohár
2011-12-18 19:00       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 10/16] drivers/video/cfb_console.c: Add support for some ANSI terminal escape codes Pali Rohár
2011-12-18 19:01       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 11/16] New command clr: Clear the ANSI terminal Pali Rohár
2011-12-18 18:56       ` Mike Frysinger
2011-12-18 19:20         ` Pali Rohár
2011-12-18 20:07           ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 12/16] New config variable CONFIG_MENUCMD Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 13/16] New config variable CONFIG_PREMONITOR Pali Rohár
2011-12-18 19:05       ` Mike Frysinger
2011-12-18 19:37         ` Pali Rohár
2011-12-18 20:08           ` Mike Frysinger
2011-12-18 20:14             ` Pali Rohár
2011-12-17 17:03     ` [U-Boot] [PATCH 14/16] New board support: Nokia RX-51 aka N900 Pali Rohár
2011-12-18 19:06       ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 15/16] New command bootmenu: ANSI terminal Boot Menu support Pali Rohár
2011-12-18 19:07       ` Mike Frysinger
2011-12-18 19:12         ` Pali Rohár
2011-12-18 20:07           ` Mike Frysinger
2011-12-18 20:16             ` Pali Rohár
2012-01-06  6:59               ` Mike Frysinger
2011-12-17 17:03     ` [U-Boot] [PATCH 16/16] RX-51: Add support for bootmenu Pali Rohár
2011-12-17 19:25   ` [U-Boot] U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-12-18 10:13     ` Pali Rohár
2011-12-18 12:42       ` Wolfgang Denk
2011-12-18 19:01   ` Mike Frysinger
2011-12-18 20:10     ` Pali Rohár
2011-12-18 21:33   ` [U-Boot] [PATCH v3] " Pali Rohár
2011-12-18 21:33     ` [U-Boot] [PATCH 01/15] arch/arm/cpu/armv7/omap3/lowlevel_init.S: save_boot_params Pali Rohár
2011-12-18 21:33       ` [U-Boot] [PATCH 02/15] arch/arm/lib/bootm.c: Optionally use existing atags Pali Rohár
2011-12-18 21:33       ` [U-Boot] [PATCH 03/15] include/twl4030.h: Add power bus message definitions Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 04/15] include/common.h: Add some ANSI escape codes definitions Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 05/15] common/main.c: Fix function readline Pali Rohár
2012-01-06 20:15         ` Mike Frysinger
2012-01-07  8:51           ` Pali Rohár
2012-02-27  4:33             ` Mike Frysinger
2012-02-27 18:40               ` Pali Rohár
2012-02-27 20:20                 ` Mike Frysinger
2011-12-18 21:34       ` [U-Boot] [PATCH 06/15] drivers/video/cfb_console.c: Fix function console_scrollup Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 07/15] drivers/video/cfb_console.c: Add function console_clear and console_clear_line Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 08/15] drivers/video/cfb_console.c: Add functions for moving with cursor Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 09/15] drivers/video/cfb_console.c: Add support for some ANSI terminal escape codes Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 10/15] New command clear: Clear the ANSI terminal Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 11/15] New config variable CONFIG_MENUCMD Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 12/15] New config variable CONFIG_PREMONITOR Pali Rohár
2011-12-18 21:34       ` [U-Boot] [PATCH 13/15] New board support: Nokia RX-51 aka N900 Pali Rohár
2012-01-03 16:05         ` Tom Rini
2012-01-10 13:14           ` Pali Rohár
2012-01-10 14:53             ` Tom Rini
2011-12-18 21:34       ` Pali Rohár [this message]
2011-12-18 21:34       ` [U-Boot] [PATCH 15/15] RX-51: Add support for bootmenu Pali Rohár
2012-01-03 16:06         ` Tom Rini
2011-12-18 23:57     ` [U-Boot] [PATCH v3] U-Boot on Nokia RX-51 (aka N900) Wolfgang Denk
2011-12-19  7:17       ` Pali Rohár
2011-12-19  8:43         ` Graeme Russ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1324244051-25756-14-git-send-email-pali.rohar@gmail.com \
    --to=pali.rohar@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.