Part of the libiio-utilites, iio_info is a utility for displaying information about local or remote IIO devices.
#include <errno.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "iio_common.h"
#define MY_NAME "iio_info"
#ifdef _WIN32
#define snprintf sprintf_s
#endif
static const struct option options[] = {
{"scan", no_argument, 0, 's'},
{0, 0, 0, 0},
};
static const char *options_descriptions[] = {
"[-x <xml_file>]\n"
"\t\t\t\t[-u <uri>]",
"Scan for available backends.",
};
static int dev_is_buffer_capable(
const struct iio_device *dev)
{
unsigned int i;
return true;
}
return false;
}
#define MY_OPTS "s"
int main(int argc, char **argv)
{
char **argw;
int c;
unsigned int i, major, minor;
char git_tag[8];
int ret;
struct option *opts;
argw = dup_argv(MY_NAME, argc, argv);
printf("Library version: %u.%u (git tag: %s)\n", major, minor, git_tag);
printf("Compiled with backends:");
printf("\n");
ctx = handle_common_opts(MY_NAME, argc, argw, MY_OPTS, options, options_descriptions);
opts = add_common_options(options);
if (!opts) {
fprintf(stderr, "Failed to add common options\n");
return EXIT_FAILURE;
}
while ((c = getopt_long(argc, argw, "+" COMMON_OPTIONS MY_OPTS,
opts, NULL)) != -1) {
switch (c) {
case 'h':
case 'n':
case 'x':
case 'u':
break;
case 'S':
case 'a':
if (!optarg && argc > optind && argw[optind] != NULL
&& argw[optind][0] != '-')
optind++;
break;
case 's':
autodetect_context(false, MY_NAME, NULL);
return EXIT_SUCCESS;
case '?':
printf("Unknown argument '%c'\n", c);
return EXIT_FAILURE;
}
}
free(opts);
if (optind != argc) {
fprintf(stderr, "Incorrect number of arguments.\n\n");
usage(MY_NAME, options, options_descriptions);
return EXIT_FAILURE;
}
if (!ctx)
return EXIT_FAILURE;
printf("IIO context created with %s backend.\n",
if (!ret)
printf("Backend version: %u.%u (git tag: %s)\n",
major, minor, git_tag);
else {
char err_str[1024];
fprintf(stderr, "Unable to get backend version: %s (%i)\n", err_str, ret);
}
printf("Backend description string: %s\n",
if (nb_ctx_attrs > 0)
printf("IIO context has %u attributes:\n", nb_ctx_attrs);
for (i = 0; i < nb_ctx_attrs; i++) {
const char *key, *value;
if (ret == 0)
printf("\t%s: %s\n", key, value);
else {
char err_str[1024];
fprintf(stderr, "\tUnable to read IIO context attributes: %s (%i)\n",
err_str, ret);
}
}
printf("IIO context has %u devices:\n", nb_devices);
char *buf = xmalloc(BUF_SIZE, MY_NAME);
for (i = 0; i < nb_devices; i++) {
if (name)
printf(" %s", name);
if (dev_is_buffer_capable(dev))
printf(" (buffer capable)");
printf("\n");
printf("\t\t%u channels found:\n", nb_channels);
unsigned int j;
for (j = 0; j < nb_channels; j++) {
const char *type_name;
type_name = "output";
else
type_name = "input";
printf("\t\t\t%s: %s (%s",
name ? name : "", type_name);
printf(", WARN:iio_channel_get_type()=UNKNOWN");
sign += 'A' - 'a';
snprintf(repeat, sizeof(repeat), "X%u",
printf(", index: %lu, format: %ce:%c%u/%u%s>>%u)\n",
format->
is_be ?
'b' :
'l',
} else {
printf(")\n");
}
if (!nb_attrs)
continue;
printf("\t\t\t%u channel-specific attributes found:\n",
nb_attrs);
unsigned int k;
for (k = 0; k < nb_attrs; k++) {
attr, buf, BUF_SIZE);
printf("\t\t\t\tattr %2u: %s ", k, attr);
if (ret > 0) {
printf("value: %s\n", buf);
} else {
printf("ERROR: %s (%i)\n", buf, ret);
}
}
}
if (nb_attrs) {
printf("\t\t%u device-specific attributes found:\n",
nb_attrs);
for (j = 0; j < nb_attrs; j++) {
attr, buf, BUF_SIZE);
printf("\t\t\t\tattr %2u: %s ",
j, attr);
if (ret > 0) {
printf("value: %s\n", buf);
} else {
printf("ERROR: %s (%i)\n", buf, ret);
}
}
}
if (nb_attrs) {
printf("\t\t%u buffer-specific attributes found:\n",
nb_attrs);
for (j = 0; j < nb_attrs; j++) {
attr, buf, BUF_SIZE);
printf("\t\t\t\tattr %2u: %s ",
j, attr);
if (ret > 0) {
printf("value: %s\n", buf);
} else {
printf("ERROR: %s (%i)\n", buf, ret);
}
}
}
if (nb_attrs) {
printf("\t\t%u debug attributes found:\n", nb_attrs);
for (j = 0; j < nb_attrs; j++) {
const char *attr =
attr, buf, BUF_SIZE);
printf("\t\t\t\tdebug attr %2u: %s ",
j, attr);
if (ret > 0) {
printf("value: %s\n", buf);
} else {
printf("ERROR: %s (%i)\n", buf, ret);
}
}
}
if (ret == 0) {
if (trig == NULL) {
printf("\t\tNo trigger assigned to device\n");
} else {
printf("\t\tCurrent trigger: %s(%s)\n",
name ? name : "");
}
} else if (ret == -ENOENT) {
printf("\t\tNo trigger on this device\n");
} else if (ret < 0) {
printf("ERROR: checking for trigger : %s (%i)\n", buf, ret);
}
}
free_argw(argc, argw);
free(buf);
return EXIT_SUCCESS;
}