1 ## @file 2 # Intel Binary Product Data Generation Tool (Intel BPDG). 3 # This tool provide a simple process for the creation of a binary file containing read-only 4 # configuration data for EDK II platforms that contain Dynamic and DynamicEx PCDs described 5 # in VPD sections. It also provide an option for specifying an alternate name for a mapping 6 # file of PCD layout for use during the build when the platform integrator selects to use 7 # automatic offset calculation. 8 # 9 # Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> 10 # 11 # This program and the accompanying materials 12 # are licensed and made available under the terms and conditions of the BSD License 13 # which accompanies this distribution. The full text of the license may be found at 14 # http://opensource.org/licenses/bsd-license.php 15 # 16 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 17 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 18 # 19 20 ## 21 # Import Modules 22 # 23 import Common.LongFilePathOs as os 24 import sys 25 import encodings.ascii 26 27 from optparse import OptionParser 28 from Common import EdkLogger 29 from Common.BuildToolError import * 30 from Common.BuildVersion import gBUILD_VERSION 31 32 import StringTable as st 33 import GenVpd 34 35 PROJECT_NAME = st.LBL_BPDG_LONG_UNI 36 VERSION = (st.LBL_BPDG_VERSION + " " + gBUILD_VERSION) 37 38 ## Tool entrance method 39 # 40 # This method mainly dispatch specific methods per the command line options. 41 # If no error found, return zero value so the caller of this tool can know 42 # if it's executed successfully or not. 43 # 44 # @retval 0 Tool was successful 45 # @retval 1 Tool failed 46 # 47 def main(): 48 global Options, Args 49 50 # Initialize log system 51 EdkLogger.Initialize() 52 Options, Args = MyOptionParser() 53 54 ReturnCode = 0 55 56 if Options.opt_verbose: 57 EdkLogger.SetLevel(EdkLogger.VERBOSE) 58 elif Options.opt_quiet: 59 EdkLogger.SetLevel(EdkLogger.QUIET) 60 elif Options.debug_level != None: 61 EdkLogger.SetLevel(Options.debug_level + 1) 62 else: 63 EdkLogger.SetLevel(EdkLogger.INFO) 64 65 if Options.bin_filename == None: 66 EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please use the -o option to specify the file name for the VPD binary file") 67 if Options.filename == None: 68 EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please use the -m option to specify the file name for the mapping file") 69 70 Force = False 71 if Options.opt_force != None: 72 Force = True 73 74 if (Args[0] != None) : 75 StartBpdg(Args[0], Options.filename, Options.bin_filename, Force) 76 else : 77 EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please specify the file which contain the VPD pcd info.", 78 None) 79 80 return ReturnCode 81 82 83 ## Parse command line options 84 # 85 # Using standard Python module optparse to parse command line option of this tool. 86 # 87 # @retval options A optparse.Values object containing the parsed options 88 # @retval args Target of BPDG command 89 # 90 def MyOptionParser(): 91 # 92 # Process command line firstly. 93 # 94 parser = OptionParser(version="%s - Version %s\n" % (PROJECT_NAME, VERSION), 95 description='', 96 prog='BPDG', 97 usage=st.LBL_BPDG_USAGE 98 ) 99 parser.add_option('-d', '--debug', action='store', type="int", dest='debug_level', 100 help=st.MSG_OPTION_DEBUG_LEVEL) 101 parser.add_option('-v', '--verbose', action='store_true', dest='opt_verbose', 102 help=st.MSG_OPTION_VERBOSE) 103 parser.add_option('-q', '--quiet', action='store_true', dest='opt_quiet', default=False, 104 help=st.MSG_OPTION_QUIET) 105 parser.add_option('-o', '--vpd-filename', action='store', dest='bin_filename', 106 help=st.MSG_OPTION_VPD_FILENAME) 107 parser.add_option('-m', '--map-filename', action='store', dest='filename', 108 help=st.MSG_OPTION_MAP_FILENAME) 109 parser.add_option('-f', '--force', action='store_true', dest='opt_force', 110 help=st.MSG_OPTION_FORCE) 111 112 (options, args) = parser.parse_args() 113 if len(args) == 0: 114 EdkLogger.info("Please specify the filename.txt file which contain the VPD pcd info!") 115 EdkLogger.info(parser.usage) 116 sys.exit(1) 117 return options, args 118 119 120 ## Start BPDG and call the main functions 121 # 122 # This method mainly focus on call GenVPD class member functions to complete 123 # BPDG's target. It will process VpdFile override, and provide the interface file 124 # information. 125 # 126 # @Param InputFileName The filename include the vpd type pcd information 127 # @param MapFileName The filename of map file that stores vpd type pcd information. 128 # This file will be generated by the BPDG tool after fix the offset 129 # and adjust the offset to make the pcd data aligned. 130 # @param VpdFileName The filename of Vpd file that hold vpd pcd information. 131 # @param Force Override the exist Vpdfile or not. 132 # 133 def StartBpdg(InputFileName, MapFileName, VpdFileName, Force): 134 if os.path.exists(VpdFileName) and not Force: 135 print "\nFile %s already exist, Overwrite(Yes/No)?[Y]: " % VpdFileName 136 choice = sys.stdin.readline() 137 if choice.strip().lower() not in ['y', 'yes', '']: 138 return 139 140 GenVPD = GenVpd.GenVPD (InputFileName, MapFileName, VpdFileName) 141 142 EdkLogger.info('%-24s = %s' % ("VPD input data file: ", InputFileName)) 143 EdkLogger.info('%-24s = %s' % ("VPD output map file: ", MapFileName)) 144 EdkLogger.info('%-24s = %s' % ("VPD output binary file: ", VpdFileName)) 145 146 GenVPD.ParserInputFile() 147 GenVPD.FormatFileLine() 148 GenVPD.FixVpdOffset() 149 GenVPD.GenerateVpdFile(MapFileName, VpdFileName) 150 151 EdkLogger.info("- Vpd pcd fixed done! -") 152 153 if __name__ == '__main__': 154 r = main() 155 ## 0-127 is a safe return range, and 1 is a standard default error 156 if r < 0 or r > 127: r = 1 157 sys.exit(r) 158 159 160