Add support for locating an image's Fdt map which is used to determine
the contents and structure of the image.
Signed-off-by: Simon Glass
---
Changes in v2:
- Adjust LocateFdtmap() to return the position of the header
- Update commit subject to more accurately describe this patch
- Update test to use _DoReadFileRealDtb() helper
tools/binman/etype/fdtmap.py | 25 --
tools/binman/ftest.py | 15 +++
tools/binman/test/128_decode_image.dts | 36 ++
3 files changed, 74 insertions(+), 2 deletions(-)
create mode 100644 tools/binman/test/128_decode_image.dts
diff --git a/tools/binman/etype/fdtmap.py b/tools/binman/etype/fdtmap.py
index bfd7962be3a..08505264984 100644
--- a/tools/binman/etype/fdtmap.py
+++ b/tools/binman/etype/fdtmap.py
@@ -15,7 +15,26 @@ from fdt import Fdt
import state
import tools
-FDTMAP_MAGIC = b'_FDTMAP_'
+FDTMAP_MAGIC = b'_FDTMAP_'
+FDTMAP_HDR_LEN = 16
+
+def LocateFdtmap(data):
+"""Search an image for an fdt map
+
+Args:
+data: Data to search
+
+Returns:
+Position of fdt map in data, or None if not found. Note that the
+position returned is of the FDT header, i.e. before the FDT data
+"""
+hdr_pos = data.find(FDTMAP_MAGIC)
+size = len(data)
+if hdr_pos:
+hdr = data[hdr_pos:hdr_pos + FDTMAP_HDR_LEN]
+if len(hdr) == FDTMAP_HDR_LEN:
+return hdr_pos
+return None
class Entry_fdtmap(Entry):
"""An entry which contains an FDT map
@@ -24,7 +43,9 @@ class Entry_fdtmap(Entry):
None
An FDT map is just a header followed by an FDT containing a list of all the
-entries in the image.
+entries in the image. The root node corresponds to the image node in the
+original FDT, and an image-name property indicates the image name in that
+original tree.
The header is the string _FDTMAP_ followed by 8 unused bytes.
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index de459b2b3b6..d800ba1e9d8 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -24,6 +24,7 @@ import command
import control
import elf
import fdt
+from etype import fdtmap
import fdt_util
import fmap_util
import test_util
@@ -2267,6 +2268,20 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(len(data), 0x100 + section_size)
self.assertEqual(section_size, 0x400 + dtb_size)
+def testFindFdtmap(self):
+"""Test locating an FDT map in an image"""
+self._CheckLz4()
+data = self.data = self._DoReadFileRealDtb('128_decode_image.dts')
+image = control.images['image']
+entries = image.GetEntries()
+entry = entries['fdtmap']
+self.assertEqual(entry.image_pos, fdtmap.LocateFdtmap(data))
+
+def testFindFdtmapMissing(self):
+"""Test failing to locate an FDP map"""
+data = self._DoReadFile('005_simple.dts')
+self.assertEqual(None, fdtmap.LocateFdtmap(data))
+
if __name__ == "__main__":
unittest.main()
diff --git a/tools/binman/test/128_decode_image.dts
b/tools/binman/test/128_decode_image.dts
new file mode 100644
index 000..449fccc41df
--- /dev/null
+++ b/tools/binman/test/128_decode_image.dts
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <0xc00>;
+ u-boot {
+ };
+ section {
+ align = <0x100>;
+ cbfs {
+ size = <0x400>;
+ u-boot {
+ cbfs-type = "raw";
+ };
+ u-boot-dtb {
+ cbfs-type = "raw";
+ cbfs-compress = "lzma";
+ cbfs-offset = <0x80>;
+ };
+ };
+ u-boot-dtb {
+ compress = "lz4";
+ };
+ };
+ fdtmap {
+ };
+ image-header {
+ location = "end";
+ };
+ };
+};
--
2.22.0.410.gd8fdbe21b5-goog
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot