efi: serial: Support arrow keys

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>
This commit is contained in:
Simon Glass 2021-12-29 11:57:37 -07:00 committed by Heinrich Schuchardt
parent 613cd0c467
commit 2996066110

View 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;