]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Add support for calling mkimage
authorSimon Glass <sjg@chromium.org>
Fri, 10 Jul 2020 00:39:31 +0000 (18:39 -0600)
committerSimon Glass <sjg@chromium.org>
Sat, 25 Jul 2020 01:25:15 +0000 (19:25 -0600)
As a first step to integrating mkimage into binman, add a new entry type
that feeds data into mkimage for processing and incorporates that output
into the image.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/README.entries
tools/binman/etype/_testing.py
tools/binman/etype/mkimage.py [new file with mode: 0644]
tools/binman/ftest.py
tools/binman/test/156_mkimage.dts [new file with mode: 0644]

index 6a816bba6bcf1b0d5157e8f1122fbb9e0abcd22f..4f2c48fdc26a98b2f2d41cd36055a12f62c8ae51 100644 (file)
@@ -587,6 +587,29 @@ See README.x86 for information about Intel binary blobs.
 
 
 
+Entry: mkimage: Entry containing a binary produced by mkimage
+-------------------------------------------------------------
+
+Properties / Entry arguments:
+    - datafile: Filename for -d argument
+    - args: Other arguments to pass
+
+The data passed to mkimage is collected from subnodes of the mkimage node,
+e.g.:
+
+    mkimage {
+        args = "-n test -T imximage";
+
+        u-boot-spl {
+        };
+    };
+
+This calls mkimage to create an imximage with u-boot-spl.bin as the input
+file. The output from mkimage then becomes part of the image produced by
+binman.
+
+
+
 Entry: powerpc-mpc85xx-bootpg-resetvec: PowerPC mpc85xx bootpg + resetvec code for U-Boot
 -----------------------------------------------------------------------------------------
 
index ed718eed14518268e4c921c4daf2f6f670c26df3..ea60561adba1e7fdd5630fa6f4b261abc928354e 100644 (file)
@@ -57,6 +57,8 @@ class Entry__testing(Entry):
                                                      'return-contents-once')
         self.bad_update_contents_twice = fdt_util.GetBool(self._node,
                                                     'bad-update-contents-twice')
+        self.return_contents_later = fdt_util.GetBool(self._node,
+                                                     'return-contents-later')
 
         # Set to True when the entry is ready to process the FDT.
         self.process_fdt_ready = False
@@ -83,6 +85,9 @@ class Entry__testing(Entry):
     def ObtainContents(self):
         if self.return_unknown_contents or not self.return_contents:
             return False
+        if self.return_contents_later:
+            self.return_contents_later = False
+            return False
         self.data = self.contents
         self.contents_size = len(self.data)
         if self.return_contents_once:
diff --git a/tools/binman/etype/mkimage.py b/tools/binman/etype/mkimage.py
new file mode 100644 (file)
index 0000000..1aa5639
--- /dev/null
@@ -0,0 +1,62 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for producing an image using mkimage
+#
+
+from collections import OrderedDict
+
+from binman.entry import Entry
+from dtoc import fdt_util
+from patman import tools
+
+class Entry_mkimage(Entry):
+    """Entry containing a binary produced by mkimage
+
+    Properties / Entry arguments:
+        - datafile: Filename for -d argument
+        - args: Other arguments to pass
+
+    The data passed to mkimage is collected from subnodes of the mkimage node,
+    e.g.:
+
+        mkimage {
+            args = "-n test -T imximage";
+
+            u-boot-spl {
+            };
+        };
+
+    This calls mkimage to create an imximage with u-boot-spl.bin as the input
+    file. The output from mkimage then becomes part of the image produced by
+    binman.
+    """
+    def __init__(self, section, etype, node):
+        Entry.__init__(self, section, etype, node)
+        self._args = fdt_util.GetString(self._node, 'args').split(' ')
+        self._mkimage_entries = OrderedDict()
+        self._ReadSubnodes()
+
+    def ObtainContents(self):
+        data = b''
+        for entry in self._mkimage_entries.values():
+            # First get the input data and put it in a file. If not available,
+            # try later.
+            if not entry.ObtainContents():
+                return False
+            data += entry.GetData()
+        uniq = self.GetUniqueName()
+        input_fname = tools.GetOutputFilename('mkimage.%s' % uniq)
+        tools.WriteFile(input_fname, data)
+        output_fname = tools.GetOutputFilename('mkimage-out.%s' % uniq)
+        tools.Run('mkimage', '-d', input_fname, *self._args, output_fname)
+        self.SetContents(tools.ReadFile(output_fname))
+        return True
+
+    def _ReadSubnodes(self):
+        """Read the subnodes to find out what should go in this image"""
+        for node in self._node.subnodes:
+            entry = Entry.Create(self, node)
+            entry.ReadNode()
+            self._mkimage_entries[entry.name] = entry
index 5e24920088c5a91becb478d915ed45d777d17011..39e67b9042b73398d2b79ff8e36084fe8568d39c 100644 (file)
@@ -3357,6 +3357,13 @@ class TestFunctional(unittest.TestCase):
         data = self._DoReadFile('154_intel_fsp_t.dts')
         self.assertEqual(FSP_T_DATA, data[:len(FSP_T_DATA)])
 
+    def testMkimage(self):
+        """Test using mkimage to build an image"""
+        data = self._DoReadFile('156_mkimage.dts')
+
+        # Just check that the data appears in the file somewhere
+        self.assertIn(U_BOOT_SPL_DATA, data)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/156_mkimage.dts b/tools/binman/test/156_mkimage.dts
new file mode 100644 (file)
index 0000000..933b131
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               size = <0x80>;
+
+               mkimage {
+                       args = "-n test -T script";
+
+                       u-boot-spl {
+                       };
+
+                       _testing {
+                               return-contents-later;
+                       };
+               };
+       };
+};