*/
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
}
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);
}
#include "iio.h"
#include "mraa_internal.h"
+#include "dirent.h"
+#include <string.h>
+
+#define IIO_SYSFS_DEVICE "/sys/bus/iio/devices/iio:device"
mraa_iio_context
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);
}
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;
}