aboutsummaryrefslogtreecommitdiffstats
path: root/tools/iio/lsiio.c
diff options
context:
space:
mode:
authorRoberta Dobrescu <roberta.dobrescu@gmail.com>2015-02-26 03:49:25 -0500
committerJonathan Cameron <jic23@kernel.org>2015-03-09 13:16:08 -0400
commit817020cfb3a2649064a1e14e083934234e2c208d (patch)
treec6dba68cc57c7ccfef746cba3d44a67262c7f2dd /tools/iio/lsiio.c
parentbdcb31d048074d82ed7c50ed45f737d7637f1224 (diff)
iio: Move iio userspace applications out of staging
This patch moves iio userspace applications out of staging, to tools/iio/ and adds a Makefile in order to compile them easily. It also adds tools/iio/ to MAINTAINERS file. Signed-off-by: Roberta Dobrescu <roberta.dobrescu@gmail.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'tools/iio/lsiio.c')
-rw-r--r--tools/iio/lsiio.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/tools/iio/lsiio.c b/tools/iio/lsiio.c
new file mode 100644
index 000000000000..98a0de098130
--- /dev/null
+++ b/tools/iio/lsiio.c
@@ -0,0 +1,163 @@
1/*
2 * Industrial I/O utilities - lsiio.c
3 *
4 * Copyright (c) 2010 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
9 */
10
11#include <string.h>
12#include <dirent.h>
13#include <stdio.h>
14#include <errno.h>
15#include <stdint.h>
16#include <stdlib.h>
17#include <unistd.h>
18#include <sys/types.h>
19#include <sys/stat.h>
20#include <sys/dir.h>
21#include "iio_utils.h"
22
23
24static enum verbosity {
25 VERBLEVEL_DEFAULT, /* 0 gives lspci behaviour */
26 VERBLEVEL_SENSORS, /* 1 lists sensors */
27} verblevel = VERBLEVEL_DEFAULT;
28
29const char *type_device = "iio:device";
30const char *type_trigger = "trigger";
31
32
33static inline int check_prefix(const char *str, const char *prefix)
34{
35 return strlen(str) > strlen(prefix) &&
36 strncmp(str, prefix, strlen(prefix)) == 0;
37}
38
39static inline int check_postfix(const char *str, const char *postfix)
40{
41 return strlen(str) > strlen(postfix) &&
42 strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
43}
44
45static int dump_channels(const char *dev_dir_name)
46{
47 DIR *dp;
48 const struct dirent *ent;
49
50 dp = opendir(dev_dir_name);
51 if (dp == NULL)
52 return -errno;
53 while (ent = readdir(dp), ent != NULL)
54 if (check_prefix(ent->d_name, "in_") &&
55 check_postfix(ent->d_name, "_raw")) {
56 printf(" %-10s\n", ent->d_name);
57 }
58
59 return 0;
60}
61
62static int dump_one_device(const char *dev_dir_name)
63{
64 char name[IIO_MAX_NAME_LENGTH];
65 int dev_idx;
66 int retval;
67
68 retval = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_device),
69 "%i", &dev_idx);
70 if (retval != 1)
71 return -EINVAL;
72 read_sysfs_string("name", dev_dir_name, name);
73 printf("Device %03d: %s\n", dev_idx, name);
74
75 if (verblevel >= VERBLEVEL_SENSORS)
76 return dump_channels(dev_dir_name);
77 return 0;
78}
79
80static int dump_one_trigger(const char *dev_dir_name)
81{
82 char name[IIO_MAX_NAME_LENGTH];
83 int dev_idx;
84 int retval;
85
86 retval = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_trigger),
87 "%i", &dev_idx);
88 if (retval != 1)
89 return -EINVAL;
90 read_sysfs_string("name", dev_dir_name, name);
91 printf("Trigger %03d: %s\n", dev_idx, name);
92 return 0;
93}
94
95static void dump_devices(void)
96{
97 const struct dirent *ent;
98 int number, numstrlen;
99
100 FILE *nameFile;
101 DIR *dp;
102 char thisname[IIO_MAX_NAME_LENGTH];
103 char *filename;
104
105 dp = opendir(iio_dir);
106 if (dp == NULL) {
107 printf("No industrial I/O devices available\n");
108 return;
109 }
110
111 while (ent = readdir(dp), ent != NULL) {
112 if (check_prefix(ent->d_name, type_device)) {
113 char *dev_dir_name;
114
115 asprintf(&dev_dir_name, "%s%s", iio_dir, ent->d_name);
116 dump_one_device(dev_dir_name);
117 free(dev_dir_name);
118 if (verblevel >= VERBLEVEL_SENSORS)
119 printf("\n");
120 }
121 }
122 rewinddir(dp);
123 while (ent = readdir(dp), ent != NULL) {
124 if (check_prefix(ent->d_name, type_trigger)) {
125 char *dev_dir_name;
126
127 asprintf(&dev_dir_name, "%s%s", iio_dir, ent->d_name);
128 dump_one_trigger(dev_dir_name);
129 free(dev_dir_name);
130 }
131 }
132 closedir(dp);
133}
134
135int main(int argc, char **argv)
136{
137 int c, err = 0;
138
139 while ((c = getopt(argc, argv, "d:D:v")) != EOF) {
140 switch (c) {
141 case 'v':
142 verblevel++;
143 break;
144
145 case '?':
146 default:
147 err++;
148 break;
149 }
150 }
151 if (err || argc > optind) {
152 fprintf(stderr, "Usage: lsiio [options]...\n"
153 "List industrial I/O devices\n"
154 " -v, --verbose\n"
155 " Increase verbosity (may be given multiple times)\n"
156 );
157 exit(1);
158 }
159
160 dump_devices();
161
162 return 0;
163}