From b4360206a4bc67404125b0478132aeaeea41683f Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 27 May 2017 07:38:22 -0600 Subject: fdt: Support use of the new python libfdt library Use the new library if available, while retaining backwards compatibility with the old library for now. Signed-off-by: Simon Glass diff --git a/tools/binman/binman.py b/tools/binman/binman.py index 857d698..95d3a048 100755 --- a/tools/binman/binman.py +++ b/tools/binman/binman.py @@ -21,6 +21,9 @@ sys.path.append(os.path.join(our_path, '../patman')) sys.path.append(os.path.join(our_path, '../dtoc')) sys.path.append(os.path.join(our_path, '../')) +# Bring in the libfdt module +sys.path.append('tools') + # Also allow entry-type modules to be brought in from the etype directory. sys.path.append(os.path.join(our_path, 'etype')) diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py index 816fdbe..c40b9b6 100644 --- a/tools/dtoc/fdt.py +++ b/tools/dtoc/fdt.py @@ -96,6 +96,7 @@ class PropBase: TYPE_INT: a byte-swapped integer stored as a 4-byte string TYPE_BYTE: a byte stored as a single-byte string """ + bytes = str(bytes) size = len(bytes) strings = bytes.split('\0') is_string = True diff --git a/tools/dtoc/fdt_normal.py b/tools/dtoc/fdt_normal.py index 17b0a9a..e793f49 100644 --- a/tools/dtoc/fdt_normal.py +++ b/tools/dtoc/fdt_normal.py @@ -12,7 +12,13 @@ import sys import fdt from fdt import Fdt, NodeBase, PropBase import fdt_util -import libfdt_legacy as libfdt +try: + import libfdt + legacy = False +except ImportError: + import libfdt_legacy as libfdt + legacy = True + # This deals with a device tree, presenting it as a list of Node and Prop # objects, representing nodes and properties, respectively. @@ -36,7 +42,7 @@ class Prop(PropBase): """ def __init__(self, node, offset, name, bytes): PropBase.__init__(self, node, offset, name) - self.bytes = bytes + self.bytes = str(bytes) if not bytes: self.type = fdt.TYPE_BOOL self.value = True @@ -86,7 +92,10 @@ class Node(NodeBase): offset = libfdt.fdt_first_subnode(self._fdt.GetFdt(), self.Offset()) while offset >= 0: sep = '' if self.path[-1] == '/' else '/' - name = libfdt.Name(self._fdt.GetFdt(), offset) + if legacy: + name = libfdt.Name(self._fdt.GetFdt(), offset) + else: + name = self._fdt._fdt_obj.get_name(offset) path = self.path + sep + name node = Node(self._fdt, offset, name, path) self.subnodes.append(node) @@ -139,6 +148,8 @@ class FdtNormal(Fdt): with open(self._fname) as fd: self._fdt = bytearray(fd.read()) + if not legacy: + self._fdt_obj = libfdt.Fdt(self._fdt) def GetFdt(self): """Get the contents of the FDT @@ -175,12 +186,18 @@ class FdtNormal(Fdt): props_dict = {} poffset = libfdt.fdt_first_property_offset(self._fdt, node._offset) while poffset >= 0: - dprop, plen = libfdt.fdt_get_property_by_offset(self._fdt, poffset) - prop = Prop(node, poffset, libfdt.String(self._fdt, dprop.nameoff), - libfdt.Data(dprop)) - props_dict[prop.name] = prop - - poffset = libfdt.fdt_next_property_offset(self._fdt, poffset) + if legacy: + dprop, plen = libfdt.fdt_get_property_by_offset(self._fdt, + poffset) + prop = Prop(node, poffset, + libfdt.String(self._fdt, dprop.nameoff), + libfdt.Data(dprop)) + else: + p = self._fdt_obj.get_property_by_offset(poffset) + prop = Prop(node, poffset, p.name, p.value) + props_dict[prop.name] = prop + + poffset = libfdt.fdt_next_property_offset(self._fdt, poffset) return props_dict def Invalidate(self): -- cgit v0.10.2