Home | History | Annotate | Download | only in BPDG
      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