195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
273bbca04SBob Moore /******************************************************************************
373bbca04SBob Moore *
473bbca04SBob Moore * Module Name: uthex -- Hex/ASCII support functions
573bbca04SBob Moore *
6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp.
773bbca04SBob Moore *
895857638SErik Schmauss *****************************************************************************/
973bbca04SBob Moore
1073bbca04SBob Moore #include <acpi/acpi.h>
1173bbca04SBob Moore #include "accommon.h"
1273bbca04SBob Moore
1373bbca04SBob Moore #define _COMPONENT ACPI_COMPILER
1473bbca04SBob Moore ACPI_MODULE_NAME("uthex")
1573bbca04SBob Moore
1673bbca04SBob Moore /* Hex to ASCII conversion table */
17c118abc5SLABBE Corentin static const char acpi_gbl_hex_to_ascii[] = {
1873bbca04SBob Moore '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
1973bbca04SBob Moore 'E', 'F'
2073bbca04SBob Moore };
2173bbca04SBob Moore
2273bbca04SBob Moore /*******************************************************************************
2373bbca04SBob Moore *
2473bbca04SBob Moore * FUNCTION: acpi_ut_hex_to_ascii_char
2573bbca04SBob Moore *
2673bbca04SBob Moore * PARAMETERS: integer - Contains the hex digit
2773bbca04SBob Moore * position - bit position of the digit within the
2873bbca04SBob Moore * integer (multiple of 4)
2973bbca04SBob Moore *
3073bbca04SBob Moore * RETURN: The converted Ascii character
3173bbca04SBob Moore *
3273bbca04SBob Moore * DESCRIPTION: Convert a hex digit to an Ascii character
3373bbca04SBob Moore *
3473bbca04SBob Moore ******************************************************************************/
3573bbca04SBob Moore
acpi_ut_hex_to_ascii_char(u64 integer,u32 position)3673bbca04SBob Moore char acpi_ut_hex_to_ascii_char(u64 integer, u32 position)
3773bbca04SBob Moore {
3865082bfcSLv Zheng u64 index;
3973bbca04SBob Moore
4065082bfcSLv Zheng acpi_ut_short_shift_right(integer, position, &index);
4165082bfcSLv Zheng return (acpi_gbl_hex_to_ascii[index & 0xF]);
4273bbca04SBob Moore }
4373bbca04SBob Moore
4473bbca04SBob Moore /*******************************************************************************
4573bbca04SBob Moore *
465ebd2eaaSBob Moore * FUNCTION: acpi_ut_ascii_to_hex_byte
475ebd2eaaSBob Moore *
485ebd2eaaSBob Moore * PARAMETERS: two_ascii_chars - Pointer to two ASCII characters
495ebd2eaaSBob Moore * return_byte - Where converted byte is returned
505ebd2eaaSBob Moore *
515ebd2eaaSBob Moore * RETURN: Status and converted hex byte
525ebd2eaaSBob Moore *
535ebd2eaaSBob Moore * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters
545ebd2eaaSBob Moore * to a single converted byte value.
555ebd2eaaSBob Moore *
565ebd2eaaSBob Moore ******************************************************************************/
575ebd2eaaSBob Moore
acpi_ut_ascii_to_hex_byte(char * two_ascii_chars,u8 * return_byte)585ebd2eaaSBob Moore acpi_status acpi_ut_ascii_to_hex_byte(char *two_ascii_chars, u8 *return_byte)
595ebd2eaaSBob Moore {
605ebd2eaaSBob Moore
615ebd2eaaSBob Moore /* Both ASCII characters must be valid hex digits */
625ebd2eaaSBob Moore
63eacce4b6SBob Moore if (!isxdigit((int)two_ascii_chars[0]) ||
64eacce4b6SBob Moore !isxdigit((int)two_ascii_chars[1])) {
655ebd2eaaSBob Moore return (AE_BAD_HEX_CONSTANT);
665ebd2eaaSBob Moore }
675ebd2eaaSBob Moore
685ebd2eaaSBob Moore *return_byte =
695ebd2eaaSBob Moore acpi_ut_ascii_char_to_hex(two_ascii_chars[1]) |
705ebd2eaaSBob Moore (acpi_ut_ascii_char_to_hex(two_ascii_chars[0]) << 4);
715ebd2eaaSBob Moore
725ebd2eaaSBob Moore return (AE_OK);
735ebd2eaaSBob Moore }
745ebd2eaaSBob Moore
755ebd2eaaSBob Moore /*******************************************************************************
765ebd2eaaSBob Moore *
7704f8e384SBob Moore * FUNCTION: acpi_ut_ascii_char_to_hex
7873bbca04SBob Moore *
795ebd2eaaSBob Moore * PARAMETERS: hex_char - Hex character in Ascii. Must be:
805ebd2eaaSBob Moore * 0-9 or A-F or a-f
8173bbca04SBob Moore *
8273bbca04SBob Moore * RETURN: The binary value of the ascii/hex character
8373bbca04SBob Moore *
8473bbca04SBob Moore * DESCRIPTION: Perform ascii-to-hex translation
8573bbca04SBob Moore *
8673bbca04SBob Moore ******************************************************************************/
8773bbca04SBob Moore
acpi_ut_ascii_char_to_hex(int hex_char)8873bbca04SBob Moore u8 acpi_ut_ascii_char_to_hex(int hex_char)
8973bbca04SBob Moore {
9073bbca04SBob Moore
915ebd2eaaSBob Moore /* Values 0-9 */
925ebd2eaaSBob Moore
935ebd2eaaSBob Moore if (hex_char <= '9') {
945ebd2eaaSBob Moore return ((u8)(hex_char - '0'));
9573bbca04SBob Moore }
9673bbca04SBob Moore
975ebd2eaaSBob Moore /* Upper case A-F */
985ebd2eaaSBob Moore
995ebd2eaaSBob Moore if (hex_char <= 'F') {
10073bbca04SBob Moore return ((u8)(hex_char - 0x37));
10173bbca04SBob Moore }
10273bbca04SBob Moore
1035ebd2eaaSBob Moore /* Lower case a-f */
1045ebd2eaaSBob Moore
10573bbca04SBob Moore return ((u8)(hex_char - 0x57));
10673bbca04SBob Moore }
107