|
@@ -337,6 +337,12 @@ class Node:
|
|
"""
|
|
"""
|
|
self.props[prop_name].SetInt(val)
|
|
self.props[prop_name].SetInt(val)
|
|
|
|
|
|
|
|
+ def AddSubnode(self, name):
|
|
|
|
+ path = self.path + '/' + name
|
|
|
|
+ subnode = Node(self._fdt, self, None, name, path)
|
|
|
|
+ self.subnodes.append(subnode)
|
|
|
|
+ return subnode
|
|
|
|
+
|
|
def Sync(self, auto_resize=False):
|
|
def Sync(self, auto_resize=False):
|
|
"""Sync node changes back to the device tree
|
|
"""Sync node changes back to the device tree
|
|
|
|
|
|
@@ -350,6 +356,20 @@ class Node:
|
|
Raises:
|
|
Raises:
|
|
FdtException if auto_resize is False and there is not enough space
|
|
FdtException if auto_resize is False and there is not enough space
|
|
"""
|
|
"""
|
|
|
|
+ if self._offset is None:
|
|
|
|
+ # The subnode doesn't exist yet, so add it
|
|
|
|
+ fdt_obj = self._fdt._fdt_obj
|
|
|
|
+ if auto_resize:
|
|
|
|
+ while True:
|
|
|
|
+ offset = fdt_obj.add_subnode(self.parent._offset, self.name,
|
|
|
|
+ (libfdt.NOSPACE,))
|
|
|
|
+ if offset != -libfdt.NOSPACE:
|
|
|
|
+ break
|
|
|
|
+ fdt_obj.resize(fdt_obj.totalsize() + 1024)
|
|
|
|
+ else:
|
|
|
|
+ offset = fdt_obj.add_subnode(self.parent._offset, self.name)
|
|
|
|
+ self._offset = offset
|
|
|
|
+
|
|
# Sync subnodes in reverse so that we don't disturb node offsets for
|
|
# Sync subnodes in reverse so that we don't disturb node offsets for
|
|
# nodes that are earlier in the DT. This avoids an O(n^2) rescan of
|
|
# nodes that are earlier in the DT. This avoids an O(n^2) rescan of
|
|
# node offsets.
|
|
# node offsets.
|