]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi: serial: Support arrow keys
authorSimon Glass <sjg@chromium.org>
Wed, 29 Dec 2021 18:57:37 +0000 (11:57 -0700)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Fri, 31 Dec 2021 05:45:01 +0000 (06:45 +0100)
At present only the backspace key is supported in U-Boot, when running as
an EFI app. Add support for arrows, home and end as well, to make the CLI
more friendly.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
drivers/serial/serial_efi.c

index 33ddbd6080cf325ad70ccc3dcb4a12d199f07ca0..0067576389d16900af83cdbe6328bfb35fafdf09 100644 (file)
@@ -24,6 +24,9 @@ struct serial_efi_priv {
        bool have_key;
 };
 
+/* Convert a lower-case character to its ctrl-char equivalent */
+#define CTL_CH(c)              ((c) - 'a' + 1)
+
 int serial_efi_setbrg(struct udevice *dev, int baudrate)
 {
        return 0;
@@ -49,6 +52,7 @@ static int serial_efi_get_key(struct serial_efi_priv *priv)
 static int serial_efi_getc(struct udevice *dev)
 {
        struct serial_efi_priv *priv = dev_get_priv(dev);
+       char conv_scan[10] = {0, 'p', 'n', 'f', 'b', 'a', 'e', 0, 8};
        int ret, ch;
 
        ret = serial_efi_get_key(priv);
@@ -63,8 +67,11 @@ static int serial_efi_getc(struct udevice *dev)
         * key scan code of 8. Handle this so that backspace works correctly
         * in the U-Boot command line.
         */
-       if (!ch && priv->key.scan_code == 8)
-               ch = 8;
+       if (!ch && priv->key.scan_code < sizeof(conv_scan)) {
+               ch = conv_scan[priv->key.scan_code];
+               if (ch >= 'a')
+                       ch -= 'a' - 1;
+       }
        debug(" [%x %x %x] ", ch, priv->key.unicode_char, priv->key.scan_code);
 
        return ch;