diff options
author | Simon Glass <sjg@chromium.org> | 2023-01-07 14:07:08 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2023-01-18 11:50:01 -0700 |
commit | efddab6c365439b9084ef1ac4750eacb7ba9e889 (patch) | |
tree | 2856c869b25cc877abcf9a10fd47a6b93da19583 | |
parent | 85d87112cb0abedf0d6f1a14422e89d335533157 (diff) | |
download | u-boot-efddab6c365439b9084ef1ac4750eacb7ba9e889.zip u-boot-efddab6c365439b9084ef1ac4750eacb7ba9e889.tar.gz u-boot-efddab6c365439b9084ef1ac4750eacb7ba9e889.tar.bz2 |
binman: Allow writing section contents to a file
At present only the image (which is a section) has a filename. Move this
implementation to the entry_Section class so that any section can have a
filename. With this, the section data is written to a file.
This allows parts of an image to be written, along with the entire image.
Make a note that this can be used to include the contents of a section in
one image in another (later) image.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | tools/binman/binman.rst | 5 | ||||
-rw-r--r-- | tools/binman/etype/section.py | 12 | ||||
-rw-r--r-- | tools/binman/ftest.py | 14 | ||||
-rw-r--r-- | tools/binman/image.py | 3 | ||||
-rw-r--r-- | tools/binman/test/261_section_fname.dts | 29 |
5 files changed, 59 insertions, 4 deletions
diff --git a/tools/binman/binman.rst b/tools/binman/binman.rst index 69e4b00..2899e1c 100644 --- a/tools/binman/binman.rst +++ b/tools/binman/binman.rst @@ -836,6 +836,11 @@ name-prefix: renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to distinguish binaries with otherwise identical names. +filename: + This allows the contents of the section to be written to a file in the + output directory. This can sometimes be useful to use the data in one + section in different image, since there is currently no way to share data + beteen images other than through files. Image Properties ---------------- diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py index da561e2..305155c 100644 --- a/tools/binman/etype/section.py +++ b/tools/binman/etype/section.py @@ -144,6 +144,10 @@ class Entry_section(Entry): be written at offset 4 in the image file, since the first 16 bytes are skipped when writing. + filename + filename to write the unpadded section contents to within the output + directory (None to skip this). + Since a section is also an entry, it inherits all the properies of entries too. @@ -163,6 +167,7 @@ class Entry_section(Entry): self._skip_at_start = None self._end_4gb = False self._ignore_missing = False + self._filename = None def ReadNode(self): """Read properties from the section node""" @@ -183,6 +188,8 @@ class Entry_section(Entry): self._skip_at_start = 0 self._name_prefix = fdt_util.GetString(self._node, 'name-prefix') self.align_default = fdt_util.GetInt(self._node, 'align-default', 0) + self._filename = fdt_util.GetString(self._node, 'filename', + self._filename) self.ReadEntries() @@ -348,7 +355,8 @@ class Entry_section(Entry): """Get the contents of an entry This builds the contents of the section, stores this as the contents of - the section and returns it + the section and returns it. If the section has a filename, the data is + written there also. Args: required: True if the data must be present, False if it is OK to @@ -363,6 +371,8 @@ class Entry_section(Entry): if data is None: return None self.SetContents(data) + if self._filename: + tools.write_file(tools.get_output_filename(self._filename), data) return data def GetOffsets(self): diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 62ee86b..c3cb32d 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -6077,5 +6077,19 @@ fdt fdtmap Extract the devicetree blob from the fdtmap 'Cannot write symbols to an ELF file without Python elftools', str(exc.exception)) + def testSectionFilename(self): + """Check writing of section contents to a file""" + data = self._DoReadFile('261_section_fname.dts') + expected = (b'&&' + U_BOOT_DATA + b'&&&' + + tools.get_bytes(ord('!'), 7) + + U_BOOT_DATA + tools.get_bytes(ord('&'), 12)) + self.assertEqual(expected, data) + + sect_fname = tools.get_output_filename('outfile.bin') + self.assertTrue(os.path.exists(sect_fname)) + sect_data = tools.read_file(sect_fname) + self.assertEqual(U_BOOT_DATA, sect_data) + + if __name__ == "__main__": unittest.main() diff --git a/tools/binman/image.py b/tools/binman/image.py index 6d4bff5..b84dd21 100644 --- a/tools/binman/image.py +++ b/tools/binman/image.py @@ -94,9 +94,6 @@ class Image(section.Entry_section): def ReadNode(self): super().ReadNode() - filename = fdt_util.GetString(self._node, 'filename') - if filename: - self._filename = filename self.allow_repack = fdt_util.GetBool(self._node, 'allow-repack') self._symlink = fdt_util.GetString(self._node, 'symlink') diff --git a/tools/binman/test/261_section_fname.dts b/tools/binman/test/261_section_fname.dts new file mode 100644 index 0000000..790381e --- /dev/null +++ b/tools/binman/test/261_section_fname.dts @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + binman { + pad-byte = <0x26>; + size = <0x20>; + section@0 { + size = <0x10>; + pad-byte = <0x21>; + pad-before = <2>; + pad-after = <3>; + + section { + filename = "outfile.bin"; + u-boot { + }; + }; + }; + section@1 { + u-boot { + }; + }; + }; +}; |