binman: Support locating an FDT map

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 <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-07-08 14:25:44 -06:00
parent 41b8ba090c
commit e1925fa520
3 changed files with 74 additions and 2 deletions

View File

@ -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 != -1:
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.

View File

@ -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()

View File

@ -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";
};
};
};