@ -53,15 +53,24 @@ class Node(NodeBase):
def __init__ ( self , fdt , offset , name , path ) :
NodeBase . __init__ ( self , fdt , offset , name , path )
def Offset ( self ) :
""" Returns the offset of a node, after checking the cache
This should be used instead of self . _offset directly , to ensure that
the cache does not contain invalid offsets .
"""
self . _fdt . CheckCache ( )
return self . _offset
def Scan ( self ) :
""" Scan a node ' s properties and subnodes
This fills in the props and subnodes properties , recursively
searching into subnodes so that the entire tree is built .
"""
self . props = self . _fdt . GetProps ( self . path )
self . props = self . _fdt . GetProps ( self , self . path )
offset = libfdt . fdt_first_subnode ( self . _fdt . GetFdt ( ) , self . _offset )
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 )
@ -72,6 +81,19 @@ class Node(NodeBase):
node . Scan ( )
offset = libfdt . fdt_next_subnode ( self . _fdt . GetFdt ( ) , offset )
def Refresh ( self , my_offset ) :
""" Fix up the _offset for each node, recursively
Note : This does not take account of property offsets - these will not
be updated .
"""
if self . _offset != my_offset :
#print '%s: %d -> %d\n' % (self.path, self._offset, my_offset)
self . _offset = my_offset
offset = libfdt . fdt_first_subnode ( self . _fdt . GetFdt ( ) , self . _offset )
for subnode in self . subnodes :
subnode . Refresh ( offset )
offset = libfdt . fdt_next_subnode ( self . _fdt . GetFdt ( ) , offset )
class FdtNormal ( Fdt ) :
""" Provides simple access to a flat device tree blob using libfdt.
@ -83,6 +105,7 @@ class FdtNormal(Fdt):
"""
def __init__ ( self , fname ) :
Fdt . __init__ ( self , fname )
self . _cached_offsets = False
if self . _fname :
self . _fname = fdt_util . EnsureCompiled ( self . _fname )
@ -97,7 +120,7 @@ class FdtNormal(Fdt):
"""
return self . _fdt
def GetProps ( self , node ) :
def GetProps ( self , node , path ) :
""" Get all properties from a node.
Args :
@ -110,7 +133,7 @@ class FdtNormal(Fdt):
Raises :
ValueError : if the node does not exist .
"""
offset = libfdt . fdt_path_offset ( self . _fdt , node )
offset = libfdt . fdt_path_offset ( self . _fdt , path )
if offset < 0 :
libfdt . Raise ( offset )
props_dict = { }
@ -124,6 +147,21 @@ class FdtNormal(Fdt):
poffset = libfdt . fdt_next_property_offset ( self . _fdt , poffset )
return props_dict
def Invalidate ( self ) :
""" Mark our offset cache as invalid """
self . _cached_offsets = False
def CheckCache ( self ) :
""" Refresh the offset cache if needed """
if self . _cached_offsets :
return
self . Refresh ( )
self . _cached_offsets = True
def Refresh ( self ) :
""" Refresh the offset cache """
self . _root . Refresh ( 0 )
@classmethod
def Node ( self , fdt , offset , name , path ) :
""" Create a new node