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#
23import Common.LongFilePathOs as os
24import sys
25import encodings.ascii
26
27from optparse import OptionParser
28from Common import EdkLogger
29from Common.BuildToolError import *
30from Common.BuildVersion import gBUILD_VERSION
31
32import StringTable as st
33import GenVpd
34
35PROJECT_NAME       = st.LBL_BPDG_LONG_UNI
36VERSION            = (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#
47def 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#
90def 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#
133def 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
153if __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