]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/CapsuleData.py
BaseTools: Supported FMP capsule image.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / CapsuleData.py
index 85307b90c647624dcd6d788d443c66783cfc8781..efc281222bd585b19d4a9dc4fc2a3d6635aa376b 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # generate capsule\r
 #\r
-#  Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007-2013, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -18,6 +18,9 @@
 import Ffs\r
 from GenFdsGlobalVariable import GenFdsGlobalVariable\r
 import StringIO\r
+from struct import pack\r
+import os\r
+from Common.Misc import SaveFileOnChange\r
 \r
 ## base class for capsule data\r
 #\r
@@ -43,7 +46,7 @@ class CapsuleFfs (CapsuleData):
     #\r
     #   @param  self        The object pointer\r
     #\r
-    def __init_(self) :\r
+    def __init__(self) :\r
         self.Ffs = None\r
         self.FvName = None\r
 \r
@@ -87,3 +90,138 @@ class CapsuleFv (CapsuleData):
         else:\r
             FvFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvName)\r
             return FvFile\r
+\r
+## FD class for capsule data\r
+#\r
+#\r
+class CapsuleFd (CapsuleData):\r
+    ## The constructor\r
+    #\r
+    #   @param  self        The object pointer\r
+    #\r
+    def __init__(self) :\r
+        self.Ffs = None\r
+        self.FdName = None\r
+        self.CapsuleName = None\r
+\r
+    ## generate FD capsule data\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @retval string      Generated file name\r
+    #\r
+    def GenCapsuleSubItem(self):\r
+        if self.FdName.find('.fd') == -1:\r
+            if self.FdName.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys():\r
+                FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper())\r
+                FdFile = FdObj.GenFd()\r
+                return FdFile\r
+        else:\r
+            FdFile = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FdName)\r
+            return FdFile\r
+        \r
+## AnyFile class for capsule data\r
+#\r
+#\r
+class CapsuleAnyFile (CapsuleData):\r
+    ## The constructor\r
+    #\r
+    #   @param  self        The object pointer\r
+    #\r
+    def __init__(self) :\r
+        self.Ffs = None\r
+        self.FileName = None\r
+\r
+    ## generate AnyFile capsule data\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @retval string      Generated file name\r
+    #\r
+    def GenCapsuleSubItem(self):\r
+        return self.FileName\r
+    \r
+## Afile class for capsule data\r
+#\r
+#\r
+class CapsuleAfile (CapsuleData):\r
+    ## The constructor\r
+    #\r
+    #   @param  self        The object pointer\r
+    #\r
+    def __init__(self) :\r
+        self.Ffs = None\r
+        self.FileName = None\r
+\r
+    ## generate Afile capsule data\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @retval string      Generated file name\r
+    #\r
+    def GenCapsuleSubItem(self):\r
+        return self.FileName\r
+\r
+class CapsulePayload(CapsuleData):\r
+    '''Generate payload file, the header is defined below:\r
+    #pragma pack(1)\r
+    typedef struct {\r
+        UINT32 Version;\r
+        EFI_GUID UpdateImageTypeId;\r
+        UINT8 UpdateImageIndex;\r
+        UINT8 reserved_bytes[3];\r
+        UINT32 UpdateImageSize;\r
+        UINT32 UpdateVendorCodeSize;\r
+        UINT64 UpdateHardwareInstance; //Introduced in v2\r
+    } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;\r
+    '''\r
+    def __init__(self):\r
+        self.UiName = None\r
+        self.Version = None\r
+        self.ImageTypeId = None\r
+        self.ImageIndex = None\r
+        self.HardwareInstance = None\r
+        self.ImageFile = None\r
+        self.VendorCodeFile = None\r
+\r
+    def GenCapsuleSubItem(self):\r
+        if not self.Version:\r
+            self.Version = 0x00000002\r
+        ImageFileSize = os.path.getsize(self.ImageFile)\r
+        VendorFileSize = 0\r
+        if self.VendorCodeFile:\r
+            VendorFileSize = os.path.getsize(self.VendorCodeFile)\r
+\r
+        #\r
+        # Fill structure\r
+        #\r
+        Guid = self.ImageTypeId.split('-')\r
+        Buffer = pack('=ILHHBBBBBBBBBBBBIIQ',\r
+                       int(self.Version,16),\r
+                       int(Guid[0], 16), \r
+                       int(Guid[1], 16), \r
+                       int(Guid[2], 16), \r
+                       int(Guid[3][-4:-2], 16), \r
+                       int(Guid[3][-2:], 16),  \r
+                       int(Guid[4][-12:-10], 16),\r
+                       int(Guid[4][-10:-8], 16),\r
+                       int(Guid[4][-8:-6], 16),\r
+                       int(Guid[4][-6:-4], 16),\r
+                       int(Guid[4][-4:-2], 16),\r
+                       int(Guid[4][-2:], 16),\r
+                       int(self.ImageIndex, 16),\r
+                       0,\r
+                       0,\r
+                       0,\r
+                       ImageFileSize,\r
+                       VendorFileSize,\r
+                       int(self.HardwareInstance, 16)\r
+                       )\r
+        #\r
+        # Append file content to the structure\r
+        #\r
+        ImageFile = open(self.ImageFile, 'rb')\r
+        Buffer += ImageFile.read()\r
+        ImageFile.close()\r
+        if self.VendorCodeFile:\r
+            VendorFile = open(self.VendorCodeFile, 'rb')\r
+            Buffer += VendorFile.read()\r
+            VendorFile.close()\r
+        return Buffer\r