]>
Commit | Line | Data |
---|---|---|
1 | ## @file\r | |
2 | # process FD generation\r | |
3 | #\r | |
4 | # Copyright (c) 2007, Intel Corporation\r | |
5 | #\r | |
6 | # All rights reserved. This program and the accompanying materials\r | |
7 | # are licensed and made available under the terms and conditions of the BSD License\r | |
8 | # which accompanies this distribution. The full text of the license may be found at\r | |
9 | # http://opensource.org/licenses/bsd-license.php\r | |
10 | #\r | |
11 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
12 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
13 | #\r | |
14 | \r | |
15 | ##\r | |
16 | # Import Modules\r | |
17 | #\r | |
18 | import Region\r | |
19 | import Fv\r | |
20 | import os\r | |
21 | import StringIO\r | |
22 | import sys\r | |
23 | from struct import *\r | |
24 | from GenFdsGlobalVariable import GenFdsGlobalVariable\r | |
25 | from CommonDataClass.FdfClass import FDClassObject\r | |
26 | from Common import EdkLogger\r | |
27 | from Common.BuildToolError import *\r | |
28 | from Common.Misc import SaveFileOnChange\r | |
29 | from GenFds import GenFds\r | |
30 | \r | |
31 | ## generate FD\r | |
32 | #\r | |
33 | #\r | |
34 | class FD(FDClassObject):\r | |
35 | ## The constructor\r | |
36 | #\r | |
37 | # @param self The object pointer\r | |
38 | #\r | |
39 | def __init__(self):\r | |
40 | FDClassObject.__init__(self)\r | |
41 | \r | |
42 | ## GenFd() method\r | |
43 | #\r | |
44 | # Generate FD\r | |
45 | #\r | |
46 | # @retval string Generated FD file name\r | |
47 | #\r | |
48 | def GenFd (self):\r | |
49 | if self.FdUiName.upper() + 'fd' in GenFds.ImageBinDict.keys():\r | |
50 | return GenFds.ImageBinDict[self.FdUiName.upper() + 'fd']\r | |
51 | \r | |
52 | #\r | |
53 | # Print Information\r | |
54 | #\r | |
55 | GenFdsGlobalVariable.InfLogger("Fd File Name:%s" %self.FdUiName)\r | |
56 | Offset = 0x00\r | |
57 | for item in self.BlockSizeList:\r | |
58 | Offset = Offset + item[0] * item[1]\r | |
59 | if Offset != self.Size:\r | |
60 | EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s Size not consistent with block array' % self.FdUiName)\r | |
61 | GenFdsGlobalVariable.VerboseLogger('Following Fv will be add to Fd !!!')\r | |
62 | for FvObj in GenFdsGlobalVariable.FdfParser.Profile.FvDict:\r | |
63 | GenFdsGlobalVariable.VerboseLogger(FvObj)\r | |
64 | \r | |
65 | GenFdsGlobalVariable.VerboseLogger('################### Gen VTF ####################')\r | |
66 | self.GenVtfFile()\r | |
67 | \r | |
68 | TempFdBuffer = StringIO.StringIO('')\r | |
69 | PreviousRegionStart = -1\r | |
70 | PreviousRegionSize = 1\r | |
71 | \r | |
72 | for RegionObj in self.RegionList :\r | |
73 | if RegionObj.RegionType == 'CAPSULE':\r | |
74 | continue\r | |
75 | if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r | |
76 | pass\r | |
77 | elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r | |
78 | pass\r | |
79 | elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:\r | |
80 | GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))\r | |
81 | PadRegion = Region.Region()\r | |
82 | PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r | |
83 | PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r | |
84 | PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r | |
85 | PreviousRegionStart = RegionObj.Offset\r | |
86 | PreviousRegionSize = RegionObj.Size\r | |
87 | #\r | |
88 | # Call each region's AddToBuffer function\r | |
89 | #\r | |
90 | if PreviousRegionSize > self.Size:\r | |
91 | pass\r | |
92 | GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r | |
93 | RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r | |
94 | \r | |
95 | FdBuffer = StringIO.StringIO('')\r | |
96 | PreviousRegionStart = -1\r | |
97 | PreviousRegionSize = 1\r | |
98 | for RegionObj in self.RegionList :\r | |
99 | if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart:\r | |
100 | EdkLogger.error("GenFds", GENFDS_ERROR,\r | |
101 | 'Region offset 0x%X in wrong order with Region starting from 0x%X, size 0x%X\nRegions in FDF must have offsets appear in ascending order.'\\r | |
102 | % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))\r | |
103 | elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize):\r | |
104 | EdkLogger.error("GenFds", GENFDS_ERROR,\r | |
105 | 'Region offset 0x%X overlaps with Region starting from 0x%X, size 0x%X' \\r | |
106 | % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize))\r | |
107 | elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize:\r | |
108 | GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize)))\r | |
109 | PadRegion = Region.Region()\r | |
110 | PadRegion.Offset = PreviousRegionStart + PreviousRegionSize\r | |
111 | PadRegion.Size = RegionObj.Offset - PadRegion.Offset\r | |
112 | PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r | |
113 | PreviousRegionStart = RegionObj.Offset\r | |
114 | PreviousRegionSize = RegionObj.Size\r | |
115 | #\r | |
116 | # Call each region's AddToBuffer function\r | |
117 | #\r | |
118 | if PreviousRegionSize > self.Size:\r | |
119 | EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s size too small' % self.FdUiName)\r | |
120 | GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function')\r | |
121 | RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict)\r | |
122 | #\r | |
123 | # Create a empty Fd file\r | |
124 | #\r | |
125 | GenFdsGlobalVariable.VerboseLogger ('Create an empty Fd file')\r | |
126 | FdFileName = os.path.join(GenFdsGlobalVariable.FvDir,self.FdUiName + '.fd')\r | |
127 | #\r | |
128 | # Write the buffer contents to Fd file\r | |
129 | #\r | |
130 | GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file')\r | |
131 | SaveFileOnChange(FdFileName, FdBuffer.getvalue())\r | |
132 | FdBuffer.close();\r | |
133 | GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName\r | |
134 | return FdFileName\r | |
135 | \r | |
136 | ## generate VTF\r | |
137 | #\r | |
138 | # @param self The object pointer\r | |
139 | #\r | |
140 | def GenVtfFile (self) :\r | |
141 | #\r | |
142 | # Get this Fd's all Fv name\r | |
143 | #\r | |
144 | FvAddDict ={}\r | |
145 | FvList = []\r | |
146 | for RegionObj in self.RegionList:\r | |
147 | if RegionObj.RegionType == 'FV':\r | |
148 | if len(RegionObj.RegionDataList) == 1:\r | |
149 | RegionData = RegionObj.RegionDataList[0]\r | |
150 | FvList.append(RegionData.upper())\r | |
151 | FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r | |
152 | RegionObj.Offset, RegionObj.Size)\r | |
153 | else:\r | |
154 | Offset = RegionObj.Offset\r | |
155 | for RegionData in RegionObj.RegionDataList:\r | |
156 | FvList.append(RegionData.upper())\r | |
157 | FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(RegionData.upper())\r | |
158 | if len(FvObj.BlockSizeList) < 1:\r | |
159 | EdkLogger.error("GenFds", GENFDS_ERROR,\r | |
160 | 'FV.%s must point out FVs blocksize and Fv BlockNum' \\r | |
161 | % FvObj.UiFvName)\r | |
162 | else:\r | |
163 | Size = 0\r | |
164 | for blockStatement in FvObj.BlockSizeList:\r | |
165 | Size = Size + blockStatement[0] * blockStatement[1]\r | |
166 | FvAddDict[RegionData.upper()] = (int(self.BaseAddress,16) + \\r | |
167 | Offset, Size)\r | |
168 | Offset = Offset + Size\r | |
169 | #\r | |
170 | # Check whether this Fd need VTF\r | |
171 | #\r | |
172 | Flag = False\r | |
173 | for VtfObj in GenFdsGlobalVariable.FdfParser.Profile.VtfList:\r | |
174 | compLocList = VtfObj.GetFvList()\r | |
175 | if set(compLocList).issubset(FvList):\r | |
176 | Flag = True\r | |
177 | break\r | |
178 | if Flag == True:\r | |
179 | self.vtfRawDict = VtfObj.GenVtf(FvAddDict)\r | |
180 | \r | |
181 | ## generate flash map file\r | |
182 | #\r | |
183 | # @param self The object pointer\r | |
184 | #\r | |
185 | def GenFlashMap (self):\r | |
186 | pass\r | |
187 | \r | |
188 | \r | |
189 | \r | |
190 | \r | |
191 | \r | |
192 | \r | |
193 | \r | |
194 | \r |