[PATCH] bootmenu: Allow to quit it via CTRL+C

Pali Rohár pali at kernel.org
Sat Dec 26 23:35:10 CET 2020


On Saturday 26 December 2020 23:15:29 Heinrich Schuchardt wrote:
> On 12/26/20 8:50 PM, Pali Rohár wrote:
> > On Saturday 26 December 2020 20:44:45 Heinrich Schuchardt wrote:
> > > Am 26. Dezember 2020 20:15:40 MEZ schrieb "Pali Rohár" <pali at kernel.org>:
> > > > On Saturday 26 December 2020 20:10:10 Heinrich Schuchardt wrote:
> > > > > Am 26. Dezember 2020 20:03:56 MEZ schrieb "Pali Rohár"
> > > > <pali at kernel.org>:
> > > > > > On Saturday 26 December 2020 19:44:23 Heinrich Schuchardt wrote:
> > > > > > > Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár"
> > > > > > <pali at kernel.org>:
> > > > > > > > When CTRL+C is pressed interrupt bootmenu and jump into U-Boot
> > > > > > console.
> > > > > > > > As the last entry in bootmenu is always U-Boot console just
> > > > choose
> > > > > > the
> > > > > > > > last
> > > > > > > > entry when CTRL+C is pressed.
> > > > > > > > 
> > > > > > > > It is useful when bootmenu is part of boot process and you want
> > > > to
> > > > > > > > interrupt boot process by scripts which control U-Boot (serial)
> > > > > > > > console.
> > > > > > > 
> > > > > > > Wouldn't the escape key be a better choice?
> > > > > > 
> > > > > > I can add also escape key. But has escape key stable ANSI sequence
> > > > > > which
> > > > > > is needed to catch? If you tell me which bytes to catch (for escape
> > > > > > key)
> > > > > > I will add it.
> > > > > 
> > > > > 0x1b is Escape
> > > > 
> > > > Does not work. 0x1b is not escape key. It is start of the ANSI escape
> > > > sequence which matches also existing keys up and down.
> > > 
> > > On the serial console you have to hit the key twice.
> > > 
> > > The device driver will tranlate it to a single 0x1b which is the char you want to react to.
> > 
> > Which device driver? bootmenu code is already catching and reacting to
> > the byte 0x1b as part of the key up and key down matching. So single
> > 0x1b for sure cannot be caught in bootmenu code as then key up and key
> > down keys stops working. If it is really 0x1b byte then it needs to be
> > somehow escaped and therefore be part of some longer, not single byte
> > sequence.
> > 
> 
> diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
> index 1ba7b622e5..26222ff8b7 100644
> --- a/cmd/bootmenu.c
> +++ b/cmd/bootmenu.c
> @@ -44,6 +44,7 @@ enum bootmenu_key {
>  	KEY_NONE = 0,
>  	KEY_UP,
>  	KEY_DOWN,
> +	KEY_QUIT,
>  	KEY_SELECT,
>  };
> 
> @@ -153,11 +154,18 @@ static void bootmenu_loop(struct bootmenu_data *menu,
>  		break;
>  	case 1:
>  		/* Second char of ANSI '[' */
> -		if (c == '[') {
> +		switch (c) {
> +		case '\e':
> +			*esc = 0;
> +			*key = KEY_QUIT;
> +			break;

Thanks! Now I see what you mean. Basically 0x1b is escaped by escape
(0x1b) character.

> +		case '[':
>  			*esc = 2;
>  			*key = KEY_NONE;
> -		} else {
> +			break;
> +		default:
>  			*esc = 0;
> +			break;
>  		}
>  		break;
>  	case 2:
> @@ -217,6 +225,12 @@ static char *bootmenu_choice_entry(void *data)
>  				++menu->active;
>  			/* no menu key selected, regenerate menu */
>  			return NULL;
> +		case KEY_QUIT:
> +			/* Quit by choosing the last entry - U-Boot console */
> +			iter = menu->first;
> +			while (iter->next)
> +				iter = iter->next;
> +			return iter->key;
>  		case KEY_SELECT:
>  			iter = menu->first;
>  			for (i = 0; i < menu->active; ++i)
> 


More information about the U-Boot mailing list