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