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 +#include + +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"