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:
parent
41b8ba090c
commit
e1925fa520
3 changed files with 74 additions and 2 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
36
tools/binman/test/128_decode_image.dts
Normal file
36
tools/binman/test/128_decode_image.dts
Normal 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";
|
||||
};
|
||||
};
|
||||
};
|
Loading…
Reference in a new issue