
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@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"
On Saturday 26 December 2020 19:44:23 Heinrich Schuchardt wrote: > Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár" pali@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; case 2:break;
@@ -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;
case KEY_SELECT: iter = menu->first; for (i = 0; i < menu->active; ++i)return iter->key;