On 10/17/22 22:29, Simon Glass wrote:
Move this code into a separate function so that it can be used in the new
VBE menu.

Signed-off-by: Simon Glass <s...@chromium.org>
---

  common/menu.c  | 48 ++++++++++++++++++++++++++++++------------------
  include/menu.h | 10 ++++++++++
  2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/common/menu.c b/common/menu.c
index c2e3ec592e3..4606cb7d1b1 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -483,26 +483,11 @@ enum bootmenu_key bootmenu_autoboot_loop(struct 
bootmenu_data *menu,
        return key;
  }

-enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
-                               struct cli_ch_state *cch)
+enum bootmenu_key bootmenu_conv_key(int ichar)
  {

Please, extract a common library function from
efi_cin_read_key_stroke_ex(). We should avoid code duplication.

Best regards

Heinrich

-       enum bootmenu_key key = BKEY_NONE;
-       int c;
-
-       c = cli_ch_process(cch, 0);
-       if (!c) {
-               while (!c && !tstc()) {
-                       WATCHDOG_RESET();
-                       mdelay(10);
-                       c = cli_ch_process(cch, -ETIMEDOUT);
-               }
-               if (!c) {
-                       c = getchar();
-                       c = cli_ch_process(cch, c);
-               }
-       }
+       enum bootmenu_key key;

-       switch (c) {
+       switch (ichar) {
        case '\n':
                /* enter key was pressed */
                key = BKEY_SELECT;
@@ -527,7 +512,34 @@ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
        case ' ':
                key = BKEY_SPACE;
                break;
+       default:
+               key = BKEY_NONE;
+               break;
+       }
+
+       return key;
+}
+
+enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
+                               struct cli_ch_state *cch)
+{
+       enum bootmenu_key key;
+       int c;
+
+       c = cli_ch_process(cch, 0);
+       if (!c) {
+               while (!c && !tstc()) {
+                       WATCHDOG_RESET();
+                       mdelay(10);
+                       c = cli_ch_process(cch, -ETIMEDOUT);
+               }
+               if (!c) {
+                       c = getchar();
+                       c = cli_ch_process(cch, c);
+               }
        }

+       key = bootmenu_conv_key(c);
+
        return key;
  }
diff --git a/include/menu.h b/include/menu.h
index 3996075a337..1e88141d6bf 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -53,6 +53,8 @@ enum bootmenu_key {
        BKEY_PLUS,
        BKEY_MINUS,
        BKEY_SPACE,
+
+       BKEY_COUNT,
  };

  /**
@@ -101,4 +103,12 @@ enum bootmenu_key bootmenu_autoboot_loop(struct 
bootmenu_data *menu,
  enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
                                struct cli_ch_state *cch);

+/**
+ * bootmenu_conv_key() - Convert a U-Boot keypress into a menu key
+ *
+ * @ichar: Keypress to convert (ASCII, including control characters)
+ * Returns: Menu key that corresponds to @ichar, or BKEY_NONE if none
+ */
+enum bootmenu_key bootmenu_conv_key(int ichar);
+
  #endif /* __MENU_H__ */

Reply via email to