1 # SPDX-License-Identifier: GPL-2.0+
2 # Copyright (c) 2016 Google, Inc
3 # Written by Simon Glass <sjg@chromium.org>
5 # Entry-type module for producing an image using mkimage
8 from collections import OrderedDict
10 from binman.entry import Entry
11 from dtoc import fdt_util
12 from patman import tools
14 class Entry_mkimage(Entry):
15 """Binary produced by mkimage
17 Properties / Entry arguments:
18 - datafile: Filename for -d argument
19 - args: Other arguments to pass
21 The data passed to mkimage is collected from subnodes of the mkimage node,
25 args = "-n test -T imximage";
31 This calls mkimage to create an imximage with u-boot-spl.bin as the input
32 file. The output from mkimage then becomes part of the image produced by
35 To use CONFIG options in the arguments, use a string list instead, as in
36 this example which also produces four arguments::
39 args = "-n", CONFIG_SYS_SOC, "-T imximage";
46 def __init__(self, section, etype, node):
47 super().__init__(section, etype, node)
48 self._args = fdt_util.GetArgs(self._node, 'args')
49 self._mkimage_entries = OrderedDict()
50 self.align_default = None
53 def ObtainContents(self):
54 # Use a non-zero size for any fake files to keep mkimage happy
55 data, input_fname, uniq = self.collect_contents_to_file(
56 self._mkimage_entries.values(), 'mkimage', 1024)
59 output_fname = tools.get_output_filename('mkimage-out.%s' % uniq)
60 if self.mkimage.run_cmd('-d', input_fname, *self._args,
61 output_fname) is not None:
62 self.SetContents(tools.read_file(output_fname))
64 # Bintool is missing; just use the input data as the output
65 self.record_missing_bintool(self.mkimage)
66 self.SetContents(data)
70 def ReadEntries(self):
71 """Read the subnodes to find out what should go in this image"""
72 for node in self._node.subnodes:
73 entry = Entry.Create(self, node)
75 self._mkimage_entries[entry.name] = entry
77 def SetAllowMissing(self, allow_missing):
78 """Set whether a section allows missing external blobs
81 allow_missing: True if allowed, False if not allowed
83 self.allow_missing = allow_missing
84 for entry in self._mkimage_entries.values():
85 entry.SetAllowMissing(allow_missing)
87 def SetAllowFakeBlob(self, allow_fake):
88 """Set whether the sub nodes allows to create a fake blob
91 allow_fake: True if allowed, False if not allowed
93 for entry in self._mkimage_entries.values():
94 entry.SetAllowFakeBlob(allow_fake)
96 def CheckFakedBlobs(self, faked_blobs_list):
97 """Check if any entries in this section have faked external blobs
99 If there are faked blobs, the entries are added to the list
102 faked_blobs_list: List of Entry objects to be added to
104 for entry in self._mkimage_entries.values():
105 entry.CheckFakedBlobs(faked_blobs_list)
107 def AddBintools(self, btools):
108 self.mkimage = self.AddBintool(btools, 'mkimage')