aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pylibfdt/libfdt.i22
-rw-r--r--tests/pylibfdt_tests.py12
-rwxr-xr-xtests/run_tests.sh1
-rw-r--r--tests/test_props.dts11
4 files changed, 43 insertions, 3 deletions
diff --git a/pylibfdt/libfdt.i b/pylibfdt/libfdt.i
index 520911e..adb4ee8 100644
--- a/pylibfdt/libfdt.i
+++ b/pylibfdt/libfdt.i
@@ -488,7 +488,9 @@ class Fdt:
quiet: Errors to ignore (empty to raise on all errors)
Returns:
- Value of property as a string of bytes, or -ve error number
+ Value of property as a Property object (which can be used as a
+ bytearray/string), or -ve error number. On failure, returns an
+ integer error
Raises:
FdtError if any error occurs (e.g. the property is not found)
@@ -497,8 +499,7 @@ class Fdt:
quiet)
if isinstance(pdata, (int)):
return pdata
- # Use bytes() rather than string(). This works on both Python 2 and 3
- return bytes(pdata[0])
+ return Property(prop_name, bytearray(pdata[0]))
def get_phandle(self, nodeoffset):
"""Get the phandle of a node
@@ -623,6 +624,21 @@ class Property(bytearray):
def __init__(self, name, value):
bytearray.__init__(self, value)
self.name = name
+
+ def as_cell(self, fmt):
+ return struct.unpack('>' + fmt, self)[0]
+
+ def as_uint32(self):
+ return self.as_cell('L')
+
+ def as_int32(self):
+ return self.as_cell('l')
+
+ def as_uint64(self):
+ return self.as_cell('Q')
+
+ def as_int64(self):
+ return self.as_cell('q')
%}
%rename(fdt_property) fdt_property_func;
diff --git a/tests/pylibfdt_tests.py b/tests/pylibfdt_tests.py
index f195a34..0467375 100644
--- a/tests/pylibfdt_tests.py
+++ b/tests/pylibfdt_tests.py
@@ -102,6 +102,7 @@ class PyLibfdtTests(unittest.TestCase):
def setUp(self):
"""Read in the device tree we use for testing"""
self.fdt = _ReadFdt('test_tree1.dtb')
+ self.fdt2 = _ReadFdt('test_props.dtb')
def GetPropList(self, node_path):
"""Read a list of properties from a node
@@ -368,6 +369,17 @@ class PyLibfdtTests(unittest.TestCase):
node2 = self.fdt.path_offset('/subnode@2/subsubnode@0')
self.assertEquals(node2, self.fdt.node_offset_by_phandle(0x2001))
+ def get_prop(self, name):
+ return self.fdt2.getprop(0, name)
+
+ def testGetIntProperties(self):
+ """Test that we can access properties as integers"""
+ self.assertEquals(0xdeadbeef, self.get_prop("prop-hex32").as_uint32())
+ self.assertEquals(123, self.get_prop("prop-uint32").as_uint32())
+ self.assertEquals(-2, self.get_prop("prop-int32").as_int32())
+ self.assertEquals(9223372036854775807,
+ self.get_prop("prop-uint64").as_uint64())
+ self.assertEquals(-2, self.get_prop("prop-int64").as_int64())
def testReserveMap(self):
"""Test that we can access the memory reserve map"""
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 28e528f..21b633e 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -888,6 +888,7 @@ fdtoverlay_tests() {
}
pylibfdt_tests () {
+ run_dtc_test -I dts -O dtb -o test_props.dtb test_props.dts
TMP=/tmp/tests.stderr.$$
python pylibfdt_tests.py -v 2> $TMP
diff --git a/tests/test_props.dts b/tests/test_props.dts
new file mode 100644
index 0000000..7e59bd1
--- /dev/null
+++ b/tests/test_props.dts
@@ -0,0 +1,11 @@
+/dts-v1/;
+
+/ {
+ compatible = "test_props";
+ prop-hex32 = <0xdeadbeef>;
+ prop-uint32 = <123>;
+ prop-int32 = <0xfffffffe>;
+ prop-hex64 = /bits/ 64 <0xdeadbeef01abcdef>;
+ prop-uint64 = /bits/ 64 <9223372036854775807>;
+ prop-int64 = /bits/ 64 <0xfffffffffffffffe>;
+};