aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-07-24 19:55:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-07-24 19:55:23 -0400
commit25a0dc4be86fc0d8c7e81bb5f8be8427022bf15f (patch)
treec8d66d65eb0910a2dc8e00a96c1a4da1fc9e33d4 /tools
parent9d0be76f52faff97fd9581eba70870f27061ae93 (diff)
parent6c71ee3b6157fdbde5c839405b593876d3687eb9 (diff)
Merge tag 'staging-4.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging and IIO driver updates from Greg KH: "Here is the big Staging and IIO driver update for 4.8-rc1. We ended up adding more code than removing, again, but it's not all that bad. Lots of cleanups all over the staging tree, and new IIO drivers, full details in the shortlog. All of these have been in linux-next for a while with no reported issues" * tag 'staging-4.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (417 commits) drivers:iio:accel:mma8452: removed unwanted return statements drivers:iio:accel:mma8452: added cleanup provision in case of failure. iio: Add iio.git tree to MAINTAINERS iio:st_pressure: clean useless static channel initializers iio:st_pressure:lps22hb: temperature support iio:st_pressure:lps22hb: open drain support iio:st_pressure: temperature triggered buffering iio:st_pressure: document sampling gains iio:st_pressure: align storagebits on power of 2 iio:st_sensors: align on storagebits boundaries staging:iio:lis3l02dq drop separate driver iio: accel: st_accel: Add lis3l02dq support iio: adc: add missing of_node references to iio_dev iio: adc: ti-ads1015: add indio_dev->dev.of_node reference iio: potentiometer: Fix typo in Kconfig iio: potentiometer: mcp4531: Add device tree binding iio: potentiometer: mcp4531: Add device tree binding documentation iio: potentiometer: mcp4531: Add support for MCP454x, MCP456x, MCP464x and MCP466x iio:imu:mpu6050: icm20608 initial support iio: adc: max1363: Add device tree binding ...
Diffstat (limited to 'tools')
-rw-r--r--tools/iio/Makefile21
-rw-r--r--tools/iio/iio_generic_buffer.c (renamed from tools/iio/generic_buffer.c)261
2 files changed, 199 insertions, 83 deletions
diff --git a/tools/iio/Makefile b/tools/iio/Makefile
index 3a7a54f59713..5446d625e17d 100644
--- a/tools/iio/Makefile
+++ b/tools/iio/Makefile
@@ -1,16 +1,31 @@
1CC = $(CROSS_COMPILE)gcc 1CC = $(CROSS_COMPILE)gcc
2CFLAGS += -Wall -g -D_GNU_SOURCE 2CFLAGS += -Wall -g -D_GNU_SOURCE
3 3
4all: iio_event_monitor lsiio generic_buffer 4BINDIR=usr/bin
5INSTALL_PROGRAM=install -m 755 -p
6DEL_FILE=rm -f
7
8all: iio_event_monitor lsiio iio_generic_buffer
5 9
6iio_event_monitor: iio_event_monitor.o iio_utils.o 10iio_event_monitor: iio_event_monitor.o iio_utils.o
7 11
8lsiio: lsiio.o iio_utils.o 12lsiio: lsiio.o iio_utils.o
9 13
10generic_buffer: generic_buffer.o iio_utils.o 14iio_generic_buffer: iio_generic_buffer.o iio_utils.o
11 15
12%.o: %.c iio_utils.h 16%.o: %.c iio_utils.h
13 17
18install:
19 - mkdir -p $(INSTALL_ROOT)/$(BINDIR)
20 - $(INSTALL_PROGRAM) "iio_event_monitor" "$(INSTALL_ROOT)/$(BINDIR)/iio_event_monitor"
21 - $(INSTALL_PROGRAM) "lsiio" "$(INSTALL_ROOT)/$(BINDIR)/lsiio"
22 - $(INSTALL_PROGRAM) "iio_generic_buffer" "$(INSTALL_ROOT)/$(BINDIR)/iio_generic_buffer"
23
24uninstall:
25 $(DEL_FILE) "$(INSTALL_ROOT)/$(BINDIR)/iio_event_monitor"
26 $(DEL_FILE) "$(INSTALL_ROOT)/$(BINDIR)/lsiio"
27 $(DEL_FILE) "$(INSTALL_ROOT)/$(BINDIR)/iio_generic_buffer"
28
14.PHONY: clean 29.PHONY: clean
15clean: 30clean:
16 rm -f *.o iio_event_monitor lsiio generic_buffer 31 rm -f *.o iio_event_monitor lsiio iio_generic_buffer
diff --git a/tools/iio/generic_buffer.c b/tools/iio/iio_generic_buffer.c
index 2429c78de940..0e8a1f7a292d 100644
--- a/tools/iio/generic_buffer.c
+++ b/tools/iio/iio_generic_buffer.c
@@ -32,6 +32,8 @@
32#include <endian.h> 32#include <endian.h>
33#include <getopt.h> 33#include <getopt.h>
34#include <inttypes.h> 34#include <inttypes.h>
35#include <stdbool.h>
36#include <signal.h>
35#include "iio_utils.h" 37#include "iio_utils.h"
36 38
37/** 39/**
@@ -249,11 +251,82 @@ void print_usage(void)
249 " -e Disable wait for event (new data)\n" 251 " -e Disable wait for event (new data)\n"
250 " -g Use trigger-less mode\n" 252 " -g Use trigger-less mode\n"
251 " -l <n> Set buffer length to n samples\n" 253 " -l <n> Set buffer length to n samples\n"
252 " -n <name> Set device name (mandatory)\n" 254 " --device-name -n <name>\n"
253 " -t <name> Set trigger name\n" 255 " --device-num -N <num>\n"
256 " Set device by name or number (mandatory)\n"
257 " --trigger-name -t <name>\n"
258 " --trigger-num -T <num>\n"
259 " Set trigger by name or number\n"
254 " -w <n> Set delay between reads in us (event-less mode)\n"); 260 " -w <n> Set delay between reads in us (event-less mode)\n");
255} 261}
256 262
263enum autochan autochannels = AUTOCHANNELS_DISABLED;
264char *dev_dir_name = NULL;
265char *buf_dir_name = NULL;
266bool current_trigger_set = false;
267
268void cleanup(void)
269{
270 int ret;
271
272 /* Disable trigger */
273 if (dev_dir_name && current_trigger_set) {
274 /* Disconnect the trigger - just write a dummy name. */
275 ret = write_sysfs_string("trigger/current_trigger",
276 dev_dir_name, "NULL");
277 if (ret < 0)
278 fprintf(stderr, "Failed to disable trigger: %s\n",
279 strerror(-ret));
280 current_trigger_set = false;
281 }
282
283 /* Disable buffer */
284 if (buf_dir_name) {
285 ret = write_sysfs_int("enable", buf_dir_name, 0);
286 if (ret < 0)
287 fprintf(stderr, "Failed to disable buffer: %s\n",
288 strerror(-ret));
289 }
290
291 /* Disable channels if auto-enabled */
292 if (dev_dir_name && autochannels == AUTOCHANNELS_ACTIVE) {
293 ret = enable_disable_all_channels(dev_dir_name, 0);
294 if (ret)
295 fprintf(stderr, "Failed to disable all channels\n");
296 autochannels = AUTOCHANNELS_DISABLED;
297 }
298}
299
300void sig_handler(int signum)
301{
302 fprintf(stderr, "Caught signal %d\n", signum);
303 cleanup();
304 exit(-signum);
305}
306
307void register_cleanup(void)
308{
309 struct sigaction sa = { .sa_handler = sig_handler };
310 const int signums[] = { SIGINT, SIGTERM, SIGABRT };
311 int ret, i;
312
313 for (i = 0; i < ARRAY_SIZE(signums); ++i) {
314 ret = sigaction(signums[i], &sa, NULL);
315 if (ret) {
316 perror("Failed to register signal handler");
317 exit(-1);
318 }
319 }
320}
321
322static const struct option longopts[] = {
323 { "device-name", 1, 0, 'n' },
324 { "device-num", 1, 0, 'N' },
325 { "trigger-name", 1, 0, 't' },
326 { "trigger-num", 1, 0, 'T' },
327 { },
328};
329
257int main(int argc, char **argv) 330int main(int argc, char **argv)
258{ 331{
259 unsigned long num_loops = 2; 332 unsigned long num_loops = 2;
@@ -261,26 +334,25 @@ int main(int argc, char **argv)
261 unsigned long buf_len = 128; 334 unsigned long buf_len = 128;
262 335
263 int ret, c, i, j, toread; 336 int ret, c, i, j, toread;
264 int fp; 337 int fp = -1;
265 338
266 int num_channels; 339 int num_channels = 0;
267 char *trigger_name = NULL, *device_name = NULL; 340 char *trigger_name = NULL, *device_name = NULL;
268 char *dev_dir_name, *buf_dir_name;
269 341
270 int datardytrigger = 1; 342 char *data = NULL;
271 char *data;
272 ssize_t read_size; 343 ssize_t read_size;
273 int dev_num, trig_num; 344 int dev_num = -1, trig_num = -1;
274 char *buffer_access; 345 char *buffer_access = NULL;
275 int scan_size; 346 int scan_size;
276 int noevents = 0; 347 int noevents = 0;
277 int notrigger = 0; 348 int notrigger = 0;
278 enum autochan autochannels = AUTOCHANNELS_DISABLED;
279 char *dummy; 349 char *dummy;
280 350
281 struct iio_channel_info *channels; 351 struct iio_channel_info *channels;
282 352
283 while ((c = getopt(argc, argv, "ac:egl:n:t:w:")) != -1) { 353 register_cleanup();
354
355 while ((c = getopt_long(argc, argv, "ac:egl:n:N:t:T:w:", longopts, NULL)) != -1) {
284 switch (c) { 356 switch (c) {
285 case 'a': 357 case 'a':
286 autochannels = AUTOCHANNELS_ENABLED; 358 autochannels = AUTOCHANNELS_ENABLED;
@@ -288,8 +360,10 @@ int main(int argc, char **argv)
288 case 'c': 360 case 'c':
289 errno = 0; 361 errno = 0;
290 num_loops = strtoul(optarg, &dummy, 10); 362 num_loops = strtoul(optarg, &dummy, 10);
291 if (errno) 363 if (errno) {
292 return -errno; 364 ret = -errno;
365 goto error;
366 }
293 367
294 break; 368 break;
295 case 'e': 369 case 'e':
@@ -301,49 +375,102 @@ int main(int argc, char **argv)
301 case 'l': 375 case 'l':
302 errno = 0; 376 errno = 0;
303 buf_len = strtoul(optarg, &dummy, 10); 377 buf_len = strtoul(optarg, &dummy, 10);
304 if (errno) 378 if (errno) {
305 return -errno; 379 ret = -errno;
380 goto error;
381 }
306 382
307 break; 383 break;
308 case 'n': 384 case 'n':
309 device_name = optarg; 385 device_name = strdup(optarg);
386 break;
387 case 'N':
388 errno = 0;
389 dev_num = strtoul(optarg, &dummy, 10);
390 if (errno) {
391 ret = -errno;
392 goto error;
393 }
310 break; 394 break;
311 case 't': 395 case 't':
312 trigger_name = optarg; 396 trigger_name = strdup(optarg);
313 datardytrigger = 0;
314 break; 397 break;
315 case 'w': 398 case 'T':
316 errno = 0; 399 errno = 0;
317 timedelay = strtoul(optarg, &dummy, 10); 400 trig_num = strtoul(optarg, &dummy, 10);
318 if (errno) 401 if (errno)
319 return -errno; 402 return -errno;
320 break; 403 break;
404 case 'w':
405 errno = 0;
406 timedelay = strtoul(optarg, &dummy, 10);
407 if (errno) {
408 ret = -errno;
409 goto error;
410 }
411 break;
321 case '?': 412 case '?':
322 print_usage(); 413 print_usage();
323 return -1; 414 ret = -1;
415 goto error;
324 } 416 }
325 } 417 }
326 418
327 if (!device_name) {
328 fprintf(stderr, "Device name not set\n");
329 print_usage();
330 return -1;
331 }
332
333 /* Find the device requested */ 419 /* Find the device requested */
334 dev_num = find_type_by_name(device_name, "iio:device"); 420 if (dev_num < 0 && !device_name) {
335 if (dev_num < 0) { 421 fprintf(stderr, "Device not set\n");
336 fprintf(stderr, "Failed to find the %s\n", device_name); 422 print_usage();
337 return dev_num; 423 ret = -1;
424 goto error;
425 } else if (dev_num >= 0 && device_name) {
426 fprintf(stderr, "Only one of --device-num or --device-name needs to be set\n");
427 print_usage();
428 ret = -1;
429 goto error;
430 } else if (dev_num < 0) {
431 dev_num = find_type_by_name(device_name, "iio:device");
432 if (dev_num < 0) {
433 fprintf(stderr, "Failed to find the %s\n", device_name);
434 ret = dev_num;
435 goto error;
436 }
338 } 437 }
339
340 printf("iio device number being used is %d\n", dev_num); 438 printf("iio device number being used is %d\n", dev_num);
341 439
342 ret = asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); 440 ret = asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
343 if (ret < 0) 441 if (ret < 0)
344 return -ENOMEM; 442 return -ENOMEM;
443 /* Fetch device_name if specified by number */
444 if (!device_name) {
445 device_name = malloc(IIO_MAX_NAME_LENGTH);
446 if (!device_name) {
447 ret = -ENOMEM;
448 goto error;
449 }
450 ret = read_sysfs_string("name", dev_dir_name, device_name);
451 if (ret < 0) {
452 fprintf(stderr, "Failed to read name of device %d\n", dev_num);
453 goto error;
454 }
455 }
345 456
346 if (!notrigger) { 457 if (notrigger) {
458 printf("trigger-less mode selected\n");
459 } if (trig_num >= 0) {
460 char *trig_dev_name;
461 ret = asprintf(&trig_dev_name, "%strigger%d", iio_dir, trig_num);
462 if (ret < 0) {
463 return -ENOMEM;
464 }
465 trigger_name = malloc(IIO_MAX_NAME_LENGTH);
466 ret = read_sysfs_string("name", trig_dev_name, trigger_name);
467 free(trig_dev_name);
468 if (ret < 0) {
469 fprintf(stderr, "Failed to read trigger%d name from\n", trig_num);
470 return ret;
471 }
472 printf("iio trigger number being used is %d\n", trig_num);
473 } else {
347 if (!trigger_name) { 474 if (!trigger_name) {
348 /* 475 /*
349 * Build the trigger name. If it is device associated 476 * Build the trigger name. If it is device associated
@@ -354,7 +481,7 @@ int main(int argc, char **argv)
354 "%s-dev%d", device_name, dev_num); 481 "%s-dev%d", device_name, dev_num);
355 if (ret < 0) { 482 if (ret < 0) {
356 ret = -ENOMEM; 483 ret = -ENOMEM;
357 goto error_free_dev_dir_name; 484 goto error;
358 } 485 }
359 } 486 }
360 487
@@ -367,7 +494,7 @@ int main(int argc, char **argv)
367 "%s-trigger", device_name); 494 "%s-trigger", device_name);
368 if (ret < 0) { 495 if (ret < 0) {
369 ret = -ENOMEM; 496 ret = -ENOMEM;
370 goto error_free_dev_dir_name; 497 goto error;
371 } 498 }
372 } 499 }
373 500
@@ -376,12 +503,10 @@ int main(int argc, char **argv)
376 fprintf(stderr, "Failed to find the trigger %s\n", 503 fprintf(stderr, "Failed to find the trigger %s\n",
377 trigger_name); 504 trigger_name);
378 ret = trig_num; 505 ret = trig_num;
379 goto error_free_triggername; 506 goto error;
380 } 507 }
381 508
382 printf("iio trigger number being used is %d\n", trig_num); 509 printf("iio trigger number being used is %d\n", trig_num);
383 } else {
384 printf("trigger-less mode selected\n");
385 } 510 }
386 511
387 /* 512 /*
@@ -392,7 +517,7 @@ int main(int argc, char **argv)
392 if (ret) { 517 if (ret) {
393 fprintf(stderr, "Problem reading scan element information\n" 518 fprintf(stderr, "Problem reading scan element information\n"
394 "diag %s\n", dev_dir_name); 519 "diag %s\n", dev_dir_name);
395 goto error_free_triggername; 520 goto error;
396 } 521 }
397 if (num_channels && autochannels == AUTOCHANNELS_ENABLED) { 522 if (num_channels && autochannels == AUTOCHANNELS_ENABLED) {
398 fprintf(stderr, "Auto-channels selected but some channels " 523 fprintf(stderr, "Auto-channels selected but some channels "
@@ -407,7 +532,7 @@ int main(int argc, char **argv)
407 ret = enable_disable_all_channels(dev_dir_name, 1); 532 ret = enable_disable_all_channels(dev_dir_name, 1);
408 if (ret) { 533 if (ret) {
409 fprintf(stderr, "Failed to enable all channels\n"); 534 fprintf(stderr, "Failed to enable all channels\n");
410 goto error_free_triggername; 535 goto error;
411 } 536 }
412 537
413 /* This flags that we need to disable the channels again */ 538 /* This flags that we need to disable the channels again */
@@ -419,12 +544,12 @@ int main(int argc, char **argv)
419 fprintf(stderr, "Problem reading scan element " 544 fprintf(stderr, "Problem reading scan element "
420 "information\n" 545 "information\n"
421 "diag %s\n", dev_dir_name); 546 "diag %s\n", dev_dir_name);
422 goto error_disable_channels; 547 goto error;
423 } 548 }
424 if (!num_channels) { 549 if (!num_channels) {
425 fprintf(stderr, "Still no channels after " 550 fprintf(stderr, "Still no channels after "
426 "auto-enabling, giving up\n"); 551 "auto-enabling, giving up\n");
427 goto error_disable_channels; 552 goto error;
428 } 553 }
429 } 554 }
430 555
@@ -436,7 +561,7 @@ int main(int argc, char **argv)
436 "/*_en or pass -a to autoenable channels and " 561 "/*_en or pass -a to autoenable channels and "
437 "try again.\n", dev_dir_name); 562 "try again.\n", dev_dir_name);
438 ret = -ENOENT; 563 ret = -ENOENT;
439 goto error_free_triggername; 564 goto error;
440 } 565 }
441 566
442 /* 567 /*
@@ -448,7 +573,7 @@ int main(int argc, char **argv)
448 "%siio:device%d/buffer", iio_dir, dev_num); 573 "%siio:device%d/buffer", iio_dir, dev_num);
449 if (ret < 0) { 574 if (ret < 0) {
450 ret = -ENOMEM; 575 ret = -ENOMEM;
451 goto error_free_channels; 576 goto error;
452 } 577 }
453 578
454 if (!notrigger) { 579 if (!notrigger) {
@@ -463,34 +588,34 @@ int main(int argc, char **argv)
463 if (ret < 0) { 588 if (ret < 0) {
464 fprintf(stderr, 589 fprintf(stderr,
465 "Failed to write current_trigger file\n"); 590 "Failed to write current_trigger file\n");
466 goto error_free_buf_dir_name; 591 goto error;
467 } 592 }
468 } 593 }
469 594
470 /* Setup ring buffer parameters */ 595 /* Setup ring buffer parameters */
471 ret = write_sysfs_int("length", buf_dir_name, buf_len); 596 ret = write_sysfs_int("length", buf_dir_name, buf_len);
472 if (ret < 0) 597 if (ret < 0)
473 goto error_free_buf_dir_name; 598 goto error;
474 599
475 /* Enable the buffer */ 600 /* Enable the buffer */
476 ret = write_sysfs_int("enable", buf_dir_name, 1); 601 ret = write_sysfs_int("enable", buf_dir_name, 1);
477 if (ret < 0) { 602 if (ret < 0) {
478 fprintf(stderr, 603 fprintf(stderr,
479 "Failed to enable buffer: %s\n", strerror(-ret)); 604 "Failed to enable buffer: %s\n", strerror(-ret));
480 goto error_free_buf_dir_name; 605 goto error;
481 } 606 }
482 607
483 scan_size = size_from_channelarray(channels, num_channels); 608 scan_size = size_from_channelarray(channels, num_channels);
484 data = malloc(scan_size * buf_len); 609 data = malloc(scan_size * buf_len);
485 if (!data) { 610 if (!data) {
486 ret = -ENOMEM; 611 ret = -ENOMEM;
487 goto error_free_buf_dir_name; 612 goto error;
488 } 613 }
489 614
490 ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num); 615 ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num);
491 if (ret < 0) { 616 if (ret < 0) {
492 ret = -ENOMEM; 617 ret = -ENOMEM;
493 goto error_free_data; 618 goto error;
494 } 619 }
495 620
496 /* Attempt to open non blocking the access dev */ 621 /* Attempt to open non blocking the access dev */
@@ -498,7 +623,7 @@ int main(int argc, char **argv)
498 if (fp == -1) { /* TODO: If it isn't there make the node */ 623 if (fp == -1) { /* TODO: If it isn't there make the node */
499 ret = -errno; 624 ret = -errno;
500 fprintf(stderr, "Failed to open %s\n", buffer_access); 625 fprintf(stderr, "Failed to open %s\n", buffer_access);
501 goto error_free_buffer_access; 626 goto error;
502 } 627 }
503 628
504 for (j = 0; j < num_loops; j++) { 629 for (j = 0; j < num_loops; j++) {
@@ -511,7 +636,7 @@ int main(int argc, char **argv)
511 ret = poll(&pfd, 1, -1); 636 ret = poll(&pfd, 1, -1);
512 if (ret < 0) { 637 if (ret < 0) {
513 ret = -errno; 638 ret = -errno;
514 goto error_close_buffer_access; 639 goto error;
515 } else if (ret == 0) { 640 } else if (ret == 0) {
516 continue; 641 continue;
517 } 642 }
@@ -536,45 +661,21 @@ int main(int argc, char **argv)
536 num_channels); 661 num_channels);
537 } 662 }
538 663
539 /* Stop the buffer */ 664error:
540 ret = write_sysfs_int("enable", buf_dir_name, 0); 665 cleanup();
541 if (ret < 0)
542 goto error_close_buffer_access;
543 666
544 if (!notrigger) 667 if (fp >= 0 && close(fp) == -1)
545 /* Disconnect the trigger - just write a dummy name. */
546 ret = write_sysfs_string("trigger/current_trigger",
547 dev_dir_name, "NULL");
548 if (ret < 0)
549 fprintf(stderr, "Failed to write to %s\n",
550 dev_dir_name);
551
552error_close_buffer_access:
553 if (close(fp) == -1)
554 perror("Failed to close buffer"); 668 perror("Failed to close buffer");
555
556error_free_buffer_access:
557 free(buffer_access); 669 free(buffer_access);
558error_free_data:
559 free(data); 670 free(data);
560error_free_buf_dir_name:
561 free(buf_dir_name); 671 free(buf_dir_name);
562error_free_channels:
563 for (i = num_channels - 1; i >= 0; i--) { 672 for (i = num_channels - 1; i >= 0; i--) {
564 free(channels[i].name); 673 free(channels[i].name);
565 free(channels[i].generic_name); 674 free(channels[i].generic_name);
566 } 675 }
567 free(channels); 676 free(channels);
568error_free_triggername: 677 free(trigger_name);
569 if (datardytrigger) 678 free(device_name);
570 free(trigger_name);
571error_disable_channels:
572 if (autochannels == AUTOCHANNELS_ACTIVE) {
573 ret = enable_disable_all_channels(dev_dir_name, 0);
574 if (ret)
575 fprintf(stderr, "Failed to disable all channels\n");
576 }
577error_free_dev_dir_name:
578 free(dev_dir_name); 679 free(dev_dir_name);
579 680
580 return ret; 681 return ret;