diff options
author | Simon Glass <sjg@chromium.org> | 2016-07-25 18:59:10 -0600 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2016-09-18 21:04:39 -0600 |
commit | 355c67c35a8ce5aa9e9e2e2e8df99413c8215093 (patch) | |
tree | 3dcdace42cd5f60bfd5c24b200b89f8eb12836f2 /tools | |
parent | 0faf6144fd1f6443a52abb0d80a6ca1238ecc029 (diff) |
dtoc: Allow the device tree to be compiled from source
If a source device tree is provide to the Fdt() constructors, compile it
automatically. This will be used in tests, where we want to build a
particular test .dts file and check that it works correctly in binman.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dtoc/fdt_fallback.py | 2 | ||||
-rw-r--r-- | tools/dtoc/fdt_normal.py | 7 | ||||
-rw-r--r-- | tools/dtoc/fdt_util.py | 41 |
3 files changed, 48 insertions, 2 deletions
diff --git a/tools/dtoc/fdt_fallback.py b/tools/dtoc/fdt_fallback.py index 5b0f2a181b7..f76f42a1016 100644 --- a/tools/dtoc/fdt_fallback.py +++ b/tools/dtoc/fdt_fallback.py @@ -80,6 +80,8 @@ class FdtFallback(Fdt): def __init__(self, fname): Fdt.__init__(self, fname) + if self._fname: + self._fname = fdt_util.EnsureCompiled(self._fname) def GetSubNodes(self, node): """Returns a list of sub-nodes of a given node diff --git a/tools/dtoc/fdt_normal.py b/tools/dtoc/fdt_normal.py index 861f60c7d04..d9ba4aca80a 100644 --- a/tools/dtoc/fdt_normal.py +++ b/tools/dtoc/fdt_normal.py @@ -83,8 +83,11 @@ class FdtNormal(Fdt): """ def __init__(self, fname): Fdt.__init__(self, fname) - with open(self._fname) as fd: - self._fdt = fd.read() + if self._fname: + self._fname = fdt_util.EnsureCompiled(self._fname) + + with open(self._fname) as fd: + self._fdt = fd.read() def GetFdt(self): """Get the contents of the FDT diff --git a/tools/dtoc/fdt_util.py b/tools/dtoc/fdt_util.py index 6b572483e7f..3e25a8b980e 100644 --- a/tools/dtoc/fdt_util.py +++ b/tools/dtoc/fdt_util.py @@ -6,7 +6,12 @@ # SPDX-License-Identifier: GPL-2.0+ # +import os import struct +import tempfile + +import command +import tools def fdt32_to_cpu(val): """Convert a device tree cell to an integer @@ -18,3 +23,39 @@ def fdt32_to_cpu(val): A native-endian integer value """ return struct.unpack(">I", val)[0] + +def EnsureCompiled(fname): + """Compile an fdt .dts source file into a .dtb binary blob if needed. + + Args: + fname: Filename (if .dts it will be compiled). It not it will be + left alone + + Returns: + Filename of resulting .dtb file + """ + _, ext = os.path.splitext(fname) + if ext != '.dts': + return fname + + dts_input = tools.GetOutputFilename('source.dts') + dtb_output = tools.GetOutputFilename('source.dtb') + + search_paths = [os.path.join(os.getcwd(), 'include')] + root, _ = os.path.splitext(fname) + args = ['-E', '-P', '-x', 'assembler-with-cpp', '-D__ASSEMBLY__'] + args += ['-Ulinux'] + for path in search_paths: + args.extend(['-I', path]) + args += ['-o', dts_input, fname] + command.Run('cc', *args) + + # If we don't have a directory, put it in the tools tempdir + search_list = [] + for path in search_paths: + search_list.extend(['-i', path]) + args = ['-I', 'dts', '-o', dtb_output, '-O', 'dtb'] + args.extend(search_list) + args.append(dts_input) + command.Run('dtc', *args) + return dtb_output |