devicetree-compiler.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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).