1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Copyright (c) Invensense Inc. 2012 3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * This program is free software; you can redistribute it and/or modify it 5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * under the terms of the GNU General Public License version 2 as published by 6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * the Free Software Foundation. 7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <unistd.h> 10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h> 11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <fcntl.h> 12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h> 13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <errno.h> 14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <sys/stat.h> 15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h> 16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <linux/types.h> 17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h> 18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <poll.h> 19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <termios.h> 20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "iio_utils.h" 22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_load_dmp.h" 23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_sysfs_helper.h" 24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "authenticate.h" 25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "mlos.h" 26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define DMP_CODE_SIZE (3060) 28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define POLL_TIME (2000) // 2sec 29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// settings 31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int accel_only = false; 32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_motion = false; 33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_flick = false; 34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_pedometer = false; 35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int test_orientation = false; 36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint verbose = false; 37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// paths 39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarochar *dev_dir_name, *buf_dir_name; 40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// all the DMP features supported 42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum { 43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_TAP = 0, 44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_ORIENTATION, 45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_DISPLAY_ORIENTATION, 46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_MOTION, 47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_FLICK, 48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FEAT_NUM, 50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} features; 51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarotypedef void (*handler_t) (int data); 53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct dmp_feat_t { 55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int enabled; 56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct pollfd *pollfd; 57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *sysfs_name; 58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handler_t phandler; 59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}; 60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct dmp_feat_t dmp_feat[FEAT_NUM] = {{0}}; 62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic struct pollfd pollfds[FEAT_NUM]; 63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int pollfds_used = 0; 64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/************************************************** 66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro This _kbhit() function is courtesy of the web 67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro***************************************************/ 68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint _kbhit(void) 69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static const int STDIN = 0; 71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static bool initialized = false; 72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!initialized) { 74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // Use termios to turn off line buffering 75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct termios term; 76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro tcgetattr(STDIN, &term); 77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro term.c_lflag &= ~ICANON; 78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro tcsetattr(STDIN, TCSANOW, &term); 79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro setbuf(stdin, NULL); 80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro initialized = true; 81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int bytesWaiting; 84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ioctl(STDIN, FIONREAD, &bytesWaiting); 85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return bytesWaiting; 86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * size_from_channelarray() - calculate the storage size of a scan 90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @channels: the channel info array 91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @num_channels: size of the channel info array 92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Has the side effect of filling the channels[i].location values used 94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * in processing the buffer output. 95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint size_from_channelarray(struct iio_channel_info *channels, int num_channels) 97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int bytes = 0; 99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i = 0; 100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (i < num_channels) { 101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (bytes % channels[i].bytes == 0) 102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro channels[i].location = bytes; 103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro else 104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro channels[i].location = bytes - bytes%channels[i].bytes 105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro + channels[i].bytes; 106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro bytes = channels[i].location + channels[i].bytes; 107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro i++; 108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return bytes; 110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid print2byte(int input, struct iio_channel_info *info) 113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* shift before conversion to avoid sign extension 115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro of left aligned data */ 116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro input = input >> info->shift; 117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (info->is_signed) { 118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int16_t val = input; 119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val &= (1 << info->bits_used) - 1; 120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val = (int16_t)(val << (16 - info->bits_used)) >> 121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (16 - info->bits_used); 122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /*printf("%d, %05f, scale=%05f", val, 123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (float)(val + info->offset)*info->scale, info->scale);*/ 124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("%d, ", val); 125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro uint16_t val = input; 128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val &= (1 << info->bits_used) - 1; 129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("%05f ", ((float)val + info->offset)*info->scale); 130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * process_scan() - print out the values in SI units 135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @data: pointer to the start of the scan 136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @infoarray: information about the channels. Note 137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * size_from_channelarray must have been called first to fill the 138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * location offsets. 139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @num_channels: the number of active channels 140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid process_scan(char *data, struct iio_channel_info *infoarray, 142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int num_channels) 143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int k; 145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //char *tmp; 146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (k = 0; k < num_channels; k++) { 147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro switch (infoarray[k].bytes) { 148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* only a few cases implemented so far */ 149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 2: 150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro print2byte(*(uint16_t *)(data + infoarray[k].location), 151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro &infoarray[k]); 152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //tmp = data + infoarray[k].location; 153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 4: 155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (infoarray[k].is_signed) { 156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int32_t val = *(int32_t *)(data + infoarray[k].location); 157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((val >> infoarray[k].bits_used) & 1) 158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val = (val & infoarray[k].mask) | ~infoarray[k].mask; 159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* special case for timestamp */ 160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf(" %d ", val); 161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 8: 164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (infoarray[k].is_signed) { 165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int64_t val = *(int64_t *)(data + infoarray[k].location); 166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((val >> infoarray[k].bits_used) & 1) 167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val = (val & infoarray[k].mask) | ~infoarray[k].mask; 168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* special case for timestamp */ 169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (infoarray[k].scale == 1.0f && 170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro infoarray[k].offset == 0.0f) 171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf(" %lld", val); 172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro else 173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("%05f ", ((float)val + infoarray[k].offset) 174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * infoarray[k].scale); 175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro default: 178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("\n"); 182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Enablers for the gestures 186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/ 187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_flick(char *p, int on) 189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("flick:%s\n", p); 192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_int_on", p, on); 193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_upper", p, 3147790); 196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_lower", p, -3147790); 199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_counter", p, 50); 202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_message_on", p, 0); 205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("flick_axis", p, 0); 208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid verify_img(char *dmp_path) 215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *fp; 217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i; 218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char dmp_img[DMP_CODE_SIZE]; 219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((fp = fopen(dmp_path, "rb")) < 0) { 221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro perror("dmp fail"); 222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro i = fread(dmp_img, 1, DMP_CODE_SIZE, fp); 224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Result=%d\n", i); 225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(fp); 226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fp = fopen("/dev/read_img.h", "wt"); 227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(fp, "char rec[]={\n"); 228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for(i = 0; i < DMP_CODE_SIZE; i++) { 229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(fp, "0x%02x, ", dmp_img[i]); 230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if(((i + 1) % 16) == 0) { 231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(fp, "\n"); 232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(fp, "};\n "); 235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(fp); 236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint setup_dmp(char *dev_path, int p_event) 239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char dmp_path[100]; 241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *fd; 243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: sysfs path=%s\n", dev_path); 245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("power_state", dev_path, 1); 247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int("in_accel_scale", dev_path, 0); 251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int("in_anglvel_scale", dev_path, 3); 254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int("sampling_frequency", dev_path, 200); 257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("firmware_loaded", dev_path, 0); 260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(dmp_path, "%s/dmp_firmware", dev_path); 264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((fd = fopen(dmp_path, "wb")) < 0 ) { 265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro perror("dmp fail"); 266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro inv_load_dmp(fd); 268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(fd); 269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: firmware_loaded=%d\n", 271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro read_sysfs_posint("firmware_loaded", dev_path)); 272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // set accel offsets 274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //ret = write_sysfs_int_and_verify("in_accel_x_offset", 275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // dev_path, 0xabcd0000); 276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //if (ret < 0) 277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // return ret; 278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //ret = write_sysfs_int_and_verify("in_accel_y_offset", 279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // dev_path, 0xffff0000); 280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //if (ret < 0) 281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // return ret; 282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //ret = write_sysfs_int_and_verify("in_accel_z_offset", 283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // dev_path, 0xcdef0000); 284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //if (ret < 0) 285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // return ret; 286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("dmp_on", dev_path, 1); 288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("dmp_int_on", dev_path, 1); 291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* select which event to enable and interrupt on/off here */ 295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_flick) { 296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_flick(dev_path, 1); 297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* 302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("tap_on", dev_path, 1); 303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /*ret = write_sysfs_int_and_verify("display_orientation_on", 308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dev_path, 1); 309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret;*/ 311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_orientation) { 312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("orientation_on", dev_path, 1); 313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* ret = write_sysfs_int_and_verify("dmp_output_rate", dev_path, 25); 317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret;*/ 319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("dmp_event_int_on", dev_path, p_event); 320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //verify_img(dmp_path); 324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Handlers for the gestures 329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/ 330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_flick(int flick) 332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("flick=%x\n", flick); 334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_display_orientation(int orient) 337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("display_orientation=%x\n", orient); 339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_motion(int motion) 342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("motion=%x\n", motion); 344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_orientation(int orient) 347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("orientation="); 349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x01) 350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+X, "); 351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x02) 352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-X, "); 353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x04) 354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+Y, "); 355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x08) 356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-Y, "); 357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x10) 358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+Z, "); 359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x20) 360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-Z, "); 361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (orient & 0x40) 362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("flip"); 363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("\n"); 364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid handle_tap(int tap) 367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int tap_dir = tap / 8; 369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int tap_num = tap % 8 + 1; 370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("tap="); 372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro switch (tap_dir) { 373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 1: 374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+X, "); 375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 2: 377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-X, "); 378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 3: 380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+Y, "); 381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 4: 383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-Y, "); 384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 5: 386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("+Z, "); 387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 6: 389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("-Z, "); 390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro default: 392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("#%d\n", tap_num); 395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint handle_pedometer(int *got_event) 398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static int last_pedometer_steps = -1; 400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static long last_pedometer_time = -1; 401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static unsigned long last_pedometer_poll = 0L; 402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static unsigned long pedometer_poll_timeout = 500L; // .5 second 403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned long now; 405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int pedometer_steps; 406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro long pedometer_time; 407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef DEBUG_PRINT 409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("GT:Pedometer Handler\n"); 410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif 411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((now = inv_get_tick_count()) - last_pedometer_poll 413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro < pedometer_poll_timeout) { 414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro last_pedometer_poll = now; 417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pedometer_steps = read_sysfs_posint("pedometer_steps", dev_dir_name); 419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pedometer_time = read_sysfs_posint("pedometer_time", dev_dir_name); 420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (last_pedometer_steps == -1 && last_pedometer_time == -1) { 422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!*got_event) 423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("\n"); 424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("p> pedometer=%d, %ld ", 425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pedometer_steps, pedometer_time); 426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (pedometer_steps > 10 427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro || pedometer_time > (pedometer_poll_timeout * 2)) 428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("(resumed)\n"); 429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro else 430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("\n"); 431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *got_event = true; 432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else if (last_pedometer_steps != pedometer_steps 433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro || last_pedometer_time != pedometer_time) { 434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!*got_event) 435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("\n"); 436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("p> pedometer=%d, %ld\n", 437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pedometer_steps, pedometer_time); 438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *got_event = true; 439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro last_pedometer_steps = pedometer_steps; 442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro last_pedometer_time = pedometer_time; 443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Main processing functions 449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/ 450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid dump_dmp_event_struct(void) 452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define VARVAL(f, v) printf("\t%s : " f "\n", #v, v); 454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i; 455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("dmp_feat structure content:\n"); 457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < FEAT_NUM; i++) { 458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("%d - ", i); 459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", dmp_feat[i].enabled); 460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%s", dmp_feat[i].sysfs_name); 461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%p", dmp_feat[i].phandler); 462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%p", dmp_feat[i].pollfd); 463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dmp_feat[i].pollfd) { 464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", dmp_feat[i].pollfd->events); 465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", dmp_feat[i].pollfd->revents); 466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", dmp_feat[i].pollfd->fd); 467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("dmp_feat structure content:\n"); 470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < FEAT_NUM; i++) { 471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("%d - ", i); 472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", pollfds[i].fd); 473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", pollfds[i].events); 474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro VARVAL("%d", pollfds[i].revents); 475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("end.\n"); 477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid init_dmp_event_fds(void) 480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i, j = 0; 482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char file_name[100]; 483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < FEAT_NUM; i++) { 485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!dmp_feat[i].enabled) 486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro continue; 487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(file_name, "%s/%s", dev_dir_name, dmp_feat[i].sysfs_name); 488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds[j].fd = open(file_name, O_RDONLY | O_NONBLOCK); 489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (pollfds[j].fd < 0) { 490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Err: cannot open requested event file '%s'\n", file_name); 491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: opened event node '%s'\n", file_name); 493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds[j].events = POLLPRI | POLLERR; 495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds[j].revents = 0; 496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[i].pollfd = &pollfds[j]; 498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro j++; 499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid close_dmp_event_fds(void) 503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i; 505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < pollfds_used; i++) 506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro close(pollfds[i].fd); 507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid poll_dmp_event_fds(void) 510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int i; 512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char d[4]; 513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro static int got_event = 1; 514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // read the pollable fds 516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < pollfds_used; i++) 517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro read(pollfds[i].fd, d, 4); 518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // poll 520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (got_event) 521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("e> "); 522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro got_event = false; 523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro poll(pollfds, pollfds_used, POLL_TIME); 524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < FEAT_NUM; i++) { 526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!dmp_feat[i].enabled) 527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro continue; 528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dmp_feat[i].pollfd->revents != 0) { 530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char file_name[200]; 531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int data; 532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(file_name, "%s/%s", 534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dev_dir_name, dmp_feat[i].sysfs_name); 535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *fp = fopen(file_name, "rt"); 536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!fp) { 537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Err:cannot open requested event file '%s'\n", 538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[i].sysfs_name); 539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro continue; 540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(fp, "%d\n", &data); 542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(fp); 543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[i].pollfd->revents = 0; 544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[i].phandler(data); 546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro got_event = true; 547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_pedometer) { 551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* pedometer is not event based, therefore we poll using a timer every 552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pedometer_poll_timeout milliseconds */ 553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_pedometer(&got_event); 554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* 558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro Main 559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro*/ 560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint main(int argc, char **argv) 562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned long num_loops = 2; 564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned long timedelay = 100000; 565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned long buf_len = 128; 566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret, c, i, j, toread; 568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int fp; 569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int num_channels; 571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *trigger_name = NULL; 572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int datardytrigger = 1; 574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *data; 575c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int read_size; 576c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int dev_num, trig_num; 577c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *buffer_access; 578c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int scan_size; 579c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int noevents = 0; 580c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int p_event = 0, nodmp = 0; 581c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *dummy; 582c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char chip_name[10]; 583c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char device_name[10]; 584c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char sysfs[100]; 585c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 586c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info *infoarray; 587c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 588c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // all output to stdout must be delivered immediately, no buffering 589c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro setvbuf(stdout, NULL, _IONBF, 0); 590c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 591c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // get info about the device and driver 592c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro inv_get_sysfs_path(sysfs); 593c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (inv_get_chip_name(chip_name) != INV_SUCCESS) { 594c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("get chip name fail\n"); 595c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro exit(0); 596c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 597c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: chip_name=%s\n", chip_name); 598c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 599c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < strlen(chip_name); i++) 600c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro device_name[i] = tolower(chip_name[i]); 601c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro device_name[strlen(chip_name)] = '\0'; 602c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: device name=%s\n", device_name); 603c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 604c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* parse the command line parameters 605c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro -r means no DMP is enabled (raw) -> should be used for mpu3050. 606c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro -p means no print of data 607c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro when using -p, 1 means orientation, 2 means tap, 3 means flick */ 608c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while ((c = getopt(argc, argv, "l:w:c:premavt:")) != -1) { 609c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro switch (c) { 610c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 't': 611c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro trigger_name = optarg; 612c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro datardytrigger = 0; 613c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 614c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'e': 615c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro noevents = 1; 616c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 617c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'p': 618c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro p_event = 1; 619c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 620c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'r': 621c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro nodmp = 1; 622c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 623c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'c': 624c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro num_loops = strtoul(optarg, &dummy, 10); 625c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 626c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'w': 627c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro timedelay = strtoul(optarg, &dummy, 10); 628c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 629c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'l': 630c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro buf_len = strtoul(optarg, &dummy, 10); 631c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 632c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'm': 633c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro test_motion = true; 634c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 635c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'a': 636c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro accel_only = true; 637c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 638c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case 'v': 639c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro verbose = true; 640c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 641c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro case '?': 642c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -1; 643c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 644c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 645c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 646c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used = 0; 647c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 648c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // comment out/remove/if(0) the block corresponding to the feature 649c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // that you want to disable 650c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 651c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (0) { 652c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct dmp_feat_t f = { 653c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro true, 654c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro NULL, 655c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "event_tap", 656c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_tap 657c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 658c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[pollfds_used] = f; 659c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used++; 660c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 661c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_orientation) { 662c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct dmp_feat_t f = { 663c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro true, 664c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro NULL, 665c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "event_orientation", 666c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_orientation 667c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 668c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[pollfds_used] = f; 669c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used++; 670c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 671c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /*if (1) { 672c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct dmp_feat_t f = { 673c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro true, 674c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro NULL, 675c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "event_display_orientation", 676c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_display_orientation 677c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 678c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[pollfds_used] = f; 679c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used++; 680c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }*/ 681c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_motion) { 682c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct dmp_feat_t f = { 683c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro true, 684c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro NULL, 685c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "event_accel_motion", 686c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_motion 687c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 688c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[pollfds_used] = f; 689c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used++; 690c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 691c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_flick) { 692c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct dmp_feat_t f = { 693c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro true, 694c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro NULL, 695c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "event_flick", 696c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro handle_flick 697c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 698c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dmp_feat[pollfds_used] = f; 699c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro pollfds_used++; 700c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 701c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 702c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // debug 703c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO\n"); 704c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: Configured features:\n"); 705c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < pollfds_used; i++) 706c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: %d -> %s\n", i, dmp_feat[i].sysfs_name); 707c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO\n"); 708c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 709c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Find the device requested */ 710c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dev_num = find_type_by_name(device_name, "iio:device"); 711c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dev_num < 0) { 712c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Failed to find the %s\n", device_name); 713c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENODEV; 714c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 715c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 716c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: iio device number=%d\n", dev_num); 717c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); 718c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (trigger_name == NULL) { 719c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* 720c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Build the trigger name. If it is device associated it's 721c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * name is <device_name>_dev[n] where n matches the device 722c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * number found above 723c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 724c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&trigger_name, "%s-dev%d", device_name, dev_num); 725c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 726c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 727c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 728c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 729c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 730c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 731c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("master_enable", dev_dir_name, 0); 732c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 733c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 734c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("buffer/enable", dev_dir_name, 0); 735c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 736c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 737c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("power_state", dev_dir_name, 1); 738c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 739c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // 740c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // motion interrupt in low power accel mode 741c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // 742c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test_motion) { 743c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("motion_lpa_on", dev_dir_name, 1); 744c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 745c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 746c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // magnitude threshold - range [0, 1020] in 32 mg increments 747c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("motion_lpa_threshold", dev_dir_name, 748c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 3 * 32); 749c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 750c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 751c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // duration in ms up to 2^16 752c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // ret = write_sysfs_int_and_verify("motion_lpa_dur", dev_dir_name, 753c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // 200 * 1); 754c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //if (ret < 0) 755c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // return ret; 756c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // motion_lpa_freq: 0 for 1.25, 1 for 5, 2 for 20, 3 for 40 Hz update rate 757c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // of the low power accel mode. 758c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // The higher the rate, the better responsiveness of the motion interrupt. 759c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int("motion_lpa_freq", dev_dir_name, 2); 760c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 761c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 762c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 763c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("motion_lpa_on", dev_dir_name, 0); 764c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 765c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 766c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 767c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 768c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Verify the trigger exists */ 769c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro trig_num = find_type_by_name(trigger_name, "trigger"); 770c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (trig_num < 0) { 771c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Failed to find the trigger %s\n", trigger_name); 772c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENODEV; 773c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_triggername; 774c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 775c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("INFO: iio trigger number=%d\n", trig_num); 776c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 777c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!nodmp) 778c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro setup_dmp(dev_dir_name, p_event); 779c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 780c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* 781c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Construct the directory name for the associated buffer. 782c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * As we know that the lis3l02dq has only one buffer this may 783c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * be built rather than found. 784c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 785c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num); 786c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 787c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 788c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_triggername; 789c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 790c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 791c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Set the device trigger to be the data rdy trigger found above */ 792c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_string_and_verify("trigger/current_trigger", 793c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dev_dir_name, 794c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro trigger_name); 795c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 796c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Failed to write current_trigger file\n"); 797c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_buf_dir_name; 798c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 799c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 800c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Setup ring buffer parameters 801c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro length must be even number because iio_store_to_sw_ring is expecting 802c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro half pointer to be equal to the read pointer, which is impossible 803c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro when buflen is odd number. This is actually a bug in the code */ 804c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int("length", buf_dir_name, buf_len * 2); 805c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 806c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto exit_here; 807c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 808c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // gyro 809c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (accel_only) { 810c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_anglvel_se(dev_dir_name, &infoarray, &num_channels, 0); 811c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 812c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 813c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 0); 814c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 815c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 816c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 817c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_anglvel_se(dev_dir_name, &infoarray, &num_channels, 1); 818c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 819c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 820c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1); 821c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 822c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 823c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 824c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 825c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // accel 826c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_accel_se(dev_dir_name, &infoarray, &num_channels, 1); 827c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 828c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 829c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("accel_enable", dev_dir_name, 1); 830c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 831c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 832c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 833c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro // quaternion 834c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!nodmp) { 835c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_quaternion_se(dev_dir_name, &infoarray, &num_channels, 1); 836c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 837c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 838c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("three_axes_q_on", dev_dir_name, 1); 839c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 840c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 841c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 842c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = enable_quaternion_se(dev_dir_name, &infoarray, &num_channels, 0); 843c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 844c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 845c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("dmp_on", dev_dir_name, 0); 846c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 847c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 848c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 849c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 850c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //sprintf(dmp_path, "%s/dmp_firmware", dev_dir_name); 851c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //verify_img(dmp_path); 852c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 853c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = build_channel_array(dev_dir_name, &infoarray, &num_channels); 854c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret) { 855c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Problem reading scan element information\n"); 856c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto exit_here; 857c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 858c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 859c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* enable the buffer */ 860c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("enable", buf_dir_name, 1); 861c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 862c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto exit_here; 863c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro scan_size = size_from_channelarray(infoarray, num_channels); 864c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro data = malloc(scan_size * buf_len); 865c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!data) { 866c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 867c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto exit_here; 868c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 869c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*ADDED*/ 870c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("master_enable", dev_dir_name, 1); 871c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 872c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 873c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (p_event) { 874c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 875c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* polling events from the DMP */ 876c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro init_dmp_event_fds(); 877c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while(!_kbhit()) 878c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro poll_dmp_event_fds(); 879c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro close_dmp_event_fds(); 880c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 881c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 882c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 883c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* attempt to open non blocking the access dev */ 884c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&buffer_access, "/dev/iio:device%d", dev_num); 885c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 886c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 887c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_data; 888c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 889c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fp = open(buffer_access, O_RDONLY | O_NONBLOCK); 890c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (fp == -1) { /*If it isn't there make the node */ 891c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Failed to open %s\n", buffer_access); 892c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 893c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_buffer_access; 894c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 895c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* wait for events num_loops times */ 896c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (j = 0; j < num_loops; j++) { 897c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!noevents) { 898c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct pollfd pfd = { 899c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro .fd = fp, 900c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro .events = POLLIN, 901c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro }; 902c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro poll(&pfd, 1, -1); 903c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro toread = 1; 904c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (j % 128 == 0) 905c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro usleep(timedelay); 906c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 907c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } else { 908c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro usleep(timedelay); 909c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro toread = 1; 910c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 911c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro read_size = read(fp, data, toread * scan_size); 912c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (read_size == -EAGAIN) { 913c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("nothing available\n"); 914c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro continue; 915c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 916c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!p_event) { 917c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = 0; i < read_size / scan_size; i++) 918c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro process_scan(data + scan_size * i, infoarray, num_channels); 919c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 920c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 921c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro close(fp); 922c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 923c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 924c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_buffer_access: 925c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(buffer_access); 926c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_data: 927c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(data); 928c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroexit_here: 929c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* stop the ring buffer */ 930c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("enable", buf_dir_name, 0); 931c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* disable the dmp */ 932c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (p_event) 933c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = write_sysfs_int_and_verify("dmp_on", dev_dir_name, 0); 934c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 935c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_buf_dir_name: 936c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(buf_dir_name); 937c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_triggername: 938c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (datardytrigger) 939c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(trigger_name); 940c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret: 941c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 942c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 943