From: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: Devicetree Compiler
<devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Cc: David Gibson
<david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>,
Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Subject: [PATCH v2 2/2] pylibfdt: Allow reading integer values from properties
Date: Thu, 31 Aug 2017 04:42:00 -0600 [thread overview]
Message-ID: <20170831104200.47974-2-sjg@chromium.org> (raw)
In-Reply-To: <20170831104200.47974-1-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Extend the Properties class with some functions to read a single integer
property. Add a new getprop_obj() function to return a Property object
instead of the raw data.
This suggested approach can be extended to handle other types, as well as
arrays.
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
Changes in v2: None
pylibfdt/libfdt.i | 35 +++++++++++++++++++++++++++++++++++
tests/pylibfdt_tests.py | 12 ++++++++++++
tests/run_tests.sh | 1 +
tests/test_props.dts | 11 +++++++++++
4 files changed, 59 insertions(+)
create mode 100644 tests/test_props.dts
diff --git a/pylibfdt/libfdt.i b/pylibfdt/libfdt.i
index f8e3a2c..4d60f90 100644
--- a/pylibfdt/libfdt.i
+++ b/pylibfdt/libfdt.i
@@ -376,6 +376,26 @@ class Fdt:
return pdata
return bytearray(pdata[0])
+ def getprop_obj(self, nodeoffset, prop_name, quiet=()):
+ """Get a property from a node as a Property object
+
+ Args:
+ nodeoffset: Node offset containing property to get
+ prop_name: Name of property to get
+ quiet: Errors to ignore (empty to raise on all errors)
+
+ Returns:
+ Property object, or None if not found
+
+ Raises:
+ FdtError if any error occurs (e.g. the property is not found)
+ """
+ pdata = check_err_null(fdt_getprop(self._fdt, nodeoffset, prop_name),
+ quiet)
+ if isinstance(pdata, (int)):
+ return None
+ return Property(prop_name, bytearray(pdata[0]))
+
def get_phandle(self, nodeoffset):
"""Get the phandle of a node
@@ -432,6 +452,21 @@ class Property:
def __init__(self, name, value):
self.name = name
self.value = value
+
+ def to_cell(self, fmt):
+ return struct.unpack('>' + fmt, self.value)[0]
+
+ def to_uint32(self):
+ return self.to_cell('L')
+
+ def to_int32(self):
+ return self.to_cell('l')
+
+ def to_uint64(self):
+ return self.to_cell('Q')
+
+ def to_int64(self):
+ return self.to_cell('q')
%}
%rename(fdt_property) fdt_property_func;
diff --git a/tests/pylibfdt_tests.py b/tests/pylibfdt_tests.py
index 0ec0f38..fc5210b 100644
--- a/tests/pylibfdt_tests.py
+++ b/tests/pylibfdt_tests.py
@@ -89,6 +89,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
@@ -330,6 +331,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_obj(0, name)
+
+ def testGetIntProperties(self):
+ """Test that we can access properties as integers"""
+ self.assertEquals(0xdeadbeef, self.get_prop("prop-hex32").to_uint32())
+ self.assertEquals(123, self.get_prop("prop-uint32").to_uint32())
+ self.assertEquals(-2, self.get_prop("prop-int32").to_int32())
+ self.assertEquals(9223372036854775807,
+ self.get_prop("prop-uint64").to_uint64())
+ self.assertEquals(-2, self.get_prop("prop-int64").to_int64())
if __name__ == "__main__":
unittest.main()
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index fa7b2f7..441e773 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -809,6 +809,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>;
+};
--
2.14.1.581.gf28d330327-goog
next prev parent reply other threads:[~2017-08-31 10:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-31 10:41 [PATCH v2 1/2] pylibfdt: Add a method to access the device tree directly Simon Glass
[not found] ` <20170831104200.47974-1-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2017-08-31 10:42 ` Simon Glass [this message]
[not found] ` <20170831104200.47974-2-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2017-09-13 12:42 ` [PATCH v2 2/2] pylibfdt: Allow reading integer values from properties David Gibson
2017-09-10 6:43 ` [PATCH v2 1/2] pylibfdt: Add a method to access the device tree directly David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170831104200.47974-2-sjg@chromium.org \
--to=sjg-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
--cc=david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org \
--cc=devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).