## @file | |
# Intel Binary Product Data Generation Tool (Intel BPDG). | |
# This tool provide a simple process for the creation of a binary file containing read-only | |
# configuration data for EDK II platforms that contain Dynamic and DynamicEx PCDs described | |
# in VPD sections. It also provide an option for specifying an alternate name for a mapping | |
# file of PCD layout for use during the build when the platform integrator selects to use | |
# automatic offset calculation. | |
# | |
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR> | |
# | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
# | |
## | |
# Import Modules | |
# | |
from __future__ import print_function | |
from __future__ import absolute_import | |
import Common.LongFilePathOs as os | |
import sys | |
import encodings.ascii | |
from optparse import OptionParser | |
from Common import EdkLogger | |
from Common.BuildToolError import * | |
from Common.BuildVersion import gBUILD_VERSION | |
from . import StringTable as st | |
from . import GenVpd | |
PROJECT_NAME = st.LBL_BPDG_LONG_UNI | |
VERSION = (st.LBL_BPDG_VERSION + " Build " + gBUILD_VERSION) | |
## Tool entrance method | |
# | |
# This method mainly dispatch specific methods per the command line options. | |
# If no error found, return zero value so the caller of this tool can know | |
# if it's executed successfully or not. | |
# | |
# @retval 0 Tool was successful | |
# @retval 1 Tool failed | |
# | |
def main(): | |
global Options, Args | |
# Initialize log system | |
EdkLogger.Initialize() | |
Options, Args = MyOptionParser() | |
ReturnCode = 0 | |
if Options.opt_verbose: | |
EdkLogger.SetLevel(EdkLogger.VERBOSE) | |
elif Options.opt_quiet: | |
EdkLogger.SetLevel(EdkLogger.QUIET) | |
elif Options.debug_level is not None: | |
EdkLogger.SetLevel(Options.debug_level + 1) | |
else: | |
EdkLogger.SetLevel(EdkLogger.INFO) | |
if Options.bin_filename is None: | |
EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please use the -o option to specify the file name for the VPD binary file") | |
if Options.filename is None: | |
EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please use the -m option to specify the file name for the mapping file") | |
Force = False | |
if Options.opt_force is not None: | |
Force = True | |
if (Args[0] is not None) : | |
StartBpdg(Args[0], Options.filename, Options.bin_filename, Force) | |
else : | |
EdkLogger.error("BPDG", ATTRIBUTE_NOT_AVAILABLE, "Please specify the file which contain the VPD pcd info.", | |
None) | |
return ReturnCode | |
## Parse command line options | |
# | |
# Using standard Python module optparse to parse command line option of this tool. | |
# | |
# @retval options A optparse.Values object containing the parsed options | |
# @retval args Target of BPDG command | |
# | |
def MyOptionParser(): | |
# | |
# Process command line firstly. | |
# | |
parser = OptionParser(version="%s - Version %s" % (PROJECT_NAME, VERSION), | |
description='', | |
prog='BPDG', | |
usage=st.LBL_BPDG_USAGE | |
) | |
parser.add_option('-d', '--debug', action='store', type="int", dest='debug_level', | |
help=st.MSG_OPTION_DEBUG_LEVEL) | |
parser.add_option('-v', '--verbose', action='store_true', dest='opt_verbose', | |
help=st.MSG_OPTION_VERBOSE) | |
parser.add_option('-q', '--quiet', action='store_true', dest='opt_quiet', default=False, | |
help=st.MSG_OPTION_QUIET) | |
parser.add_option('-o', '--vpd-filename', action='store', dest='bin_filename', | |
help=st.MSG_OPTION_VPD_FILENAME) | |
parser.add_option('-m', '--map-filename', action='store', dest='filename', | |
help=st.MSG_OPTION_MAP_FILENAME) | |
parser.add_option('-f', '--force', action='store_true', dest='opt_force', | |
help=st.MSG_OPTION_FORCE) | |
(options, args) = parser.parse_args() | |
if len(args) == 0: | |
EdkLogger.info("Please specify the filename.txt file which contain the VPD pcd info!") | |
EdkLogger.info(parser.usage) | |
sys.exit(1) | |
return options, args | |
## Start BPDG and call the main functions | |
# | |
# This method mainly focus on call GenVPD class member functions to complete | |
# BPDG's target. It will process VpdFile override, and provide the interface file | |
# information. | |
# | |
# @Param InputFileName The filename include the vpd type pcd information | |
# @param MapFileName The filename of map file that stores vpd type pcd information. | |
# This file will be generated by the BPDG tool after fix the offset | |
# and adjust the offset to make the pcd data aligned. | |
# @param VpdFileName The filename of Vpd file that hold vpd pcd information. | |
# @param Force Override the exist Vpdfile or not. | |
# | |
def StartBpdg(InputFileName, MapFileName, VpdFileName, Force): | |
if os.path.exists(VpdFileName) and not Force: | |
print("\nFile %s already exist, Overwrite(Yes/No)?[Y]: " % VpdFileName) | |
choice = sys.stdin.readline() | |
if choice.strip().lower() not in ['y', 'yes', '']: | |
return | |
GenVPD = GenVpd.GenVPD (InputFileName, MapFileName, VpdFileName) | |
EdkLogger.info('%-24s = %s' % ("VPD input data file: ", InputFileName)) | |
EdkLogger.info('%-24s = %s' % ("VPD output map file: ", MapFileName)) | |
EdkLogger.info('%-24s = %s' % ("VPD output binary file: ", VpdFileName)) | |
GenVPD.ParserInputFile() | |
GenVPD.FormatFileLine() | |
GenVPD.FixVpdOffset() | |
GenVPD.GenerateVpdFile(MapFileName, VpdFileName) | |
EdkLogger.info("- Vpd pcd fixed done! -") | |
if __name__ == '__main__': | |
try: | |
r = main() | |
except FatalError as e: | |
r = e | |
## 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) | |