Browse Source

pylibfdt: Support device-tree creation/expansion

Add support for fdt_open_into() and fdt_create_empty_tree() from the
Python library. The former is named resize() since it better fits with
what the Python binding actually does.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Simon Glass 7 years ago committed by David Gibson
parent
commit
5a598671fd
  1. 33
      pylibfdt/libfdt.i
  2. 18
      tests/pylibfdt_tests.py

33
pylibfdt/libfdt.i

@ -434,6 +434,39 @@ class Fdt: @@ -434,6 +434,39 @@ class Fdt:
return pdata
return Property(pdata[0], pdata[1])

@staticmethod
def create_empty_tree(size, quiet=()):
"""Create an empty device tree ready for use

Args:
size: Size of device tree in bytes

Returns:
Fdt object containing the device tree
"""
data = bytearray(size)
err = check_err(fdt_create_empty_tree(data, size), quiet)
if err:
return err
return Fdt(data)

def resize(self, size, quiet=()):
"""Move the device tree into a larger or smaller space

This creates a new device tree of size @size and moves the existing
device tree contents over to that. It can be used to create more space
in a device tree. Note that the Fdt object remains the same, but it
now has a new bytearray holding the contents.

Args:
size: Required new size of device tree in bytes
"""
fdt = bytearray(size)
err = check_err(fdt_open_into(self._fdt, fdt, size), quiet)
if err:
return err
self._fdt = fdt

def pack(self, quiet=()):
"""Pack the device tree to remove unused space


18
tests/pylibfdt_tests.py

@ -55,7 +55,7 @@ import unittest @@ -55,7 +55,7 @@ import unittest

sys.path.insert(0, '../pylibfdt')
import libfdt
from libfdt import FdtException, QUIET_NOTFOUND, QUIET_ALL
from libfdt import Fdt, FdtException, QUIET_NOTFOUND, QUIET_ALL

def get_err(err_code):
"""Convert an error code into an error message
@ -364,6 +364,22 @@ class PyLibfdtTests(unittest.TestCase): @@ -364,6 +364,22 @@ class PyLibfdtTests(unittest.TestCase):
self.fdt.get_mem_rsv(0))
self.assertEquals([123456789, 010000], self.fdt.get_mem_rsv(1))

def testEmpty(self):
"""Test that we can create an empty tree"""
self.assertEquals(-libfdt.NOSPACE,
Fdt.create_empty_tree(1, (libfdt.NOSPACE,)))
fdt = Fdt.create_empty_tree(128)
self.assertEquals(128, fdt.totalsize())

def testOpenInto(self):
"""Test that we can resize a tree"""
fdt = Fdt.create_empty_tree(128)
self.assertEquals(128, fdt.totalsize())
fdt.resize(256)
self.assertEquals(256, fdt.totalsize())
fdt.pack()
self.assertTrue(fdt.totalsize() < 128)


if __name__ == "__main__":
unittest.main()

Loading…
Cancel
Save