## @file # # Convert an AML file to a .hex file containing the AML bytecode stored in a # C array. # By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.hex". # "Tables\Dsdt.hex" will contain a C array named "dsdt_aml_code" that contains # the AML bytecode. # # Copyright (c) 2020, ARM Limited. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # import argparse import Common.EdkLogger as EdkLogger from Common.BuildToolError import * import sys import os ## Parse the command line arguments. # # @retval A argparse.NameSpace instance, containing parsed values. # def ParseArgs(): # Initialize the parser. Parser = argparse.ArgumentParser( description="Convert an AML file to a .hex file containing the AML " + \ "bytecode stored in a C array. By default, " + \ "\"Tables\\Dsdt.aml\" will generate" + \ "\"Tables\\Dsdt.hex\". \"Tables\\Dsdt.hex\" will " + \ "contain a C array named \"dsdt_aml_code\" that " + \ "contains the AML bytecode." ) # Define the possible arguments. Parser.add_argument( dest="InputFile", help="Path to an input AML file to generate a .hex file from." ) Parser.add_argument( "-o", "--out-dir", dest="OutDir", help="Output directory where the .hex file will be generated. " + \ "Default is the input file's directory." ) # Parse the input arguments. Args = Parser.parse_args() SplitInputName = "" if not os.path.exists(Args.InputFile): EdkLogger.error(__file__, FILE_OPEN_FAILURE, ExtraData=Args.InputFile) return None else: with open(Args.InputFile, "rb") as fIn: Signature = str(fIn.read(4)) if ("DSDT" not in Signature) and ("SSDT" not in Signature): EdkLogger.info("Invalid file type. " + \ "File does not have a valid " + \ "DSDT or SSDT signature: %s" % Args.InputFile) return None # Get the basename of the input file. SplitInputName = os.path.splitext(Args.InputFile) BaseName = os.path.basename(SplitInputName[0]) # If no output directory is specified, output to the input directory. if not Args.OutDir: Args.OutputFile = os.path.join( os.path.dirname(Args.InputFile), BaseName + ".hex" ) else: if not os.path.exists(Args.OutDir): os.mkdir(Args.OutDir) Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".hex") Args.BaseName = BaseName return Args ## Convert an AML file to a .hex file containing the AML bytecode stored # in a C array. # # @param InputFile Path to the input AML file. # @param OutputFile Path to the output .hex file to generate. # @param BaseName Base name of the input file. # This is also the name of the generated .hex file. # def AmlToHex(InputFile, OutputFile, BaseName): MacroName = "__{}_HEX__".format(BaseName.upper()) ArrayName = BaseName.lower() + "_aml_code" with open(InputFile, "rb") as fIn, open(OutputFile, "w") as fOut: # Write header. fOut.write("// This file has been generated from:\n" + \ "// \tPython script: " + \ os.path.abspath(__file__) + "\n" + \ "// \tInput AML file: " + \ os.path.abspath(InputFile) + "\n\n" + \ "#ifndef {}\n".format(MacroName) + \ "#define {}\n\n".format(MacroName) ) # Write the array and its content. fOut.write("unsigned char {}[] = {{\n ".format(ArrayName)) cnt = 0 byte = fIn.read(1) while len(byte) != 0: fOut.write("0x{0:02X}, ".format(ord(byte))) cnt += 1 if (cnt % 8) == 0: fOut.write("\n ") byte = fIn.read(1) fOut.write("\n};\n") # Write footer. fOut.write("#endif // {}\n".format(MacroName)) ## Main method # # This method: # 1- Initialize an EdkLogger instance. # 2- Parses the input arguments. # 3- Converts an AML file to a .hex file containing the AML bytecode stored # in a C array. # # @retval 0 Success. # @retval 1 Error. # def Main(): # Initialize an EdkLogger instance. EdkLogger.Initialize() try: # Parse the input arguments. CommandArguments = ParseArgs() if not CommandArguments: return 1 # Convert an AML file to a .hex file containing the AML bytecode stored # in a C array. AmlToHex(CommandArguments.InputFile, CommandArguments.OutputFile, CommandArguments.BaseName) except Exception as e: print(e) return 1 return 0 if __name__ == '__main__': r = Main() # 0-127 is a safe return range, and 1 is a standard default error if r < 0 or r > 127: r = 1 sys.exit(r)