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