From edb7f8a2155935ce5fa682ddd456f824ebe60b9e Mon Sep 17 00:00:00 2001 From: "Lay, Kuan Loon" Date: Wed, 4 Nov 2015 18:08:15 +0800 Subject: [PATCH] iio: iio consolidate read and write API Signed-off-by: Lay, Kuan Loon Signed-off-by: Brendan Le Foll --- api/mraa/iio.h | 39 ++++++++++-------- examples/iio_driver.c | 43 +++++++++++++++----- src/iio/iio.c | 109 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 124 insertions(+), 67 deletions(-) mode change 100755 => 100644 examples/iio_driver.c diff --git a/api/mraa/iio.h b/api/mraa/iio.h index f57471a..4f8aa73 100644 --- a/api/mraa/iio.h +++ b/api/mraa/iio.h @@ -42,8 +42,8 @@ typedef struct { } mraa_iio_channel; typedef struct { - char *name; - int enabled; + char* name; + int enabled; } mraa_iio_event; /** @@ -91,28 +91,35 @@ mraa_iio_channel* mraa_iio_get_channels(mraa_iio_context dev); int mraa_iio_get_channel_count(mraa_iio_context dev); -/** - */ -mraa_result_t mraa_iio_read(mraa_iio_context dev, const char* attribute, float* data); +mraa_result_t mraa_iio_read_float(mraa_iio_context dev, const char* filename, float* data); -/** - * - */ -mraa_result_t mraa_iio_write(mraa_iio_context dev, const char* attr_chan, const char* data); +mraa_result_t mraa_iio_read_integer(mraa_iio_context dev, const char* filename, int* data); -mraa_result_t mraa_iio_get_channel_data(mraa_iio_context dev); +mraa_result_t mraa_iio_read_string(mraa_iio_context dev, const char* filename, char* data); -mraa_result_t mraa_iio_get_event_data(mraa_iio_context dev); +mraa_result_t mraa_iio_write_float(mraa_iio_context dev, const char* attr_chan, const float data); -mraa_result_t mraa_iio_event_read(mraa_iio_context dev, const char* attribute, float* data); +mraa_result_t mraa_iio_write_integer(mraa_iio_context dev, const char* attr_chan, const int data); -mraa_result_t mraa_iio_event_write(mraa_iio_context dev, const char* attribute, const char* data); +mraa_result_t mraa_iio_write_string(mraa_iio_context dev, const char* attr_chan, const char* data); -mraa_result_t mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data); +mraa_result_t mraa_iio_get_channel_data(mraa_iio_context dev); -mraa_result_t mraa_iio_event_setup_callback(mraa_iio_context dev, void (*fptr)(struct iio_event_data* data), void* args); +mraa_result_t mraa_iio_get_event_data(mraa_iio_context dev); + +mraa_result_t mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data); -mraa_result_t mraa_iio_event_extract_event(struct iio_event_data* event, int* chan_type, int* modifier, int* type, int* direction, int* channel, int* channel2, int* different); +mraa_result_t +mraa_iio_event_setup_callback(mraa_iio_context dev, void (*fptr)(struct iio_event_data* data), void* args); + +mraa_result_t mraa_iio_event_extract_event(struct iio_event_data* event, + int* chan_type, + int* modifier, + int* type, + int* direction, + int* channel, + int* channel2, + int* different); /** * De-inits an mraa_iio_context device * diff --git a/examples/iio_driver.c b/examples/iio_driver.c old mode 100755 new mode 100644 index 5360171..a8369a9 --- a/examples/iio_driver.c +++ b/examples/iio_driver.c @@ -26,14 +26,14 @@ #include "mraa/iio.h" static void -printword(uint16_t input, mraa_iio_channel *chan) +printword(uint16_t input, mraa_iio_channel* chan) { int16_t res; if (!chan->lendian) { - input = be16toh(input); + input = be16toh(input); } else { - input = le16toh(input); + input = le16toh(input); } input >>= chan->shift; @@ -43,7 +43,7 @@ printword(uint16_t input, mraa_iio_channel *chan) } else { res = input; } - printf(" value = %05f\n", (float)res); + printf(" value = %05f\n", (float) res); } mraa_iio_context iio_device0; @@ -60,13 +60,14 @@ interrupt(char* data) printf("channel %d - bytes %d\n", channels[i].index, channels[i].bytes); switch (channels[i].bytes) { case 2: - printword(*(uint16_t *)(data + channels[i].location), &channels[i]); + printword(*(uint16_t*) (data + channels[i].location), &channels[i]); } } } } -void event_interrupt(struct iio_event_data* data) +void +event_interrupt(struct iio_event_data* data) { int chan_type; int modifier; @@ -77,7 +78,9 @@ void event_interrupt(struct iio_event_data* data) int different; mraa_iio_event_extract_event(data, &chan_type, &modifier, &type, &direction, &channel, &channel2, &different); - printf("event time %lld id %lld extracted chan_type %d modifier %d type %d direction %d channel %d channel2 %d different %d\n", data->timestamp, data->id, chan_type, modifier, type, direction, channel, channel2, different); + printf("event time %lld id %lld extracted chan_type %d modifier %d type %d direction %d " + "channel %d channel2 %d different %d\n", + data->timestamp, data->id, chan_type, modifier, type, direction, channel, channel2, different); } int @@ -89,10 +92,28 @@ main() return EXIT_FAILURE; } - float iio_value; - mraa_result_t ret = mraa_iio_read(iio_device0, "in_voltage0_raw", &iio_value); + float iio_float; + int iio_integer; + mraa_result_t ret; + + ret = mraa_iio_write_float(iio_device0, "in_accel_scale", 0.019163); + if (ret == MRAA_SUCCESS) { + fprintf(stdout, "IIO write success\n"); + } + + ret = mraa_iio_read_float(iio_device0, "in_accel_scale", &iio_float); + if (ret == MRAA_SUCCESS) { + fprintf(stdout, "IIO read %f\n", iio_float); + } + + ret = mraa_iio_write_integer(iio_device0, "scan_elements/in_accel_x_en", 1); + if (ret == MRAA_SUCCESS) { + fprintf(stdout, "IIO write success\n", iio_integer); + } + + ret = mraa_iio_read_integer(iio_device0, "scan_elements/in_accel_x_en", &iio_integer); if (ret == MRAA_SUCCESS) { - fprintf(stdout, "IIO read %f\n", iio_value); + fprintf(stdout, "IIO read %d\n", iio_integer); } if (mraa_iio_trigger_buffer(iio_device0, interrupt, NULL) == MRAA_SUCCESS) { @@ -106,7 +127,7 @@ main() if (iio_device6 == NULL) { return EXIT_FAILURE; } - mraa_iio_event_write(iio_device6, "in_proximity2_thresh_either_en", "1"); + mraa_iio_write_integer(iio_device6, "events/in_proximity2_thresh_either_en", 1); // Blocking until event fired diff --git a/src/iio/iio.c b/src/iio/iio.c index 7c8df23..f8a3275 100644 --- a/src/iio/iio.c +++ b/src/iio/iio.c @@ -203,27 +203,84 @@ mraa_iio_get_device_num_by_name(const char* name) } mraa_result_t -mraa_iio_read(mraa_iio_context dev, const char* attr_chan, float* data) +mraa_iio_read_float(mraa_iio_context dev, const char* filename, float* data) { char buf[MAX_SIZE]; - snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, attr_chan); - int fd = open(buf, O_RDONLY); - if (fd != -1) { - int len = read(fd, &buf, MAX_SIZE); - *data = strtol(buf, NULL, 10); + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "r"); + if (fp != NULL) { + fscanf(fp, "%f\n", data); + fclose(fp); return MRAA_SUCCESS; } return MRAA_ERROR_UNSPECIFIED; } mraa_result_t -mraa_iio_write(mraa_iio_context dev, const char* attr_chan, const char* data) +mraa_iio_read_integer(mraa_iio_context dev, const char* filename, int* data) { - char buf[128]; - snprintf(buf, 128, IIO_SYSFS_DEVICE "%d/%s", dev->num, attr_chan); - int fd = open(buf, O_WRONLY); - if (fd != -1) { - write(fd, data, (strlen(data) + 1)); + char buf[MAX_SIZE]; + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "r"); + if (fp != NULL) { + fscanf(fp, "%d\n", data); + fclose(fp); + return MRAA_SUCCESS; + } + return MRAA_ERROR_UNSPECIFIED; +} + +mraa_result_t +mraa_iio_read_string(mraa_iio_context dev, const char* filename, char* data) +{ + char buf[MAX_SIZE]; + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "r"); + if (fp != NULL) { + fscanf(fp, "%s\n", data); + fclose(fp); + return MRAA_SUCCESS; + } + return MRAA_ERROR_UNSPECIFIED; +} + +mraa_result_t +mraa_iio_write_float(mraa_iio_context dev, const char* filename, const float data) +{ + char buf[MAX_SIZE]; + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "w"); + if (fp != NULL) { + fprintf(fp, "%f", data); + fclose(fp); + return MRAA_SUCCESS; + } + return MRAA_ERROR_UNSPECIFIED; +} + +mraa_result_t +mraa_iio_write_integer(mraa_iio_context dev, const char* filename, const int data) +{ + char buf[MAX_SIZE]; + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "w"); + if (fp != NULL) { + fprintf(fp, "%d", data); + fclose(fp); + return MRAA_SUCCESS; + } + return MRAA_ERROR_UNSPECIFIED; +} + +mraa_result_t +mraa_iio_write_string(mraa_iio_context dev, const char* filename, const char* data) +{ + char buf[MAX_SIZE]; + snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/%s", dev->num, filename); + FILE* fp = fopen(buf, "w"); + if (fp != NULL) { + fprintf(fp, "%s", data); + fclose(fp); return MRAA_SUCCESS; } return MRAA_ERROR_UNSPECIFIED; @@ -351,34 +408,6 @@ mraa_iio_get_event_data(mraa_iio_context dev) return MRAA_SUCCESS; } -mraa_result_t -mraa_iio_event_read(mraa_iio_context dev, const char* attribute, float* data) -{ - char buf[MAX_SIZE]; - snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_EVENTS "/%s", dev->num, attribute); - int fd = open(buf, O_RDONLY); - if (fd != -1) { - int len = read(fd, &buf, MAX_SIZE); - *data = strtol(buf, NULL, 10); - return MRAA_SUCCESS; - } - return MRAA_ERROR_UNSPECIFIED; -} - -mraa_result_t -mraa_iio_event_write(mraa_iio_context dev, const char* attribute, const char* data) -{ - int len; - char buf[MAX_SIZE]; - snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_EVENTS "/%s", dev->num, attribute); - int fd = open(buf, O_WRONLY); - if (fd != -1) { - int len = write(fd, data, (strlen(data) + 1)); - return MRAA_SUCCESS; - } - return MRAA_ERROR_UNSPECIFIED; -} - static mraa_result_t mraa_iio_event_poll_nonblock(int fd, struct iio_event_data* data) { -- 2.7.4