mirror of https://gitlab.com/qemu-project/dtc.git
pylibfdt: Add functions to update properties
Allow updating and creating properties, including special methods for integers. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
5a598671fd
commit
9aafa33d99
|
@ -1345,10 +1345,13 @@ static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val)
|
||||||
fdt64_t tmp = cpu_to_fdt64(val);
|
fdt64_t tmp = cpu_to_fdt64(val);
|
||||||
return fdt_property(fdt, name, &tmp, sizeof(tmp));
|
return fdt_property(fdt, name, &tmp, sizeof(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SWIG /* Not available in Python */
|
||||||
static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
|
static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
|
||||||
{
|
{
|
||||||
return fdt_property_u32(fdt, name, val);
|
return fdt_property_u32(fdt, name, val);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fdt_property_placeholder - add a new property and return a ptr to its value
|
* fdt_property_placeholder - add a new property and return a ptr to its value
|
||||||
|
|
|
@ -528,6 +528,60 @@ class Fdt:
|
||||||
"""
|
"""
|
||||||
return check_err(fdt_parent_offset(self._fdt, nodeoffset), quiet)
|
return check_err(fdt_parent_offset(self._fdt, nodeoffset), quiet)
|
||||||
|
|
||||||
|
def setprop(self, nodeoffset, prop_name, val, quiet=()):
|
||||||
|
"""Set the value of a property
|
||||||
|
|
||||||
|
Args:
|
||||||
|
nodeoffset: Node offset containing the property to create/update
|
||||||
|
prop_name: Name of property
|
||||||
|
val: Value to write (string or bytearray)
|
||||||
|
quiet: Errors to ignore (empty to raise on all errors)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Error code, or 0 if OK
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FdtException if no parent found or other error occurs
|
||||||
|
"""
|
||||||
|
return check_err(fdt_setprop(self._fdt, nodeoffset, prop_name, val,
|
||||||
|
len(val)), quiet)
|
||||||
|
|
||||||
|
def setprop_u32(self, nodeoffset, prop_name, val, quiet=()):
|
||||||
|
"""Set the value of a property
|
||||||
|
|
||||||
|
Args:
|
||||||
|
nodeoffset: Node offset containing the property to create/update
|
||||||
|
prop_name: Name of property
|
||||||
|
val: Value to write (integer)
|
||||||
|
quiet: Errors to ignore (empty to raise on all errors)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Error code, or 0 if OK
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FdtException if no parent found or other error occurs
|
||||||
|
"""
|
||||||
|
return check_err(fdt_setprop_u32(self._fdt, nodeoffset, prop_name, val),
|
||||||
|
quiet)
|
||||||
|
|
||||||
|
def setprop_u64(self, nodeoffset, prop_name, val, quiet=()):
|
||||||
|
"""Set the value of a property
|
||||||
|
|
||||||
|
Args:
|
||||||
|
nodeoffset: Node offset containing the property to create/update
|
||||||
|
prop_name: Name of property
|
||||||
|
val: Value to write (integer)
|
||||||
|
quiet: Errors to ignore (empty to raise on all errors)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Error code, or 0 if OK
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FdtException if no parent found or other error occurs
|
||||||
|
"""
|
||||||
|
return check_err(fdt_setprop_u64(self._fdt, nodeoffset, prop_name, val),
|
||||||
|
quiet)
|
||||||
|
|
||||||
def delprop(self, nodeoffset, prop_name):
|
def delprop(self, nodeoffset, prop_name):
|
||||||
"""Delete a property from a node
|
"""Delete a property from a node
|
||||||
|
|
||||||
|
@ -625,6 +679,11 @@ typedef int fdt32_t;
|
||||||
$result = Py_BuildValue("s#", $1, *arg4);
|
$result = Py_BuildValue("s#", $1, *arg4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* typemap used for fdt_setprop() */
|
||||||
|
%typemap(in) (const void *val) {
|
||||||
|
$1 = PyString_AsString($input); /* char *str */
|
||||||
|
}
|
||||||
|
|
||||||
/* typemaps used for fdt_next_node() */
|
/* typemaps used for fdt_next_node() */
|
||||||
%typemap(in, numinputs=1) int *depth (int depth) {
|
%typemap(in, numinputs=1) int *depth (int depth) {
|
||||||
depth = (int) PyInt_AsLong($input);
|
depth = (int) PyInt_AsLong($input);
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
import struct
|
||||||
import sys
|
import sys
|
||||||
import types
|
import types
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -57,6 +58,18 @@ sys.path.insert(0, '../pylibfdt')
|
||||||
import libfdt
|
import libfdt
|
||||||
from libfdt import Fdt, FdtException, QUIET_NOTFOUND, QUIET_ALL
|
from libfdt import Fdt, FdtException, QUIET_NOTFOUND, QUIET_ALL
|
||||||
|
|
||||||
|
small_size = 160
|
||||||
|
full_size = 1024
|
||||||
|
|
||||||
|
TEST_VALUE_1 = 0xdeadbeef
|
||||||
|
|
||||||
|
TEST_VALUE64_1H = 0xdeadbeef
|
||||||
|
TEST_VALUE64_1L = 0x01abcdef
|
||||||
|
TEST_VALUE64_1 = (TEST_VALUE64_1H << 32) | TEST_VALUE64_1L
|
||||||
|
|
||||||
|
TEST_STRING_1 = 'hello world'
|
||||||
|
|
||||||
|
|
||||||
def get_err(err_code):
|
def get_err(err_code):
|
||||||
"""Convert an error code into an error message
|
"""Convert an error code into an error message
|
||||||
|
|
||||||
|
@ -380,6 +393,41 @@ class PyLibfdtTests(unittest.TestCase):
|
||||||
fdt.pack()
|
fdt.pack()
|
||||||
self.assertTrue(fdt.totalsize() < 128)
|
self.assertTrue(fdt.totalsize() < 128)
|
||||||
|
|
||||||
|
def testSetProp(self):
|
||||||
|
"""Test that we can update and create properties"""
|
||||||
|
node = self.fdt.path_offset('/subnode@1')
|
||||||
|
self.fdt.setprop(node, 'compatible', TEST_STRING_1)
|
||||||
|
self.assertEquals(TEST_STRING_1, self.fdt.getprop(node, 'compatible'))
|
||||||
|
|
||||||
|
# Check that this property is missing, and that we don't have space to
|
||||||
|
# add it
|
||||||
|
self.assertEquals(-libfdt.NOTFOUND,
|
||||||
|
self.fdt.getprop(node, 'missing', QUIET_NOTFOUND))
|
||||||
|
self.assertEquals(-libfdt.NOSPACE,
|
||||||
|
self.fdt.setprop(node, 'missing', TEST_STRING_1,
|
||||||
|
quiet=(libfdt.NOSPACE,)))
|
||||||
|
|
||||||
|
# Expand the device tree so we now have room
|
||||||
|
self.fdt.resize(self.fdt.totalsize() + 50)
|
||||||
|
self.fdt.setprop(node, 'missing', TEST_STRING_1)
|
||||||
|
self.assertEquals(TEST_STRING_1, self.fdt.getprop(node, 'missing'))
|
||||||
|
|
||||||
|
def testSetPropU32(self):
|
||||||
|
"""Test that we can update and create integer properties"""
|
||||||
|
node = 0
|
||||||
|
prop = 'prop-int'
|
||||||
|
self.fdt.setprop_u32(node, prop, TEST_VALUE_1)
|
||||||
|
self.assertEquals(struct.pack('>I', TEST_VALUE_1),
|
||||||
|
self.fdt.getprop(node, prop))
|
||||||
|
|
||||||
|
def testSetPropU64(self):
|
||||||
|
"""Test that we can update and create integer properties"""
|
||||||
|
node = 0
|
||||||
|
prop = 'prop-int64'
|
||||||
|
self.fdt.setprop_u64(node, prop, TEST_VALUE64_1)
|
||||||
|
self.assertEquals(struct.pack('>Q', TEST_VALUE64_1),
|
||||||
|
self.fdt.getprop(node, prop))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue