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;
+               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)

Reply via email to