Modify GenFds related files.
[people/mcb30/basetools.git] / Source / Python / GenFds / Region.py
1 from struct import *\r
2 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
3 import StringIO\r
4 \r
5 class region:\r
6     def __init__(self):\r
7         self.Offset = None       # The begin position of the Region\r
8         self.Size = None         # The Size of the Region\r
9         self.PcdOffset = None\r
10         self.PcdSize = None\r
11         self.RegionSize = None\r
12         self.SetVarDict = {}\r
13         self.RegionType = None\r
14         self.RegionData = None\r
15         \r
16         \r
17         \r
18 ##\r
19 #  Add RegionData to Fd file\r
20 ##\r
21     def AddToBuffer(self, Buffer, BaseAddress, BlockSizeList, ErasePolarity, FvBinDict, vtfDict = None):\r
22         Size = self.Size\r
23         print "Fv Size = %d" %Size\r
24         \r
25         if self.RegionType == 'FV':\r
26             #\r
27             # Get Fv from FvDict\r
28             #\r
29             fv = GenFdsGlobalVariable.FdfParser.profile.FvDict.get(self.RegionData.upper())\r
30             #\r
31             # Create local Buffer\r
32             #\r
33             \r
34             if fv != None :\r
35                 print "GenFv: %s" %self.RegionData\r
36                 #\r
37                 # Call GenFv tool\r
38                 #\r
39                 \r
40                 self.FvAddress = int(BaseAddress, 16) + self.Offset\r
41                 BlockSize = self.__BlockSizeOfRegion__(BlockSizeList)\r
42                 BlockNum = self.__BlockNumOfRegion__(BlockSize)\r
43                 FvBaseAddress = '0x%x' %self.FvAddress\r
44                 FileName = fv.AddToBuffer(Buffer, FvBaseAddress, BlockSize, BlockNum, ErasePolarity, vtfDict)\r
45                 BinFile = open (FileName, 'r+b')\r
46                 FvBuffer = StringIO.StringIO('')\r
47                 FvBuffer.write(BinFile.read())\r
48                 if FvBuffer.len > Size:\r
49                     raise Exception ("Size of Fv (%s) is large than Region Size ", self.RegionData)\r
50                 elif FvBuffer.len < Size :\r
51                     raise Exception ("Size of Fv (%s) is less than Region Size ", self.RegionData)\r
52                 FvBuffer.close()\r
53                 FvBinDict[self.RegionData.upper()] = FileName\r
54 \r
55         if self.RegionType == 'FILE':\r
56             BinFile = open (self.RegionData, 'r+b')\r
57             FvBuffer = StringIO.StringIO('')\r
58             FvBuffer.write(BinFile.read())\r
59             if FvBuffer.len > Size :\r
60                 raise Exception ("Size of File (%s) large than Region Size ", self.RegionData)\r
61             #\r
62             # If File contents less than region size, append "0xff" after it\r
63             #\r
64             elif FvBuffer.len < Size:\r
65                 for index in range(0, (Size-FvBuffer.len)):\r
66                     if (ErasePolarity == '1'):\r
67                         FvBuffer.write(Pack('B', int('0xFF', 16)))\r
68                     else:\r
69                         FvBuffer.write(Pack('B', int('0x00', 16)))\r
70             Buffer.write(FvBuffer)\r
71             FvBuffer.close()\r
72             \r
73         if self.RegionType == 'DATA' :\r
74             Data = self.RegionData.split(',')\r
75             if len(Data) > Size:\r
76                raise Exception ("Size of DATA large than Region Size ")\r
77             elif len(Data) <= Size:\r
78                 for item in Data :\r
79                     Buffer.write(pack('B', int(item, 16)))\r
80                 if (ErasePolarity == '1'):\r
81 ##                    for index in range(0, (Size - len(Data))):\r
82 ##                        Buffer.write(pack('B', int('0xFF', 16)))\r
83                     Buffer.write(pack(str(Size - len(Data))+'B', *(int('0xFF', 16) for i in range(Size - len(Data)))))\r
84                 else:\r
85                     Buffer.write(pack(str(Size - len(Data))+'B', *(int('0x00', 16) for i in range(Size - len(Data)))))\r
86 ##                    for index in range(0, (Size - len(Data))):\r
87 ##                        Buffer.write(pack('B', int('0x00', 16)))\r
88                 \r
89         if self.RegionType == None:\r
90             if (ErasePolarity == '1') :\r
91 ##                for i in range(0, Size) :\r
92 ##                    Buffer.write(pack('B', int('0xFF', 16)))\r
93                 Buffer.write(pack(str(Size)+'B', *(int('0xFF', 16) for i in range(0, Size))))\r
94             else :\r
95                 Buffer.write(pack(str(Size)+'B', *(int('0x00', 16) for i in range(0, Size))))\r
96 ##                for i in range(0, Size) :\r
97 ##                    Buffer.write(pack('B', int('0x00', 16)))\r
98 \r
99     def __BlockSizeOfRegion__(self, BlockSizeList):\r
100         Offset = 0x00\r
101         BlockSize = 0\r
102         for item in BlockSizeList:\r
103             Offset = Offset + item[0]  * item[1]\r
104             print "Offset = 0x%x" %Offset\r
105             print "self.Offset %x" %self.Offset\r
106             if self.Offset < Offset :\r
107                 BlockSize = item[0]\r
108                 #print "BlockSize = %s" %BlockSize\r
109                 return BlockSize\r
110         return BlockSize\r
111     def __BlockNumOfRegion__ (self, BlockSize):\r
112         if BlockSize == 0 :\r
113             raise Exception ("Region: %s doesn't in Fd address scope !" %self.Offset)\r
114         BlockNum = self.Size / BlockSize\r
115         #print "BlockNum = %x" %BlockNum\r
116         return BlockNum\r
117                 \r