1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 /****************************************************************************** 3 * 4 * Module Name: uthex -- Hex/ASCII support functions 5 * 6 * Copyright (C) 2000 - 2019, Intel Corp. 7 * 8 *****************************************************************************/ 9 10 #include <acpi/acpi.h> 11 #include "accommon.h" 12 13 #define _COMPONENT ACPI_COMPILER 14 ACPI_MODULE_NAME("uthex") 15 16 /* Hex to ASCII conversion table */ 17 static const char acpi_gbl_hex_to_ascii[] = { 18 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 19 'E', 'F' 20 }; 21 22 /******************************************************************************* 23 * 24 * FUNCTION: acpi_ut_hex_to_ascii_char 25 * 26 * PARAMETERS: integer - Contains the hex digit 27 * position - bit position of the digit within the 28 * integer (multiple of 4) 29 * 30 * RETURN: The converted Ascii character 31 * 32 * DESCRIPTION: Convert a hex digit to an Ascii character 33 * 34 ******************************************************************************/ 35 36 char acpi_ut_hex_to_ascii_char(u64 integer, u32 position) 37 { 38 u64 index; 39 40 acpi_ut_short_shift_right(integer, position, &index); 41 return (acpi_gbl_hex_to_ascii[index & 0xF]); 42 } 43 44 /******************************************************************************* 45 * 46 * FUNCTION: acpi_ut_ascii_to_hex_byte 47 * 48 * PARAMETERS: two_ascii_chars - Pointer to two ASCII characters 49 * return_byte - Where converted byte is returned 50 * 51 * RETURN: Status and converted hex byte 52 * 53 * DESCRIPTION: Perform ascii-to-hex translation, exactly two ASCII characters 54 * to a single converted byte value. 55 * 56 ******************************************************************************/ 57 58 acpi_status acpi_ut_ascii_to_hex_byte(char *two_ascii_chars, u8 *return_byte) 59 { 60 61 /* Both ASCII characters must be valid hex digits */ 62 63 if (!isxdigit((int)two_ascii_chars[0]) || 64 !isxdigit((int)two_ascii_chars[1])) { 65 return (AE_BAD_HEX_CONSTANT); 66 } 67 68 *return_byte = 69 acpi_ut_ascii_char_to_hex(two_ascii_chars[1]) | 70 (acpi_ut_ascii_char_to_hex(two_ascii_chars[0]) << 4); 71 72 return (AE_OK); 73 } 74 75 /******************************************************************************* 76 * 77 * FUNCTION: acpi_ut_ascii_char_to_hex 78 * 79 * PARAMETERS: hex_char - Hex character in Ascii. Must be: 80 * 0-9 or A-F or a-f 81 * 82 * RETURN: The binary value of the ascii/hex character 83 * 84 * DESCRIPTION: Perform ascii-to-hex translation 85 * 86 ******************************************************************************/ 87 88 u8 acpi_ut_ascii_char_to_hex(int hex_char) 89 { 90 91 /* Values 0-9 */ 92 93 if (hex_char <= '9') { 94 return ((u8)(hex_char - '0')); 95 } 96 97 /* Upper case A-F */ 98 99 if (hex_char <= 'F') { 100 return ((u8)(hex_char - 0x37)); 101 } 102 103 /* Lower case a-f */ 104 105 return ((u8)(hex_char - 0x57)); 106 }