/*
 * (C) Copyright 2011-2012 Pali Rohár <pali.rohar@gmail.com>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

ANSI terminal bootmenu command

The "bootmenu" command uses U-Boot menu interfaces and provides
a simple mechanism for creating menus with different boot items.
The cursor keys "Up" and "Down" are used for navigation through
the items. Current active menu item is highlighted and can be
selected using the "Enter" key. The selection of the highlighted
menu entry invokes an U-Boot command (or a list of commands)
associated with this menu entry.

The "bootmenu" command interprets ANSI escape sequencies, so
an ANSI terminal is required for proper menu rendering and item
selection.

The assembling of the menu is done via a set of environment variables
"bootmenu_<num>" and "bootmenu_delay", i.e.:

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

  <delay> is the autoboot delay in seconds, after which the first
  menu entry will be selected automatically

  <num> is the boot menu entry number, starting from zero

  <title> is the text of the menu entry shown on the console
  or on the boot screen

  <commands> are commands which will be executed when a menu
  entry is selected

  (title and commands are separated by first appearance of '='
   character in the environment variable)

First (optional) argument of the "bootmenu" command is a delay specifier
and it overrides the delay value defined by "bootmenu_delay" environment
variable. If the environment variable "bootmenu_delay" is not set or if
the argument of the "bootmenu" command is not specified, the default delay
will be CONFIG_BOOTDELAY. If delay is 0, no menu entries will be shown on
the console (or on the screen) and the command of the first menu entry will
be called immediately. If delay is less then 0, bootmenu will be shown and
autoboot will be disabled.

Bootmenu always adds menu entry "U-Boot console" at the end of all menu
entries specified by environment variables. When selecting this entry
the bootmenu terminates and the usual U-Boot command prompt is presented
to the user.

Example environment:

  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
  bootmenu 20        # Run bootmenu with autoboot delay 20s


The above example will be rendered as below
(without decorating rectangle):

┌──────────────────────────────────────────┐
│                                          │
│  *** U-Boot Boot Menu ***                │
│                                          │
│     Boot 1. kernel                       │
│     Boot 2. kernel                       │
│     Reset board                          │
│     U-Boot boot order                    │
│     U-Boot console                       │
│                                          │
│  Hit any key to stop autoboot: 20        │
│  Press UP/DOWN to move, ENTER to select  │
│                                          │
└──────────────────────────────────────────┘

Selected menu entry will be highlighted - it will have inverted
background and text colors.

To enable the "bootmenu" command add following definitions to the
board config file:

  #define CONFIG_CMD_BOOTMENU
  #define CONFIG_MENU

To run the bootmenu at startup add these additional definitions:

  #define CONFIG_AUTOBOOT_KEYED
  #define CONFIG_BOOTDELAY 30
  #define CONFIG_MENU_SHOW

When you intend to use the bootmenu on color frame buffer console,
make sure to additionally define CONFIG_CFB_CONSOLE_ANSI in the
board config file.
