Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
		
			
				
	
	
		
			160 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @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 - 2016, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| #  This program and the accompanying materials
 | |
| #  are licensed and made available under the terms and conditions of the BSD License
 | |
| #  which accompanies this distribution.  The full text of the license may be found at
 | |
| #  http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| #
 | |
| 
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| 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
 | |
| 
 | |
| import StringTable as st
 | |
| 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 != None:
 | |
|         EdkLogger.SetLevel(Options.debug_level + 1) 
 | |
|     else:
 | |
|         EdkLogger.SetLevel(EdkLogger.INFO)
 | |
|                   
 | |
|     if Options.bin_filename == 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 == 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 != None:
 | |
|         Force = True
 | |
| 
 | |
|     if (Args[0] != 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__':
 | |
|     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)
 | |
| 
 | |
|     
 |