scripts/assemble: Rework to use EDT library to get devicetree data
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
diff --git a/scripts/assemble.py b/scripts/assemble.py
index d8c824b..e895ee7 100755
--- a/scripts/assemble.py
+++ b/scripts/assemble.py
@@ -23,6 +23,14 @@
import io
import re
import os.path
+import sys
+
+ZEPHYR_BASE = os.getenv("ZEPHYR_BASE")
+if not ZEPHYR_BASE:
+ sys.exit("$ZEPHYR_BASE environment variable undefined")
+
+sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts", "dts"))
+import edtlib
def same_keys(a, b):
"""Determine if the dicts a and b have the same keys in them"""
@@ -38,8 +46,8 @@
size_re = re.compile(r"^#define DT_FLASH_AREA_([0-9A-Z_]+)_SIZE(_0)?\s+(0x[0-9a-fA-F]+|[0-9]+)$")
class Assembly():
- def __init__(self, output, bootdir):
- self.find_slots(bootdir)
+ def __init__(self, output, bootdir, edt):
+ self.find_slots(edt)
try:
os.unlink(output)
except OSError as e:
@@ -47,29 +55,29 @@
raise
self.output = output
- def find_slots(self, bootdir):
+ def find_slots(self, edt):
offsets = {}
sizes = {}
- with open(os.path.join(bootdir, 'zephyr', 'include', 'generated', 'devicetree_legacy_unfixed.h'), 'r') as fd:
- for line in fd:
- m = offset_re.match(line)
- if m is not None:
- offsets[m.group(1)] = int(m.group(3), 0)
- m = size_re.match(line)
- if m is not None:
- sizes[m.group(1)] = int(m.group(3), 0)
+
+ part_nodes = edt.compat2nodes["fixed-partitions"]
+ for node in part_nodes:
+ for child in node.children.values():
+ if "label" in child.props:
+ label = child.props["label"].val
+ offsets[label] = child.regs[0].addr
+ sizes[label] = child.regs[0].size
if not same_keys(offsets, sizes):
raise Exception("Inconsistent data in devicetree.h")
- # We care about the MCUBOOT, IMAGE_0, and IMAGE_1 partitions.
- if 'MCUBOOT' not in offsets:
+ # We care about the mcuboot, image-0, and image-1 partitions.
+ if 'mcuboot' not in offsets:
raise Exception("Board partition table does not have mcuboot partition")
- if 'IMAGE_0' not in offsets:
+ if 'image-0' not in offsets:
raise Exception("Board partition table does not have image-0 partition")
- if 'IMAGE_1' not in offsets:
+ if 'image-1' not in offsets:
raise Exception("Board partition table does not have image-1 partition")
self.offsets = offsets
@@ -103,12 +111,21 @@
help='Filename to write full image to')
args = parser.parse_args()
- output = Assembly(args.output, args.bootdir)
- output.add_image(os.path.join(args.bootdir, 'zephyr', 'zephyr.bin'), 'MCUBOOT')
- output.add_image(args.primary, "IMAGE_0")
+ # Extract board name from path
+ board = os.path.split(os.path.split(args.bootdir)[0])[1]
+
+ dts_path = os.path.join(args.bootdir, "zephyr", board + ".dts.pre.tmp")
+
+ edt = edtlib.EDT(dts_path, [os.path.join(ZEPHYR_BASE, "dts", "bindings")],
+ warn_reg_unit_address_mismatch=False)
+
+ output = Assembly(args.output, args.bootdir, edt)
+
+ output.add_image(os.path.join(args.bootdir, 'zephyr', 'zephyr.bin'), 'mcuboot')
+ output.add_image(args.primary, "image-0")
if args.secondary is not None:
- output.add_image(args.secondary, "IMAGE_1")
+ output.add_image(args.secondary, "image-1")
if __name__ == '__main__':
main()