Project import generated by Copybara.
GitOrigin-RevId: 81172f277d66bac9440e6cac9fdc30ff2a29d5c8
diff --git a/tools/binman/image.py b/tools/binman/image.py
new file mode 100644
index 0000000..f237ae3
--- /dev/null
+++ b/tools/binman/image.py
@@ -0,0 +1,153 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Class for an image, the output of binman
+#
+
+from __future__ import print_function
+
+from collections import OrderedDict
+from operator import attrgetter
+import re
+import sys
+
+import fdt_util
+import bsection
+import tools
+
+class Image:
+ """A Image, representing an output from binman
+
+ An image is comprised of a collection of entries each containing binary
+ data. The image size must be large enough to hold all of this data.
+
+ This class implements the various operations needed for images.
+
+ Atrtributes:
+ _node: Node object that contains the image definition in device tree
+ _name: Image name
+ _size: Image size in bytes, or None if not known yet
+ _filename: Output filename for image
+ _sections: Sections present in this image (may be one or more)
+
+ Args:
+ test: True if this is being called from a test of Images. This this case
+ there is no device tree defining the structure of the section, so
+ we create a section manually.
+ """
+ def __init__(self, name, node, test=False):
+ self._node = node
+ self._name = name
+ self._size = None
+ self._filename = '%s.bin' % self._name
+ if test:
+ self._section = bsection.Section('main-section', None, self._node,
+ self, True)
+ else:
+ self._ReadNode()
+
+ def _ReadNode(self):
+ """Read properties from the image node"""
+ self._size = fdt_util.GetInt(self._node, 'size')
+ filename = fdt_util.GetString(self._node, 'filename')
+ if filename:
+ self._filename = filename
+ self._section = bsection.Section('main-section', None, self._node, self)
+
+ def GetFdtSet(self):
+ """Get the set of device tree files used by this image"""
+ return self._section.GetFdtSet()
+
+ def ExpandEntries(self):
+ """Expand out any entries which have calculated sub-entries
+
+ Some entries are expanded out at runtime, e.g. 'files', which produces
+ a section containing a list of files. Process these entries so that
+ this information is added to the device tree.
+ """
+ self._section.ExpandEntries()
+
+ def AddMissingProperties(self):
+ """Add properties that are not present in the device tree
+
+ When binman has completed packing the entries the offset and size of
+ each entry are known. But before this the device tree may not specify
+ these. Add any missing properties, with a dummy value, so that the
+ size of the entry is correct. That way we can insert the correct values
+ later.
+ """
+ self._section.AddMissingProperties()
+
+ def ProcessFdt(self, fdt):
+ """Allow entries to adjust the device tree
+
+ Some entries need to adjust the device tree for their purposes. This
+ may involve adding or deleting properties.
+ """
+ return self._section.ProcessFdt(fdt)
+
+ def GetEntryContents(self):
+ """Call ObtainContents() for the section
+ """
+ self._section.GetEntryContents()
+
+ def GetEntryOffsets(self):
+ """Handle entries that want to set the offset/size of other entries
+
+ This calls each entry's GetOffsets() method. If it returns a list
+ of entries to update, it updates them.
+ """
+ self._section.GetEntryOffsets()
+
+ def PackEntries(self):
+ """Pack all entries into the image"""
+ self._section.PackEntries()
+
+ def CheckSize(self):
+ """Check that the image contents does not exceed its size, etc."""
+ self._size = self._section.CheckSize()
+
+ def CheckEntries(self):
+ """Check that entries do not overlap or extend outside the image"""
+ self._section.CheckEntries()
+
+ def SetCalculatedProperties(self):
+ self._section.SetCalculatedProperties()
+
+ def SetImagePos(self):
+ self._section.SetImagePos(0)
+
+ def ProcessEntryContents(self):
+ """Call the ProcessContents() method for each entry
+
+ This is intended to adjust the contents as needed by the entry type.
+ """
+ self._section.ProcessEntryContents()
+
+ def WriteSymbols(self):
+ """Write symbol values into binary files for access at run time"""
+ self._section.WriteSymbols()
+
+ def BuildImage(self):
+ """Write the image to a file"""
+ fname = tools.GetOutputFilename(self._filename)
+ with open(fname, 'wb') as fd:
+ self._section.BuildSection(fd, 0)
+
+ def GetEntries(self):
+ return self._section.GetEntries()
+
+ def WriteMap(self):
+ """Write a map of the image to a .map file
+
+ Returns:
+ Filename of map file written
+ """
+ filename = '%s.map' % self._name
+ fname = tools.GetOutputFilename(filename)
+ with open(fname, 'w') as fd:
+ print('%8s %8s %8s %s' % ('ImagePos', 'Offset', 'Size', 'Name'),
+ file=fd)
+ self._section.WriteMap(fd, 0)
+ return fname