From patchwork Thu Sep 25 17:47:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 434 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758822569; bh=Q+xmlsN0LwRfeQYnRNnHf7dGWpQ0762vRsjU2Pqy8hg=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=is2NxEds39VWlN0hBG0VvxodvcRDuDTdWxMcgoFExepKuEOP1vw3rEvv4AfyNZAB6 0T2ppnIa7aRVHjJAI8YEGM9dnPknvze9QoCmn+/x6LI0+uG7Hrov/mqJ3i7warZySf VjEEAQUo5V+A1ZLycvR+TZLY6y6QNjTPg2QdwNGIdPljCw+xR6LbzZB7XIQjZi1YLh l4FPlwUvufjnxm3hw97mPZf7IDjIHZ9iJ0h2BHq0mksuHnCEImJfAwuicEjnz/40+c 0Nz9U+xg9u7mzZcHyPzntQ6K1Df3+tLwtXmTwj86+Xzt8OK/aDCSVVB8cLdwwWbHGo duR0qLlQiPBow== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id ED7CB67C2B for ; Thu, 25 Sep 2025 11:49:29 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id oGlAc0_Y5xtF for ; Thu, 25 Sep 2025 11:49:29 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758822568; bh=Q+xmlsN0LwRfeQYnRNnHf7dGWpQ0762vRsjU2Pqy8hg=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=G1jrsSjUH4beDeYgH3YfaaN3GjKMOM6hZUDTYWaptXkF0uUd/kwVcCZzJ8ogeeLsw NnublEY8A9V7hGl2p3yaThtlIYlNCIjyaCl8m7OEl1yhfr0R44CG9n/3Yhw3UZjQnP 099tixDY+lBxNph+NqADoEauwfpMbFL3Tu1kzQvvHeBmWm6HNbNvUur6Rf7gQNnx9v VRBlYn2aBKRqTWbhdlvtlQSqmn7u4opjib2RFNB7fpw064Jd5VljZrqH6TPypUZMhM +aAAiwUGhLcoJZD8BqUHu2dEyIyVm3fHNaymBHNgcsnrgLe0G0O4Wc7P3xb5ebgSaa sQWcc3tC+Oq2w== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 7221667D93 for ; Thu, 25 Sep 2025 11:49:28 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758822565; bh=BNIz930X24dTGl2vX+lN0jSjz65PE7d67G/tGl+KnvY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SzZ8elB6GHkjyX/IEG+P7gHkLDer7R7yVs1xrvKj9DkVvxb513O5exiiL3lYLVDsG yRdVvTVHYqsghwKtHxoH4WgYdeQ+ugifEFm0UANvtdswxO4/x6IDhZxpamrBmrY+7v Vot4DAnxSCJjeMyrinK+XUXvZctElE2BQDge0NnEgzDI0XnyTFYLHDeiUIz8g8AdZN sUOjqX2Y0tgfTFDbaLfV7vQBVdznkyVRhg9WyscMMIuv1IBLlbRR1jtT1w9T13yCV2 n953x8fToBKRAFX/yYz7OkOXqvNbTT13FOWQ3sHVx3Edn8VKpkVU+edlcp6vppqp1q r20CE9B3GhHWg== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 9714567D29; Thu, 25 Sep 2025 11:49:25 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id IBMo6e_Z7h60; Thu, 25 Sep 2025 11:49:25 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758822559; bh=bmYqkTsL5lnTnYtGSDHOJb5okNZ5R39yxlSyJluqjes=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CBj/bXljjTeQvjbDrH5n7cEqETD2V2QbSxpeCz1Z5hRJHi0U3T+sQtzAK9teAgWKI bir/2cn+7yAThlxpLBKrpb+7FCa1HvB4gmiJiITcSjrKcntO6IL1WDyLIrckw8i74T 029wJKtk3TA6tCKW3zOn1gHCHg0UGgAF/ZkieNlmOVPCCBuQYbTfEhRM/bZ4WsQjBB ePI3yr8LV1K+wbovHVWL5gLFWhahaRiU0sTyJYQTLuiAJbaMwlmN7IQHZYeN0XAd94 C6n1pDYIwtQ6asvGmzlY9aQjiFzh/wPta4fMI/FQ6sO8PqK8jvHlntuD4RihP95xlv 7XS+MbZfj/Swg== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id F0CB967CA2; Thu, 25 Sep 2025 11:49:18 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Thu, 25 Sep 2025 11:47:45 -0600 Message-ID: <20250925174753.3429102-22-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250925174753.3429102-1-sjg@u-boot.org> References: <20250925174753.3429102-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: YMOX5EOJUPGOAZZJOPJYUZW4MRRHWYQU X-Message-ID-Hash: YMOX5EOJUPGOAZZJOPJYUZW4MRRHWYQU X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 21/22] efi: Move key decoding into a shared file List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Create a new file in lib/efi to handle conversion of keys from EFI format to characters, so we can use it from multiple places. Update the serial_efi driver accordingly. Signed-off-by: Simon Glass --- drivers/serial/serial_efi.c | 15 +------------- include/efi.h | 32 +++++++++++++++++++++++++++++ lib/efi/Makefile | 1 + lib/efi/input.c | 40 +++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 lib/efi/input.c diff --git a/drivers/serial/serial_efi.c b/drivers/serial/serial_efi.c index b506bb18ffb..6645520e2ca 100644 --- a/drivers/serial/serial_efi.c +++ b/drivers/serial/serial_efi.c @@ -73,7 +73,6 @@ 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); @@ -81,19 +80,7 @@ static int serial_efi_getc(struct udevice *dev) return ret; priv->have_key = false; - ch = priv->key.unicode_char; - - /* - * Unicode char 8 (for backspace) is never returned. Instead we get a - * key scan code of 8. Handle this so that backspace works correctly - * in the U-Boot command line. - */ - 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); + ch = efi_decode_key(&priv->key); return ch; } diff --git a/include/efi.h b/include/efi.h index 52f3a014f1d..3d983bd69a4 100644 --- a/include/efi.h +++ b/include/efi.h @@ -24,6 +24,8 @@ #endif struct abuf; +struct efi_input_key; +struct efi_key_data; struct udevice; /* Type INTN in UEFI specification */ @@ -912,4 +914,34 @@ int efi_read_var(const u16 *name, const efi_guid_t *guid, u32 *attrp, uint16_t *efi_dp_str(struct efi_device_path *dp); +/** + * efi_decode_key() - Convert EFI input key to character + * + * Converts an EFI input key structure to a character code, handling + * both unicode characters and scan codes for special keys like arrow keys + * and backspace. + * + * Unicode characters are returned as-is, with the exception that carriage + * return ('\r') is converted to newline ('\n') for consistency with U-Boot + * conventions. + * + * @key: Pointer to EFI input key structure + * Return: Character code (0-255), or 0 if no valid character + */ +int efi_decode_key(struct efi_input_key *key); + +/** + * efi_decode_key_ex() - Convert EFI extended input key to character + * + * Converts an EFI extended key data structure to a character code by + * extracting the basic input key and calling efi_decode_key(). + * + * This function provides a convenient wrapper for handling EFI Simple Text + * Input EX Protocol key data, which includes modifier keys (currently ignored) + * + * @key_data: Pointer to EFI extended key data structure + * Return: Character code (0-255), or 0 if no valid character + */ +int efi_decode_key_ex(struct efi_key_data *key_data); + #endif /* _LINUX_EFI_H */ diff --git a/lib/efi/Makefile b/lib/efi/Makefile index 842067dcab3..c2e56df7144 100644 --- a/lib/efi/Makefile +++ b/lib/efi/Makefile @@ -6,6 +6,7 @@ obj-y += basename.o obj-y += device_path.o obj-y += helper.o +obj-y += input.o obj-y += load_options.o obj-y += memory.o obj-y += run.o diff --git a/lib/efi/input.c b/lib/efi/input.c new file mode 100644 index 00000000000..4d6b81bf183 --- /dev/null +++ b/lib/efi/input.c @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * EFI input key decoding functions + * + * Copyright (c) 2015 Google, Inc + * Written by Simon Glass + */ + +#define LOG_CATEGORY LOGC_EFI + +#include +#include +#include + +int efi_decode_key(struct efi_input_key *key) +{ + static const char conv_scan[] = {0, 'p', 'n', 'f', 'b', 'a', 'e', 0, 8}; + int ch; + + ch = key->unicode_char; + + /* + * Unicode char 8 (for backspace) is never returned. Instead we get a + * key scan code of 8. Handle this so that backspace works correctly + * in the U-Boot command line. + */ + if (!ch && key->scan_code < sizeof(conv_scan)) { + ch = conv_scan[key->scan_code]; + if (ch >= 'a') + ch -= 'a' - 1; + } + log_debug(" [%x %x %x] ", ch, key->unicode_char, key->scan_code); + + return ch; +} + +int efi_decode_key_ex(struct efi_key_data *key_data) +{ + return efi_decode_key(&key_data->key); +}