summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGUI <[email protected]>2024-11-21 20:44:25 +0800
committerGitHub <[email protected]>2024-11-21 20:44:25 +0800
commitf797eccbf1d084262b547a9bcba13ec006aed445 (patch)
treea3abd9c8a493bc7fe3a8b65faa5fb177f327ca1b
parent4a3fa385cb4e1e08141da230fe9095da284b9841 (diff)
[DM/FEATURE] Support IIO (Industrial I/O) (#9598)
[DM/FEATURE] Support IIO (Industrial I/O) Signed-off-by: GuEe-GUI <[email protected]>
-rwxr-xr-xcomponents/drivers/iio/SConscript15
-rw-r--r--components/drivers/iio/iio.c71
-rw-r--r--components/drivers/include/drivers/iio.h17
-rw-r--r--components/drivers/include/rtdevice.h2
4 files changed, 105 insertions, 0 deletions
diff --git a/components/drivers/iio/SConscript b/components/drivers/iio/SConscript
new file mode 100755
index 0000000000..577dab2af7
--- /dev/null
+++ b/components/drivers/iio/SConscript
@@ -0,0 +1,15 @@
+from building import *
+
+group = []
+
+if not GetDepend(['RT_USING_DM']):
+ Return('group')
+
+cwd = GetCurrentDir()
+CPPPATH = [cwd + '/../include']
+
+src = ['iio.c',]
+
+group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/drivers/iio/iio.c b/components/drivers/iio/iio.c
new file mode 100644
index 0000000000..548308dbe6
--- /dev/null
+++ b/components/drivers/iio/iio.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2022-3-08 GuEe-GUI the first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+static void *ofw_iio_channel_get_by_index(struct rt_ofw_node *np, int index, int *out_channel)
+{
+ void *iio = RT_NULL;
+#ifdef RT_USING_OFW
+ struct rt_ofw_node *iio_np;
+ struct rt_ofw_cell_args iio_args;
+
+ if (!rt_ofw_parse_phandle_cells(np, "io-channels", "#io-channel-cells", index, &iio_args))
+ {
+ iio_np = iio_args.data;
+
+ if (!rt_ofw_data(iio_np))
+ {
+ rt_platform_ofw_request(iio_np);
+ }
+
+ iio = rt_ofw_data(iio_np);
+ rt_ofw_node_put(iio_np);
+
+ if (out_channel)
+ {
+ *out_channel = iio_args.args[0];
+ }
+ }
+#endif /* RT_USING_OFW */
+ return iio;
+}
+
+void *rt_iio_channel_get_by_index(struct rt_device *dev, int index, int *out_channel)
+{
+ void *iio = RT_NULL;
+
+ if (!dev || index < 0)
+ {
+ return RT_NULL;
+ }
+
+ if (dev->ofw_node)
+ {
+ iio = ofw_iio_channel_get_by_index(dev->ofw_node, index, out_channel);
+ }
+
+ return iio;
+}
+
+void *rt_iio_channel_get_by_name(struct rt_device *dev, const char *name, int *out_channel)
+{
+ int index;
+
+ if (!dev || !name)
+ {
+ return RT_NULL;
+ }
+
+ index = rt_dm_dev_prop_index_of_string(dev, "io-channel-names", name);
+
+ return rt_iio_channel_get_by_index(dev, index, out_channel);
+}
diff --git a/components/drivers/include/drivers/iio.h b/components/drivers/include/drivers/iio.h
new file mode 100644
index 0000000000..c69f507ea8
--- /dev/null
+++ b/components/drivers/include/drivers/iio.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2022-3-08 GuEe-GUI the first version
+ */
+
+#ifndef __IIO_H__
+#define __IIO_H__
+
+void *rt_iio_channel_get_by_index(struct rt_device *dev, int index, int *out_channel);
+void *rt_iio_channel_get_by_name(struct rt_device *dev, const char *name, int *out_channel);
+
+#endif /* __IIO_H__ */
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index 21ad8cb2a6..ff7a17734f 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -49,6 +49,8 @@ extern "C" {
#include "drivers/blk.h"
#endif
+#include "drivers/iio.h"
+
#ifdef RT_USING_OFW
#include "drivers/ofw.h"
#include "drivers/ofw_fdt.h"