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" <p...@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" > > > > <p...@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" > > > > > > <p...@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) >