[go: nahoru, domu]

17042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen/* Industrialio event test code.
27042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *
37042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * Copyright (c) 2011-2012 Lars-Peter Clausen <lars@metafoo.de>
47042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *
57042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * This program is free software; you can redistribute it and/or modify it
67042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * under the terms of the GNU General Public License version 2 as published by
77042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * the Free Software Foundation.
87042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *
97042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * This program is primarily intended as an example application.
107042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * Reads the current buffer setup from sysfs and starts a short capture
117042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * from the specified device, pretty printing the result after appropriate
127042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * conversion.
137042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *
147042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen * Usage:
157042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *	iio_event_monitor <device_name>
167042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen *
177042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen */
187042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
197042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#define _GNU_SOURCE
207042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
217042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <unistd.h>
227042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <stdbool.h>
237042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <stdio.h>
247042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <errno.h>
257042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <string.h>
267042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <poll.h>
277042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <fcntl.h>
287042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include <sys/ioctl.h>
297042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen#include "iio_utils.h"
3006458e277eac2b8761b0a04d3c808d57be281a2eJonathan Cameron#include <linux/iio/events.h>
317042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
327042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic const char * const iio_chan_type_name_spec[] = {
337042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_VOLTAGE] = "voltage",
347042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_CURRENT] = "current",
357042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_POWER] = "power",
367042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_ACCEL] = "accel",
377042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_ANGL_VEL] = "anglvel",
387042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MAGN] = "magn",
397042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_LIGHT] = "illuminance",
407042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_INTENSITY] = "intensity",
417042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_PROXIMITY] = "proximity",
427042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_TEMP] = "temp",
437042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_INCLI] = "incli",
447042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_ROT] = "rot",
457042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_ANGL] = "angl",
467042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_TIMESTAMP] = "timestamp",
477042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_CAPACITANCE] = "capacitance",
48a21601463d0e542d20635b835b6c97294571b0a5Peter Meerwald	[IIO_ALTVOLTAGE] = "altvoltage",
490378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	[IIO_CCT] = "cct",
500378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	[IIO_PRESSURE] = "pressure",
510378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	[IIO_HUMIDITYRELATIVE] = "humidityrelative",
527042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen};
537042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
547042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic const char * const iio_ev_type_text[] = {
557042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_TYPE_THRESH] = "thresh",
567042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_TYPE_MAG] = "mag",
577042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_TYPE_ROC] = "roc",
587042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_TYPE_THRESH_ADAPTIVE] = "thresh_adaptive",
597042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive",
607042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen};
617042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
627042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic const char * const iio_ev_dir_text[] = {
637042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_DIR_EITHER] = "either",
647042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_DIR_RISING] = "rising",
657042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_EV_DIR_FALLING] = "falling"
667042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen};
677042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
687042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic const char * const iio_modifier_names[] = {
697042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MOD_X] = "x",
707042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MOD_Y] = "y",
717042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MOD_Z] = "z",
727042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MOD_LIGHT_BOTH] = "both",
737042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	[IIO_MOD_LIGHT_IR] = "ir",
74da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_ROOT_SUM_SQUARED_X_Y] = "sqrt(x^2+y^2)",
75da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_SUM_SQUARED_X_Y_Z] = "x^2+y^2+z^2",
760378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	[IIO_MOD_LIGHT_BOTH] = "both",
770378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	[IIO_MOD_LIGHT_IR] = "ir",
78da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_LIGHT_CLEAR] = "clear",
79da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_LIGHT_RED] = "red",
80da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_LIGHT_GREEN] = "green",
81da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	[IIO_MOD_LIGHT_BLUE] = "blue",
827042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen};
837042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
847042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic bool event_is_known(struct iio_event_data *event)
857042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen{
867042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_chan_type type = IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event->id);
877042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_modifier mod = IIO_EVENT_CODE_EXTRACT_MODIFIER(event->id);
887042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_event_type ev_type = IIO_EVENT_CODE_EXTRACT_TYPE(event->id);
897042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_event_direction dir = IIO_EVENT_CODE_EXTRACT_DIR(event->id);
907042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
917042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	switch (type) {
927042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_VOLTAGE:
937042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_CURRENT:
947042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_POWER:
957042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_ACCEL:
967042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_ANGL_VEL:
977042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MAGN:
987042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_LIGHT:
997042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_INTENSITY:
1007042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_PROXIMITY:
1017042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_TEMP:
1027042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_INCLI:
1037042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_ROT:
1047042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_ANGL:
1057042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_TIMESTAMP:
1067042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_CAPACITANCE:
107a21601463d0e542d20635b835b6c97294571b0a5Peter Meerwald	case IIO_ALTVOLTAGE:
1080378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	case IIO_CCT:
1090378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	case IIO_PRESSURE:
1100378250b52ca3afb83257868448ef9d1efcbf607Peter Meerwald	case IIO_HUMIDITYRELATIVE:
1117042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		break;
1127042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	default:
1137042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return false;
1147042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1157042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1167042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	switch (mod) {
1177042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_NO_MOD:
1187042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MOD_X:
1197042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MOD_Y:
1207042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MOD_Z:
1217042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MOD_LIGHT_BOTH:
1227042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_MOD_LIGHT_IR:
123da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_ROOT_SUM_SQUARED_X_Y:
124da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_SUM_SQUARED_X_Y_Z:
125da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_LIGHT_CLEAR:
126da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_LIGHT_RED:
127da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_LIGHT_GREEN:
128da4db94080f0c54929a031f37e550001d0068930Peter Meerwald	case IIO_MOD_LIGHT_BLUE:
1297042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		break;
1307042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	default:
1317042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return false;
1327042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1337042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1347042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	switch (ev_type) {
1357042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_TYPE_THRESH:
1367042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_TYPE_MAG:
1377042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_TYPE_ROC:
1387042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_TYPE_THRESH_ADAPTIVE:
1397042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_TYPE_MAG_ADAPTIVE:
1407042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		break;
1417042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	default:
1427042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return false;
1437042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1447042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1457042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	switch (dir) {
1467042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_DIR_EITHER:
1477042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_DIR_RISING:
1487042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	case IIO_EV_DIR_FALLING:
1497042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		break;
1507042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	default:
1517042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return false;
1527042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1537042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1547042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	return true;
1557042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen}
1567042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1577042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenstatic void print_event(struct iio_event_data *event)
1587042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen{
1597042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_chan_type type = IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event->id);
1607042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_modifier mod = IIO_EVENT_CODE_EXTRACT_MODIFIER(event->id);
1617042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_event_type ev_type = IIO_EVENT_CODE_EXTRACT_TYPE(event->id);
1627042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	enum iio_event_direction dir = IIO_EVENT_CODE_EXTRACT_DIR(event->id);
1637042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	int chan = IIO_EVENT_CODE_EXTRACT_CHAN(event->id);
1647042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	int chan2 = IIO_EVENT_CODE_EXTRACT_CHAN2(event->id);
1657042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	bool diff = IIO_EVENT_CODE_EXTRACT_DIFF(event->id);
1667042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1677042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (!event_is_known(event)) {
1687042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("Unknown event: time: %lld, id: %llx\n",
1697042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				event->timestamp, event->id);
1707042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return;
1717042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1727042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1737042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	printf("Event: time: %lld, ", event->timestamp);
1747042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1757042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (mod != IIO_NO_MOD) {
1767042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("type: %s(%s), ",
1777042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			iio_chan_type_name_spec[type],
1787042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			iio_modifier_names[mod]);
1797042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	} else {
1807042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("type: %s, ",
1817042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			iio_chan_type_name_spec[type]);
1827042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
1837042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1847042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (diff && chan >= 0 && chan2 >= 0)
1857042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("channel: %d-%d, ", chan, chan2);
1867042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	else if (chan >= 0)
1877042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("channel: %d, ", chan);
1887042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1897042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	printf("evtype: %s, direction: %s\n",
1907042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		iio_ev_type_text[ev_type],
1917042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		iio_ev_dir_text[dir]);
1927042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen}
1937042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
1947042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenint main(int argc, char **argv)
1957042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen{
1967042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	struct iio_event_data event;
1977042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	const char *device_name;
1987042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	char *chrdev_name;
1997042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	int ret;
2007042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	int dev_num;
2017042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	int fd, event_fd;
2027042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2037042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (argc <= 1) {
2047042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("Usage: %s <device_name>\n", argv[0]);
2057042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		return -1;
2067042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
2077042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2087042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	device_name = argv[1];
2097042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2107042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	dev_num = find_type_by_name(device_name, "iio:device");
2117042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (dev_num >= 0) {
2127042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		printf("Found IIO device with name %s with device number %d\n",
2137042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			device_name, dev_num);
2147042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		ret = asprintf(&chrdev_name, "/dev/iio:device%d", dev_num);
2157042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		if (ret < 0) {
2167042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			ret = -ENOMEM;
2177042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			goto error_ret;
2187042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		}
2197042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	} else {
2207042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		/* If we can't find a IIO device by name assume device_name is a
2217042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		   IIO chrdev */
2227042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		chrdev_name = strdup(device_name);
2237042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
2247042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2257042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	fd = open(chrdev_name, 0);
2267042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (fd == -1) {
2277042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		fprintf(stdout, "Failed to open %s\n", chrdev_name);
2287042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		ret = -errno;
2297042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		goto error_free_chrdev_name;
2307042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
2317042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2327042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	ret = ioctl(fd, IIO_GET_EVENT_FD_IOCTL, &event_fd);
2337042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2347042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	close(fd);
2357042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2367042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	if (ret == -1 || event_fd == -1) {
2377042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		fprintf(stdout, "Failed to retrieve event fd\n");
2387042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		ret = -errno;
2397042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		goto error_free_chrdev_name;
2407042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
2417042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2427042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	while (true) {
2437042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		ret = read(event_fd, &event, sizeof(event));
2447042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		if (ret == -1) {
2457042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			if (errno == EAGAIN) {
2467042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				printf("nothing available\n");
2477042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				continue;
2487042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			} else {
2497042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				perror("Failed to read event from device");
2507042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				ret = -errno;
2517042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen				break;
2527042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen			}
2537042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		}
2547042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2557042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen		print_event(&event);
2567042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	}
2577042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen
2587042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	close(event_fd);
2597042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenerror_free_chrdev_name:
2607042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	free(chrdev_name);
2617042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausenerror_ret:
2627042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen	return ret;
2637042122fe5532fa07b370447755423cd834b57eaLars-Peter Clausen}
264