133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall/* Industrialio buffer test code.
233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * Copyright (c) 2008 Jonathan Cameron
433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * This program is free software; you can redistribute it and/or modify it
633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * under the terms of the GNU General Public License version 2 as published by
733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * the Free Software Foundation.
833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * This program is primarily intended as an example application.
1033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * Reads the current buffer setup from sysfs and starts a short capture
1133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * from the specified device, pretty printing the result after appropriate
1233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * conversion.
1333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
1433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * Command line parameters
1533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * generic_buffer -n <device_name> -t <trigger_name>
1633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * If trigger name is not specified the program assumes you want a dataready
1733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * trigger associated with the device and goes looking for it.
1833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
1933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall */
2033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
2133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <unistd.h>
2233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <dirent.h>
2333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <fcntl.h>
2433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <stdio.h>
2533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <errno.h>
2633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <sys/stat.h>
2733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <dirent.h>
2833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <linux/types.h>
2933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <string.h>
3033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include <poll.h>
3133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "iio_utils.h"
3233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "ml_load_dmp.h"
3333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "ml_sysfs_helper.h"
3433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "authenticate.h"
3533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
3633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall/**
3733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * size_from_channelarray() - calculate the storage size of a scan
3833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * @channels: the channel info array
3933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * @num_channels: size of the channel info array
4033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *
4133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * Has the side effect of filling the channels[i].location values used
4233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * in processing the buffer output.
4333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall **/
4433ce91b37062fa63af192f5643de93f3beebe854JP Abgrallint size_from_channelarray(struct iio_channel_info *channels, int num_channels)
4533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
4633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int bytes = 0;
4733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int i = 0;
4833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	while (i < num_channels) {
4933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		if (bytes % channels[i].bytes == 0)
5033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			channels[i].location = bytes;
5133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		else
5233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			channels[i].location = bytes - bytes%channels[i].bytes
5333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				+ channels[i].bytes;
5433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		bytes = channels[i].location + channels[i].bytes;
5533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		i++;
5633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
5733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	return bytes;
5833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
5933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
6033ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid print2byte(int input, struct iio_channel_info *info)
6133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
6233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* shift before conversion to avoid sign extension
6333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	   of left aligned data */
6433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	input = input >> info->shift;
6533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (info->is_signed) {
6633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		int16_t val = input;
6733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		val &= (1 << info->bits_used) - 1;
6833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		val = (int16_t)(val << (16 - info->bits_used)) >>
6933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			(16 - info->bits_used);
7033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		/*printf("%d, %05f, scale=%05f", val,
7133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		       (float)(val + info->offset)*info->scale, info->scale);*/
7233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("%d, ", val);
7333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
7433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	} else {
7533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		uint16_t val = input;
7633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		val &= (1 << info->bits_used) - 1;
7733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("%05f ", ((float)val + info->offset)*info->scale);
7833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
7933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
8033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall/**
8133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * process_scan() - print out the values in SI units
8233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * @data:		pointer to the start of the scan
8333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * @infoarray:		information about the channels. Note
8433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *  size_from_channelarray must have been called first to fill the
8533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall *  location offsets.
8633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall * @num_channels:	the number of active channels
8733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall **/
8833ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid process_scan(char *data,
8933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		  struct iio_channel_info *infoarray,
9033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		  int num_channels)
9133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
9233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int k;
9333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	//char *tmp;
9433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	for (k = 0; k < num_channels; k++) {
9533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		switch (infoarray[k].bytes) {
9633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			/* only a few cases implemented so far */
9733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 2:
9833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			print2byte(*(uint16_t *)(data + infoarray[k].location),
9933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				   &infoarray[k]);
10033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			//tmp = data + infoarray[k].location;
10133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
10233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 4:
10333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			if (infoarray[k].is_signed) {
10433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				int32_t val = *(int32_t *)
10533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					(data +
10633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					 infoarray[k].location);
10733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				if ((val >> infoarray[k].bits_used) & 1)
10833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					val = (val & infoarray[k].mask) |
10933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall						~infoarray[k].mask;
11033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				/* special case for timestamp */
11133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				printf(" %d ", val);
11233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			}
11333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
11433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 8:
11533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			if (infoarray[k].is_signed) {
11633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				int64_t val = *(int64_t *)
11733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					(data +
11833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					 infoarray[k].location);
11933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				if ((val >> infoarray[k].bits_used) & 1)
12033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					val = (val & infoarray[k].mask) |
12133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall						~infoarray[k].mask;
12233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				/* special case for timestamp */
12333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				if (infoarray[k].scale == 1.0f &&
12433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				    infoarray[k].offset == 0.0f)
12533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf(" %lld", val);
12633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				else
12733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf("%05f ", ((float)val +
12833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall							 infoarray[k].offset)*
12933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					       infoarray[k].scale);
13033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			}
13133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
13233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		default:
13333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
13433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
13533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
13633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("\n");
13733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
13833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
13933ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid enable_flick(char *p){
14033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int ret;
14133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("flick:%s\n", p);
14233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_int_on", p, 1);
14333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
14433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
14533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_upper", p, 3147790);
14633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
14733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
14833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_lower", p, -3147790);
14933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
15033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
15133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
15233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_counter", p, 50);
15333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
15433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
15533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_message_on", p, 0);
15633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
15733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
15833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("flick_axis", p, 0);
15933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
16033ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid HandleOrient(int orient)
16133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
16233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x01)
16333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_X_UP\n");
16433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x02)
16533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_X_DOWN\n");
16633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x04)
16733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_Y_UP\n");
16833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x08)
16933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_Y_DOWN\n");
17033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x10)
17133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_Z_UP\n");
17233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x20)
17333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_Z_DOWN\n");
17433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (orient & 0x40)
17533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("INV_ORIENTATION_FLIP\n");
17633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
17733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
17833ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid HandleTap(int tap)
17933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
18033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int tap_dir = tap/8;
18133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int tap_num = tap%8 + 1;
18233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
18333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    switch (tap_dir) {
18433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 1:
18533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_X_POS\n");
18633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
18733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 2:
18833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_X_NEG\n");
18933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
19033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 3:
19133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_Y_POS\n");
19233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
19333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 4:
19433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_Y_NEG\n");
19533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
19633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 5:
19733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_Z_POS\n");
19833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
19933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        case 6:
20033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            printf("INV_TAP_AXIS_Z_NEG\n");
20133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
20233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        default:
20333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall            break;
20433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    }
20533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    printf("Tap number: %d\n", tap_num);
20633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
20733ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid setup_dmp(char *dev_path){
20833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char sysfs_path[200];
20933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char dmp_path[200];
21033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int  ret;
21133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	FILE *fd;
21233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	sprintf(sysfs_path, "%s", dev_path);
21333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("sysfs: %s\n", sysfs_path);
21433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("power_state", sysfs_path, 1);
21533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
21633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
21733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
21833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("in_accel_scale", dev_path, 0);
21933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
22033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
22133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("in_anglvel_scale", dev_path, 3);
22233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
22333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
22433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("sampling_frequency", sysfs_path, 200);
22533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
22633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
22733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("firmware_loaded", sysfs_path, 0);
22833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
22933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
23033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	sprintf(dmp_path, "%s/dmp_firmware", dev_path);
23133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if ((fd = fopen(dmp_path, "wb")) < 0 ) {
23233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		perror("dmp fail");
23333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
23433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	inv_load_dmp(fd);
23533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	fclose(fd);
23633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("firmware_loaded=%d\n", read_sysfs_posint("firmware_loaded", sysfs_path));
23733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("dmp_on", sysfs_path, 1);
23833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
23933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
24033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("dmp_int_on", sysfs_path, 1);
24133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
24233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
24333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("display_orientation_on", sysfs_path, 1);
24433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
24533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
24633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	enable_flick(sysfs_path);
24733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("tap_on", sysfs_path, 1);
24833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
24933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
25033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("orientation_on", sysfs_path, 1);
25133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
25233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		return;
25333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
25433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
25533ce91b37062fa63af192f5643de93f3beebe854JP Abgrallvoid get_dmp_event(char *dev_dir_name) {
25633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char file_name[100];
25733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int i;
25833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int fp_flick, fp_tap, fp_orient, fp_disp;
25933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int data;
26033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char d[4];
26133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	FILE *fp;
26233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	struct pollfd pfd[4];
26333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("%s\n", dev_dir_name);
26433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	while(1) {
26533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		sprintf(file_name, "%s/event_flick", dev_dir_name);
26633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		fp_flick = open(file_name, O_RDONLY | O_NONBLOCK);
26733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		sprintf(file_name, "%s/event_tap", dev_dir_name);
26833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		fp_tap = open(file_name, O_RDONLY | O_NONBLOCK);
26933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		sprintf(file_name, "%s/event_orientation", dev_dir_name);
27033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		fp_orient = open(file_name, O_RDONLY | O_NONBLOCK);
27133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		sprintf(file_name, "%s/event_display_orientation", dev_dir_name);
27233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		fp_disp = open(file_name, O_RDONLY | O_NONBLOCK);
27333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
27433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[0].fd = fp_flick;
27533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[0].events = POLLPRI|POLLERR,
27633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[0].revents = 0;
27733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
27833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[1].fd = fp_tap;
27933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[1].events = POLLPRI|POLLERR,
28033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[1].revents = 0;
28133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
28233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[2].fd = fp_orient;
28333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[2].events = POLLPRI|POLLERR,
28433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[2].revents = 0;
28533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
28633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[3].fd = fp_disp;
28733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[3].events = POLLPRI|POLLERR,
28833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		pfd[3].revents = 0;
28933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
29033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		read(fp_flick, d, 4);
29133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		read(fp_tap, d, 4);
29233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		read(fp_orient, d, 4);
29333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		read(fp_disp, d, 4);
29433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
29533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		poll(pfd, 4, -1);
29633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		close(fp_flick);
29733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		close(fp_tap);
29833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		close(fp_orient);
29933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		close(fp_disp);
30033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
30133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		for (i=0; i< ARRAY_SIZE(pfd); i++) {
30233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			if(pfd[i].revents != 0) {
30333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				switch (i){
30433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				case 0:
30533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					sprintf(file_name, "%s/event_flick", dev_dir_name);
30633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fp = fopen(file_name, "rt");
30733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fscanf(fp, "%d\n", &data);
30833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf("flick=%x\n", data);
30933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fclose(fp);
31033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				break;
31133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				case 1:
31233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					sprintf(file_name, "%s/event_tap", dev_dir_name);
31333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fp = fopen(file_name, "rt");
31433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fscanf(fp, "%d\n", &data);
31533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf("tap=%x\n", data);
31633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					HandleTap(data);
31733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fclose(fp);
31833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				break;
31933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				case 2:
32033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					sprintf(file_name, "%s/event_orientation", dev_dir_name);
32133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fp = fopen(file_name, "rt");
32233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fscanf(fp, "%d\n", &data);
32333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf("orient=%x\n", data);
32433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					HandleOrient(data);
32533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fclose(fp);
32633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				break;
32733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				case 3:
32833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					sprintf(file_name, "%s/event_display_orientation", dev_dir_name);
32933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fp = fopen(file_name, "rt");
33033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fscanf(fp, "%d\n", &data);
33133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					printf("display_orient=%x\n", data);
33233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					fclose(fp);
33333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				break;
33433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				}
33533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			}
33633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
33733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
33833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
33933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
34033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
34133ce91b37062fa63af192f5643de93f3beebe854JP Abgrallint main(int argc, char **argv)
34233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall{
34333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	unsigned long num_loops = 2;
34433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	unsigned long timedelay = 100000;
34533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	unsigned long buf_len = 128;
34633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
34733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int ret, c, i, j, toread;
34833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int fp;
34933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
35033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int num_channels;
35133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char *trigger_name = NULL;
35233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char *dev_dir_name, *buf_dir_name;
35333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
35433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int datardytrigger = 1;
35533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char *data;
35633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int read_size;
35733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int dev_num, trig_num;
35833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char *buffer_access;
35933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int scan_size;
36033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int noevents = 0;
36133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	int p_event = 0, nodmp = 0;
36233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char *dummy;
36333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char chip_name[10];
36433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char device_name[10];
36533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	char sysfs[100];
36633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
36733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	struct iio_channel_info *infoarray;
36833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/*set r means no DMP is enabled. should be used for mpu3050.
36933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	  set p means no print of data*/
37033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* when p is set, 1 means orientation, 2 means tap, 3 means flick*/
37133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	while ((c = getopt(argc, argv, "l:w:c:pret:")) != -1) {
37233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		switch (c) {
37333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 't':
37433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			trigger_name = optarg;
37533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			datardytrigger = 0;
37633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
37733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'e':
37833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			noevents = 1;
37933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
38033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'p':
38133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			p_event = 1;
38233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
38333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'r':
38433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			nodmp = 1;
38533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
38633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'c':
38733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			num_loops = strtoul(optarg, &dummy, 10);
38833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
38933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'w':
39033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			timedelay = strtoul(optarg, &dummy, 10);
39133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
39233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case 'l':
39333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			buf_len = strtoul(optarg, &dummy, 10);
39433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			break;
39533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		case '?':
39633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			return -1;
39733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
39833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
39933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	inv_get_sysfs_path(sysfs);
40033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("sss:::%s\n", sysfs);
40133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (inv_get_chip_name(chip_name) != INV_SUCCESS) {
40233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("get chip name fail\n");
40333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		exit(0);
40433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
40533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("chip_name=%s\n", chip_name);
40633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (INV_SUCCESS != inv_check_key())
40733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        	printf("key check fail\n");
40833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	else
40933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        	printf("key authenticated\n");
41033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
41133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	for (i=0; i<strlen(chip_name); i++) {
41233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		device_name[i] = tolower(chip_name[i]);
41333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
41433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	device_name[strlen(chip_name)] = '\0';
41533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("device name: %s\n", device_name);
41633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
41733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Find the device requested */
41833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	dev_num = find_type_by_name(device_name, "iio:device");
41933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (dev_num < 0) {
42033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("Failed to find the %s\n", device_name);
42133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -ENODEV;
42233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_ret;
42333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
42433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("iio device number being used is %d\n", dev_num);
42533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
42633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
42733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (trigger_name == NULL) {
42833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		/*
42933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		 * Build the trigger name. If it is device associated it's
43033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		 * name is <device_name>_dev[n] where n matches the device
43133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		 * number found above
43233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		 */
43333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = asprintf(&trigger_name,
43433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			       "%s-dev%d", device_name, dev_num);
43533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		if (ret < 0) {
43633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			ret = -ENOMEM;
43733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			goto error_ret;
43833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
43933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
44033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1);
44133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("accl_enable", dev_dir_name, 1);
44233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("compass_enable", dev_dir_name, 1);
44333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("firmware_loaded", dev_dir_name, 0);
44433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
44533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Verify the trigger exists */
44633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	trig_num = find_type_by_name(trigger_name, "trigger");
44733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (trig_num < 0) {
44833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("Failed to find the trigger %s\n", trigger_name);
44933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -ENODEV;
45033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_triggername;
45133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
45233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("iio trigger number being used is %d\n", trig_num);
45333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/*
45433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 * Parse the files in scan_elements to identify what channels are
45533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 * present
45633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 */
45733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = 0;
45833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = enable(dev_dir_name, &infoarray, &num_channels);
45933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret) {
46033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("error enable\n");
46133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_triggername;
46233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
46333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
46433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (nodmp ==0)
46533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		setup_dmp(dev_dir_name);
46633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
46733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/*
46833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 * Construct the directory name for the associated buffer.
46933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 * As we know that the lis3l02dq has only one buffer this may
47033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 * be built rather than found.
47133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	 */
47233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num);
47333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0) {
47433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -ENOMEM;
47533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_triggername;
47633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
47733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	printf("%s %s\n", dev_dir_name, trigger_name);
47833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
47933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Set the device trigger to be the data rdy trigger found above */
48033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_string_and_verify("trigger/current_trigger",
48133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					dev_dir_name,
48233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					trigger_name);
48333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0) {
48433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("Failed to write current_trigger file\n");
48533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_buf_dir_name;
48633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
48733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Setup ring buffer parameters */
48833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* length must be even number because iio_store_to_sw_ring is expecting
48933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		half pointer to be equal to the read pointer, which is impossible
49033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		when buflen is odd number. This is actually a bug in the code */
49133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("length", buf_dir_name, buf_len*2);
49233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
49333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto exit_here;
49433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1);
49533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("accl_enable", dev_dir_name, 1);
49633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int_and_verify("compass_enable", dev_dir_name, 1);
49733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (nodmp == 0)
49833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = write_sysfs_int_and_verify("quaternion_on", dev_dir_name, 1);
49933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	else
50033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = disable_q_out(dev_dir_name, &infoarray, &num_channels);
50133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = build_channel_array(dev_dir_name, &infoarray, &num_channels);
50233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret) {
50333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("Problem reading scan element information\n");
50433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto exit_here;
50533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
50633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
50733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Enable the buffer */
50833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("enable", buf_dir_name, 1);
50933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0)
51033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto exit_here;
51133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	scan_size = size_from_channelarray(infoarray, num_channels);
51233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	data = malloc(scan_size*buf_len);
51333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (!data) {
51433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -ENOMEM;
51533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto exit_here;
51633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
51733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
51833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = asprintf(&buffer_access,
51933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		       "/dev/iio:device%d",
52033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		       dev_num);
52133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (ret < 0) {
52233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -ENOMEM;
52333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_data;
52433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
52533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (p_event) {
52633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		get_dmp_event(dev_dir_name);
52733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_buffer_access;
52833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
52933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Attempt to open non blocking the access dev */
53033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	fp = open(buffer_access, O_RDONLY | O_NONBLOCK);
53133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (fp == -1) { /*If it isn't there make the node */
53233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		printf("Failed to open %s\n", buffer_access);
53333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		ret = -errno;
53433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		goto error_free_buffer_access;
53533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
53633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Wait for events 10 times */
53733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	for (j = 0; j < num_loops; j++) {
53833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		if (!noevents) {
53933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			struct pollfd pfd = {
54033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				.fd = fp,
54133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				.events = POLLIN,
54233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			};
54333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			poll(&pfd, 1, -1);
54433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			toread = 1;
54533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			if ((j%128)==0)
54633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				usleep(timedelay);
54733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
54833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		} else {
54933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			usleep(timedelay);
55033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			toread = 1;
55133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
55233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		read_size = read(fp,
55333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				 data,
55433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				 toread*scan_size);
55533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		if (read_size == -EAGAIN) {
55633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			printf("nothing available\n");
55733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			continue;
55833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
55933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		if (0 == p_event) {
56033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall			for (i = 0; i < read_size/scan_size; i++)
56133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall				process_scan(data + scan_size*i,
56233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					     infoarray,
56333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall					     num_channels);
56433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		}
56533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	}
56633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	close(fp);
56733ce91b37062fa63af192f5643de93f3beebe854JP Abgrallerror_free_buffer_access:
56833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	free(buffer_access);
56933ce91b37062fa63af192f5643de93f3beebe854JP Abgrallerror_free_data:
57033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	free(data);
57133ce91b37062fa63af192f5643de93f3beebe854JP Abgrallexit_here:
57233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	/* Stop the ring buffer */
57333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	ret = write_sysfs_int("enable", buf_dir_name, 0);
57433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
57533ce91b37062fa63af192f5643de93f3beebe854JP Abgrallerror_free_buf_dir_name:
57633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	free(buf_dir_name);
57733ce91b37062fa63af192f5643de93f3beebe854JP Abgrallerror_free_triggername:
57833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	if (datardytrigger)
57933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall		free(trigger_name);
58033ce91b37062fa63af192f5643de93f3beebe854JP Abgrallerror_ret:
58133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall	return ret;
58233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
583