2016-08-05 21:48:20 +02:00
|
|
|
#Name
|
|
|
|
**GenCfgOpt.py** The python script that generates UPD text (**.txt**) files for
|
|
|
|
the compiler, header files for the UPD regions, and generates a Boot Settings
|
|
|
|
File (**BSF**), all from an EDK II Platform Description (**DSC**) file.
|
|
|
|
|
|
|
|
#Synopsis
|
|
|
|
```
|
|
|
|
GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [TxtOutFile] [-D Macros]
|
|
|
|
GenCfgOpt HEADER PlatformDscFile BuildFvDir [InputHFile] [-D Macros]
|
|
|
|
GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]
|
|
|
|
```
|
|
|
|
|
|
|
|
#Description
|
|
|
|
**GenCfgOpt.py** is a script that generates configuration options from an
|
|
|
|
**EDK II Platform Description (DSC)** file. It has three functions.
|
|
|
|
|
|
|
|
1. It produces a **.txt** file that is used by the compiler that summarizes
|
|
|
|
the UPD section in the DSC file.
|
|
|
|
2. It generates header files for the UPD regions.
|
|
|
|
3. It generates a **Boot Settings File (BSF)** that can be used by the
|
|
|
|
**Binary Configuration Tool (BCT)** to provide a graphical user
|
|
|
|
interface for manipulating settings in the UPD regions.
|
|
|
|
|
|
|
|
The **GenCfgOpt.py** script generates important files that are vital parts of
|
|
|
|
your build process. The **UPDTXT** and **HEADER** use cases must be done before
|
|
|
|
the **'build'** command; the **GENBSF** use case may be done at any time.
|
|
|
|
|
|
|
|
The following sections explain the three use cases.
|
|
|
|
|
|
|
|
## 1. GenCfgOpt.py UPDTXT
|
|
|
|
The **UPDTXT** option creates a text file with all the UPD entries, offsets,
|
|
|
|
size in bytes, and values. **GenCfgOpt** reads this information from the
|
|
|
|
**[PcdsDynamicVpd.Upd]** section of the project's DSC file. The DSC file allows
|
|
|
|
you to specify offsets and sizes for each entry, opening up the possibility of
|
|
|
|
introducing gaps between entries. **GenCfgOpt** fills in these gaps with UPD
|
|
|
|
entries that have the generic names **UnusedUpdSpaceN** where N begins with 0
|
|
|
|
and increments. The command signature for **UPDTXT** is:
|
|
|
|
|
|
|
|
```
|
|
|
|
GenCfgOpt UPDTXT PlatformDscFile BuildFvDir [TxtOutFile] [-D Macros]
|
|
|
|
```
|
|
|
|
|
|
|
|
**PlatformDscFile** must be the location of the DSC file for the platform you're
|
|
|
|
building. **BuildFvDir** is the location where the binary will be stored. The
|
|
|
|
optional **TxtOutFile** is a name and location for the output of **GenCfgOpt**.
|
|
|
|
The default name and location is the ```<UPD_TOOL_GUID>.txt``` in the directory
|
|
|
|
specified by **BuildFvDir**. The macro ```UPD_TOOL_GUID``` must be defined in
|
|
|
|
the DSC file or in the optional Macros arguments. Each optional macro argument
|
|
|
|
must follow the form ```?D <MACRO_NAME>=<VALUE>```.
|
|
|
|
|
|
|
|
**GenCfgOpt** checks to see if the UPD txt file has already been created and
|
|
|
|
will only re-create it if the DSC was modified after it was created.
|
|
|
|
|
|
|
|
## 2. GenCfgOpt.py HEADER
|
|
|
|
The **HEADER** option creates header files in the build folder. Both header
|
|
|
|
files define the ```_UPD_DATA_REGION``` data structures in FspUpd.h, FsptUpd.h,
|
|
|
|
FspmUpd.h and FspsUpd.h. In these header files any undefined elements of
|
|
|
|
structures will be added as **ReservedUpdSpaceN** beginning with N=0. The
|
|
|
|
command signature for **HEADER** is
|
|
|
|
|
|
|
|
```GenCfgOpt HEADER PlatformDscFile BuildFvDir [InputHFile] [-D Macros]```
|
|
|
|
|
|
|
|
**PlatformDscFile** and **BuildFvDir** are described in the previous section.
|
|
|
|
The optional **InputHFile** is a header file that may contain data definitions
|
|
|
|
that are used by variables in the UPD regions. This header file must contain
|
|
|
|
the special keywords ```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_BEGIN``` and
|
|
|
|
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_END``` in comments. Everything between
|
|
|
|
these two keywords will be included in the generated header file.
|
|
|
|
The mechanism to specify whether a variable appears as **ReservedUpdSpaceN** in
|
|
|
|
the FspUpd.h header file is in special commands that appear in the comments of
|
|
|
|
the DSC file. The special commands begin with ```!HDR```, for header. The
|
|
|
|
following table summarizes the two command options.
|
|
|
|
|
|
|
|
### HEADER
|
|
|
|
Use the **HEADER** command to hide specific variables in the public header file.
|
|
|
|
In your project DSC file, use ```!HDR HEADER:{OFF}``` at the beginning of the
|
|
|
|
section you wish to hide and ```!HDR HEADER:{ON}``` at the end.
|
|
|
|
|
|
|
|
### STRUCT
|
|
|
|
The **STRUCT** command allows you to specify a specific data type for a
|
|
|
|
variable. You can specify a pointer to a data struct, for example. You define
|
|
|
|
the data structure in the **InputHFile** between
|
|
|
|
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_BEGIN``` and
|
|
|
|
```!EXPORT EXTERNAL_BOOTLOADER_STRUCT_END```.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!HDR STRUCT:{MY_DATA_STRUCT*}```
|
|
|
|
|
|
|
|
You then define ```MY_DATA_STRUCT``` in **InputHFile**.
|
|
|
|
|
|
|
|
### EMBED
|
|
|
|
The **EMBED** command allows you to put one or more UPD data into a specify data
|
|
|
|
structure. You can utilize it as a group of UPD for example. You must specify a
|
|
|
|
start and an end for the specify data structure.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```
|
|
|
|
!HDR EMBED:{MY_DATA_STRUCT:MyDataStructure:START}
|
|
|
|
gTokenSpaceGuid.Upd1 | 0x0020 | 0x01 | 0x00
|
|
|
|
gTokenSpaceGuid.Upd2 | 0x0021 | 0x01 | 0x00
|
|
|
|
!HDR EMBED:{MY_DATA_STRUCT:MyDataStructure:END}
|
|
|
|
gTokenSpaceGuid.UpdN | 0x0022 | 0x01 | 0x00
|
|
|
|
```
|
|
|
|
|
|
|
|
#####Result:
|
|
|
|
```
|
|
|
|
typedef struct {
|
|
|
|
/** Offset 0x0020
|
|
|
|
**/
|
|
|
|
UINT8 Upd1;
|
|
|
|
/** Offset 0x0021
|
|
|
|
**/
|
|
|
|
UINT8 Upd2;
|
|
|
|
/** Offset 0x0022
|
|
|
|
**/
|
|
|
|
UINT8 UpdN;
|
|
|
|
} MY_DATA_STRUCT;
|
|
|
|
|
|
|
|
typedef struct _UPD_DATA_REGION {
|
|
|
|
...
|
|
|
|
/** Offset 0x0020
|
|
|
|
**/
|
|
|
|
MY_DATA_STRUCT MyDataStruct;
|
|
|
|
...
|
|
|
|
} UPD_DATA_REGION;
|
|
|
|
```
|
|
|
|
|
|
|
|
## 3. GenCfgOpt .py GENBSF
|
|
|
|
The **GENBSF** option generates a BSF from the UPD entries in a package's DSC
|
|
|
|
file. It does this by parsing special commands found in the comments of the DSC
|
|
|
|
file. They roughly match the keywords that define the different sections of the
|
|
|
|
BSF.
|
|
|
|
|
|
|
|
The command signature for **GENBSF** is
|
|
|
|
|
|
|
|
```GenCfgOpt GENBSF PlatformDscFile BuildFvDir BsfOutFile [-D Macros]```
|
|
|
|
|
|
|
|
In this case, the **BsfOutFile** parameter is required; it should be the
|
|
|
|
relative path to where the BSF should be stored.
|
|
|
|
|
|
|
|
Every BSF command in the DSC file begins with **!BSF** or **@Bsf**. The
|
|
|
|
following table summarizes the options that come after **!BSF** or **@Bsf**:
|
|
|
|
|
|
|
|
# BSF Commands Description
|
|
|
|
###PAGES
|
|
|
|
**PAGES** maps abbreviations to friendly-text descriptions of the pages in a BSF.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF PAGES:{PG1:?Page 1?, PG2:?Page 2?}``` or
|
|
|
|
|
|
|
|
```@Bsf PAGES:{PG1:?Page 1?, PG2:?Page 2?}```
|
|
|
|
|
|
|
|
###PAGE
|
|
|
|
This marks the beginning of a page. Use the abbreviation specified in **PAGES**
|
|
|
|
command.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF PAGE:{PG1}``` or
|
|
|
|
|
|
|
|
```@Bsf PAGE:{PG1}```
|
|
|
|
|
|
|
|
All the entries that come after this command are assumed to be on that page,
|
|
|
|
until the next **PAGE** command
|
|
|
|
|
|
|
|
###FIND
|
|
|
|
FIND maps to the BSF **Find** command. It will be placed in the **StructDef**
|
|
|
|
region of the BSF and should come at the beginning of the UPD sections of the
|
|
|
|
DSC, immediately before the signatures that mark the beginning of these
|
|
|
|
sections. The content should be the plain-text equivalent of the signature. The
|
|
|
|
signature is usually 8 characters.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF FIND:{PROJSIG1}``` or
|
|
|
|
|
|
|
|
```@Bsf FIND:{PROJSIG1}```
|
|
|
|
|
|
|
|
###BLOCK
|
|
|
|
The BLOCK command maps to the **BeginInfoBlock** section of the BSF. There are
|
|
|
|
two elements: a version number and a plain-text description.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF BLOCK:{NAME:"My platform name", VER:"0.1"}``` or
|
|
|
|
|
|
|
|
```@Bsf BLOCK:{NAME:"My platform name", VER:"0.1"}```
|
|
|
|
|
|
|
|
###NAME
|
|
|
|
**NAME** gives a plain-text for a variable. This is the text label that will
|
|
|
|
appear next to the control in **BCT**.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF NAME:{Variable 0}``` or
|
|
|
|
|
|
|
|
```@Bsf NAME:{Variable 0}```
|
|
|
|
|
|
|
|
If the **!BSF NAME** or **@Bsf NAME** command does not appear before an entry
|
|
|
|
in the UPD region of the DSC file, then that entry will not appear in the BSF.
|
|
|
|
|
|
|
|
###TYPE
|
|
|
|
The **TYPE** command is used either by itself or with the **NAME** command. It
|
|
|
|
is usually used by itself when defining an **EditNum** field for the BSF. You
|
|
|
|
specify the type of data in the second parameter and the range of valid values
|
|
|
|
in the third.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF TYPE:{EditNum, HEX, (0x00,0xFF)}``` or
|
|
|
|
|
|
|
|
```@Bsf TYPE:{EditNum, HEX, (0x00,0xFF)}```
|
|
|
|
|
|
|
|
**TYPE** appears on the same line as the **NAME** command when using a combo-box.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF NAME:{Variable 1} TYPE:{Combo}``` or
|
|
|
|
```@Bsf NAME:{Variable 1} TYPE:{Combo}```
|
|
|
|
|
|
|
|
There is a special **None** type that puts the variable in the **StructDef**
|
2019-07-11 10:54:31 +02:00
|
|
|
region of the BSF, but doesn't put it in any **Page** section. This makes the
|
2016-08-05 21:48:20 +02:00
|
|
|
variable visible to BCT, but not to the end user.
|
|
|
|
|
|
|
|
###HELP
|
|
|
|
The **HELP** command defines what will appear in the help text for each control
|
|
|
|
in BCT.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF HELP:{Enable/disable LAN controller.}``` or
|
|
|
|
|
|
|
|
```@Bsf HELP:{Enable/disable LAN controller.}```
|
|
|
|
|
|
|
|
###OPTION
|
|
|
|
The **OPTION** command allows you to custom-define combo boxes and map integer
|
|
|
|
or hex values to friendly-text options.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF OPTION:{0:IDE, 1:AHCI, 2:RAID}```
|
|
|
|
|
|
|
|
```!BSF OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
```@Bsf OPTION:{0:IDE, 1:AHCI, 2:RAID}```
|
|
|
|
|
|
|
|
```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```
|
|
|
|
|
|
|
|
###FIELD
|
|
|
|
The **FIELD** command can be used to define a section of a consolidated PCD
|
|
|
|
such that the PCD will be displayed in several fields via BCT interface instead
|
|
|
|
of one long entry.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF FIELD:{PcdDRAMSpeed:1}``` or
|
|
|
|
|
|
|
|
```@Bsf FIELD:{PcdDRAMSpeed:1}```
|
|
|
|
|
|
|
|
###ORDER
|
|
|
|
The **ORDER** command can be used to adjust the display order for the BSF items.
|
|
|
|
By default the order value for a BSF item is assigned to be the UPD item
|
|
|
|
```(Offset * 256)```. It can be overridden by declaring **ORDER** command using
|
|
|
|
format ORDER: ```{HexMajor.HexMinor}```. In this case the order value will be
|
|
|
|
```(HexMajor*256+HexMinor)```. The item order value will be used as the sort key
|
|
|
|
during the BSF item display.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```!BSF ORDER:{0x0040.01}``` or
|
|
|
|
|
|
|
|
```@Bsf ORDER:{0x0040.01}```
|
|
|
|
|
|
|
|
For **OPTION** and **HELP** commands, it allows to split the contents into
|
|
|
|
multiple lines by adding multiple **OPTION** and **HELP** command lines. The
|
|
|
|
lines except for the very first line need to start with **+** in the content to
|
|
|
|
tell the tool to append this string to the previous one.
|
|
|
|
|
|
|
|
For example, the statement
|
|
|
|
|
|
|
|
```!BSF OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```
|
|
|
|
|
|
|
|
is equivalent to:
|
|
|
|
|
|
|
|
```!BSF OPTION:{0x00:0 MB, 0x01:32 MB,}```
|
|
|
|
|
|
|
|
```!BSF OPTION:{+ 0x02:64 MB}```
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB, 0x02:64 MB}```
|
|
|
|
|
|
|
|
is equivalent to:
|
|
|
|
|
|
|
|
```@Bsf OPTION:{0x00:0 MB, 0x01:32 MB,}```
|
|
|
|
|
|
|
|
```@Bsf OPTION:{+ 0x02:64 MB}```
|
|
|
|
|
|
|
|
The **NAME**, **OPTION**, **TYPE**, and **HELP** commands can all appear on the
|
|
|
|
same line following the **!BSF** or **@Bsf** keyword or they may appear on
|
|
|
|
separate lines to improve readability.
|
|
|
|
|
|
|
|
There are four alternative ways to replace current BSF commands.
|
|
|
|
### 1. ```# @Prompt```
|
|
|
|
An alternative way replacing **NAME** gives a plain-text for a
|
|
|
|
variable. This is the text label that will appear next to the control in BCT.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```# @Prompt Variable 0```
|
|
|
|
|
|
|
|
The above example can replace the two methods as below.
|
|
|
|
|
|
|
|
```!BSF NAME:{Variable 0}``` or
|
|
|
|
|
|
|
|
```@Bsf NAME:{Variable 0}```
|
|
|
|
|
|
|
|
If the ```# @Prompt``` command does not appear before an entry in the UPD region
|
|
|
|
of the DSC file, then that entry will not appear in the BSF.
|
|
|
|
|
|
|
|
### 2. ```##```
|
|
|
|
An alternative way replacing **HELP** command defines what will appear in the
|
|
|
|
help text for each control in BCT.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```## Enable/disable LAN controller.```
|
|
|
|
|
|
|
|
The above example can replace the two methods as below.
|
|
|
|
|
|
|
|
```!BSF HELP:{Enable/disable LAN controller.}``` or
|
|
|
|
|
|
|
|
```@Bsf HELP:{Enable/disable LAN controller.}```
|
|
|
|
|
|
|
|
### 3. ```# @ValidList```
|
|
|
|
An alternative way replacing **OPTION** command allows you to custom-define
|
|
|
|
combo boxes and map integer or hex values to friendly-text options.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
``` # @ValidList 0x80000003 | 0, 1, 2 | IDE, AHCI, RAID
|
|
|
|
Error Code | Options | Descriptions
|
|
|
|
```
|
|
|
|
|
|
|
|
The above example can replace the two methods as below.
|
|
|
|
|
|
|
|
```!BSF OPTION:{0:IDE, 1:AHCI, 2:RAID}``` or
|
|
|
|
|
|
|
|
```@Bsf OPTION:{0:IDE, 1:AHCI, 2:RAID}```
|
|
|
|
|
|
|
|
### 4. ```# @ValidRange```
|
|
|
|
An alternative way replace **EditNum** field for the BSF.
|
|
|
|
|
|
|
|
#####Example:
|
|
|
|
```# @ValidRange 0x80000001 | 0x0 ? 0xFF
|
|
|
|
Error Code | Range
|
|
|
|
```
|
|
|
|
|
|
|
|
The above example can replace the two methods as below.
|
|
|
|
|
|
|
|
```!BSF TYPE:{EditNum, HEX, (0x00,0xFF)}``` or
|
|
|
|
|
|
|
|
```@Bsf TYPE:{EditNum, HEX, (0x00,0xFF)}```
|
|
|
|
|