From d8c2c7c483dda2505315f8f189eecd8b264fbb5b Mon Sep 17 00:00:00 2001 From: Brendan Le Foll Date: Tue, 29 Sep 2015 14:19:42 +0100 Subject: [PATCH] iio: Find attributes and channels in iio device Signed-off-by: Brendan Le Foll --- api/mraa/iio.h | 8 +++-- examples/iio_driver.c | 5 ++- include/mraa_internal_types.h | 4 ++- src/iio/iio.c | 71 ++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 79 insertions(+), 9 deletions(-) diff --git a/api/mraa/iio.h b/api/mraa/iio.h index 5bfb9ab..4811916 100644 --- a/api/mraa/iio.h +++ b/api/mraa/iio.h @@ -61,14 +61,18 @@ mraa_iio_context mraa_iio_init(int device); */ int mraa_iio_get_channel_count(mraa_iio_context dev); +int mraa_iio_get_attr_count(mraa_iio_context dev, int channel); + +const char* mraa_iio_get_device_name(mraa_iio_context dev); + /** */ -mraa_result_t mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* data); +mraa_result_t mraa_iio_read(mraa_iio_context dev, const char* attribute, float* data); /** * */ -mraa_result_t mraa_iio_write(mraa_iio_context dev, int channel, const char* attribute); +mraa_result_t mraa_iio_write(mraa_iio_context dev, const char* attribute); /** * De-inits an mraa_iio_context device diff --git a/examples/iio_driver.c b/examples/iio_driver.c index eb9cedd..3519f45 100644 --- a/examples/iio_driver.c +++ b/examples/iio_driver.c @@ -37,7 +37,10 @@ main() } float iio_value; - mraa_result_t ret = mraa_iio_read(iio_device0, 0, "raw", &iio_value); + fprintf(stdout, "IIO device has %d channels and %d attributes\n", + mraa_iio_get_channel_count(iio_device0), + mraa_iio_get_attr_count(iio_device0, 0)); + mraa_result_t ret = mraa_iio_read(iio_device0, "in_voltage0_raw", &iio_value); if (ret == MRAA_SUCCESS) { fprintf(stdout, "IIO read %f\n", iio_value); } diff --git a/include/mraa_internal_types.h b/include/mraa_internal_types.h index b5a495c..06bc7d8 100644 --- a/include/mraa_internal_types.h +++ b/include/mraa_internal_types.h @@ -130,11 +130,13 @@ struct _uart { }; /** - * A structure reprensting an IIO device + * A structure representing an IIO device */ struct _iio { int num; /**< IIO device number */ char* name; /**< IIO device name */ + int channum; + int attrnum; }; /** diff --git a/src/iio/iio.c b/src/iio/iio.c index 982a5dd..3bf100d 100644 --- a/src/iio/iio.c +++ b/src/iio/iio.c @@ -24,6 +24,10 @@ #include "iio.h" #include "mraa_internal.h" +#include "dirent.h" +#include + +#define IIO_SYSFS_DEVICE "/sys/bus/iio/devices/iio:device" mraa_iio_context mraa_iio_init(int device) @@ -31,20 +35,77 @@ mraa_iio_init(int device) if (device > plat->iio_device_count) { return NULL; } - return &plat->iio_devices[device]; + + mraa_iio_context dev = &plat->iio_devices[device]; + + char* buf; + char sep[] = "_"; + char* splitbuf; + DIR* dir; + struct dirent *ent; + if ((dir = opendir (IIO_SYSFS_DEVICE "0/")) != NULL) { + while ((ent = readdir (dir)) != NULL) { + if (strlen(ent->d_name) > 3) { + if (strncmp(ent->d_name, "in_", 3) == 0) { + dev->attrnum++; + buf = strndup(&ent->d_name[3], 64); + splitbuf = strsep(&buf, sep); + if (buf == NULL) { + return NULL; + } + int num = atoi(&splitbuf[strlen(splitbuf)-1]); + if (dev->channum < num) { + dev->channum = num; + } + free(splitbuf); + } + else if (strncmp(ent->d_name, "out_", 4) == 0) { + dev->attrnum++; + } + } + } + closedir (dir); + } else { + return NULL; + } + + return dev; +} + +// -1 is the device 'channel' +int +mraa_iio_get_attr_count(mraa_iio_context dev, int channel) +{ + // search is 0 indexed + return dev->attrnum + 1; } int mraa_iio_get_channel_count(mraa_iio_context dev) { - return 1; + // search is 0 indexed + return dev->channum + 1; +} + +const char* +mraa_iio_get_device_name(mraa_iio_context dev) +{ + return dev->name; +} + +#if 0 +mraa_result_t +mraa_iio_get_attr_data(mraa_iio_context dev, mraa_iio_channel* chan) +{ + return MRAA_FEATURE_NOT_IMPLEMENTED; } +#endif mraa_result_t -mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* data) +mraa_iio_read(mraa_iio_context dev, const char* attribute, float* data) { char buf[64]; - snprintf(buf, 64, "/sys/bus/iio/devices/iio:device%d/in_voltage%d_%s", dev->num, channel, attribute); + snprintf(buf, 64, IIO_SYSFS_DEVICE, "%d/%s", dev->num, attribute); int fd = open(buf, O_RDONLY); if (fd != -1) { int len = read(fd, &buf, 64); @@ -55,7 +116,7 @@ mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* d } mraa_result_t -mraa_iio_write(mraa_iio_context dev, int channel, const char* attribute) +mraa_iio_write(mraa_iio_context dev, const char* attribute) { return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED; } -- 2.7.4