2 from GenFdsGlobalVariable import GenFdsGlobalVariable
\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
11 self.RegionSize = None
\r
12 self.SetVarDict = {}
\r
13 self.RegionType = None
\r
14 self.RegionData = None
\r
19 # Add RegionData to Fd file
\r
21 def AddToBuffer(self, Buffer, BaseAddress, BlockSizeList, ErasePolarity, FvBinDict, vtfDict = None):
\r
23 print "Fv Size = %d" %Size
\r
25 if self.RegionType == 'FV':
\r
27 # Get Fv from FvDict
\r
29 fv = GenFdsGlobalVariable.FdfParser.profile.FvDict.get(self.RegionData.upper())
\r
31 # Create local Buffer
\r
35 print "GenFv: %s" %self.RegionData
\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
53 FvBinDict[self.RegionData.upper()] = FileName
\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
62 # If File contents less than region size, append "0xff" after it
\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
69 FvBuffer.write(Pack('B', int('0x00', 16)))
\r
70 Buffer.write(FvBuffer)
\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
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
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
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
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
99 def __BlockSizeOfRegion__(self, BlockSizeList):
\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
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