12eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/*
22eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro $License:
32eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    Copyright (C) 2014 InvenSense Corporation, All Rights Reserved.
42eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro $
52eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro */
62eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#undef MPL_LOG_NDEBUG
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MPL_LOG_NDEBUG 0 /* Use 0 to turn on MPL_LOGV output */
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#undef MPL_LOG_TAG
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MPL_LOG_TAG "MLLITE"
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h>
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h>
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_sysfs_helper.h"
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h>
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <ctype.h>
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "log.h"
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MPU_SYSFS_ABS_PATH "/sys/class/invensense/mpu"
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum PROC_SYSFS_CMD {
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_SYSFS_PATH,
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_DMP_PATH,
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_CHIP_NAME,
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_SYSFS_KEY,
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_TRIGGER_PATH,
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	CMD_GET_DEVICE_NODE
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic char sysfs_path[100];
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic char *chip_name[] = {
312eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    "ITG3500",
322eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    "MPU6050",
332eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    "MPU9150",
342eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    "MPU3050",
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    "MPU6500",
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    "MPU9250",
379b7ebb5143dd692c20fc9348ae999450133dad57Nick Vaccaro    "MPU9255",
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    "MPU6XXX",
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    "MPU9350",
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    "MPU6515",
412eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    "MPU6880",
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int chip_ind;
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int initialized =0;
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int status = 0;
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int iio_initialized = 0;
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int iio_dev_num = 0;
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define IIO_MAX_NAME_LENGTH 30
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_TYPE_FILE "%s_type"
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define CHIP_NUM ARRAY_SIZE(chip_name)
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic const char *iio_dir = "/sys/bus/iio/devices/";
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * find_type_by_name() - function to match top level types by name
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @name: top level type instance name
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @type: the type of top level instance being sort
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Typical types this is used for are device and trigger.
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint find_type_by_name(const char *name, const char *type)
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const struct dirent *ent;
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int number, numstrlen;
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *nameFile;
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	DIR *dp;
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char thisname[IIO_MAX_NAME_LENGTH];
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char *filename;
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	dp = opendir(iio_dir);
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (dp == NULL) {
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		MPL_LOGE("No industrialio devices available");
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -ENODEV;
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while (ent = readdir(dp), ent != NULL) {
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (strcmp(ent->d_name, ".") != 0 &&
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			strcmp(ent->d_name, "..") != 0 &&
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			strlen(ent->d_name) > strlen(type) &&
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			strncmp(ent->d_name, type, strlen(type)) == 0) {
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			numstrlen = sscanf(ent->d_name + strlen(type),
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					   "%d",
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					   &number);
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			/* verify the next character is not a colon */
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (strncmp(ent->d_name + strlen(type) + numstrlen,
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					":",
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					1) != 0) {
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				filename = malloc(strlen(iio_dir)
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						+ strlen(type)
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						+ numstrlen
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						+ 6);
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if (filename == NULL)
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					return -ENOMEM;
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				sprintf(filename, "%s%s%d/name",
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					iio_dir,
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					type,
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					number);
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				nameFile = fopen(filename, "r");
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if (!nameFile)
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					continue;
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				free(filename);
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				fscanf(nameFile, "%s", thisname);
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if (strcmp(name, thisname) == 0)
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					return number;
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				fclose(nameFile);
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return -ENODEV;
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* mode 0: search for which chip in the system and fill sysfs path
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   mode 1: return event number
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int parsing_proc_input(int mode, char *name){
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	const char input[] = "/proc/bus/input/devices";
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char line[4096], d;
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char tmp[100];
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *fp;
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int i, j, result, find_flag;
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int event_number = -1;
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int input_number = -1;
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if(NULL == (fp = fopen(input, "rt")) ){
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -1;
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	result = 1;
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	find_flag = 0;
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	while(result != 0 && find_flag < 2){
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		i = 0;
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		d = 0;
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		memset(line, 0, 100);
1382eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro		while(d != '\n'){
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			result = fread(&d, 1, 1, fp);
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if(result == 0){
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				line[0] = 0;
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				break;
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
1442eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro			sprintf(&line[i], "%c", d);
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			i ++;
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if(line[0] == 'N'){
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			i = 1;
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			while(line[i] != '"'){
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				i++;
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			i++;
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			j = 0;
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			find_flag = 0;
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if (mode == 0){
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				while(j < CHIP_NUM){
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					if(!memcmp(&line[i], chip_name[j], strlen(chip_name[j]))){
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						find_flag = 1;
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						chip_ind = j;
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					}
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					j++;
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				}
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			} else if (mode  != 0){
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if(!memcmp(&line[i], name, strlen(name))){
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					find_flag = 1;
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				}
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
1682eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro		}
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if(find_flag){
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			if(mode == 0){
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if(line[0] == 'S'){
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					memset(tmp, 0, 100);
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i =1;
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '=') i++;
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i++;
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					j = 0;
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '\n'){
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						tmp[j] = line[i];
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						i ++; j++;
1802eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro					}
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					sprintf(sysfs_path, "%s%s", "/sys", tmp);
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					find_flag++;
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				}
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			} else if(mode == 1){
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if(line[0] == 'H') {
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i = 2;
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '=') i++;
1882eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro					while(line[i] != 't') i++;
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i++;
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					event_number = 0;
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '\n'){
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						if(line[i] >= '0' && line[i] <= '9')
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro							event_number = event_number*10 + line[i]-0x30;
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						i ++;
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					}
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					find_flag ++;
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				}
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			} else if (mode == 2) {
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				if(line[0] == 'S'){
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					memset(tmp, 0, 100);
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i =1;
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '=') i++;
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					i++;
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					j = 0;
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					while(line[i] != '\n'){
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						tmp[j] = line[i];
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						i ++; j++;
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					}
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					input_number = 0;
2102eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro					if(tmp[j-2] >= '0' && tmp[j-2] <= '9')
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						input_number += (tmp[j-2]-0x30)*10;
2122eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro					if(tmp[j-1] >= '0' && tmp[j-1] <= '9')
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro						input_number += (tmp[j-1]-0x30);
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro					find_flag++;
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro				}
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			}
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	fclose(fp);
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if(find_flag == 0){
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return -1;
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if(0 == mode)
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		status = 1;
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (mode == 1)
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return event_number;
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (mode == 2)
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return input_number;
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic void init_iio() {
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int i, j;
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char iio_chip[10];
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int dev_num;
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	for(j=0; j< CHIP_NUM; j++) {
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		for (i=0; i<strlen(chip_name[j]); i++) {
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			iio_chip[i] = tolower(chip_name[j][i]);
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		iio_chip[strlen(chip_name[j])] = '\0';
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		dev_num = find_type_by_name(iio_chip, "iio:device");
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if(dev_num >= 0) {
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			iio_initialized = 1;
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			iio_dev_num = dev_num;
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			chip_ind = j;
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int process_sysfs_request(enum PROC_SYSFS_CMD cmd, char *data)
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	char key_path[100];
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	FILE *fp;
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	int i, result;
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if(initialized == 0){
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		parsing_proc_input(0, NULL);
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		initialized = 1;
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if(initialized && status == 0) {
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		init_iio();
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (iio_initialized == 0)
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			return -1;
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	memset(key_path, 0, 100);
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	switch(cmd){
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_SYSFS_PATH:
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (iio_initialized == 1)
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(data, "/sys/bus/iio/devices/iio:device%d", iio_dev_num);
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		else
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(data, "%s%s", sysfs_path, "/device/invensense/mpu");
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_DMP_PATH:
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (iio_initialized == 1)
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(data, "/sys/bus/iio/devices/iio:device%d/dmp_firmware", iio_dev_num);
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		else
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(data, "%s%s", sysfs_path, "/device/invensense/mpu/dmp_firmware");
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_CHIP_NAME:
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		sprintf(data, "%s", chip_name[chip_ind]);
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_TRIGGER_PATH:
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		sprintf(data, "/sys/bus/iio/devices/trigger%d", iio_dev_num);
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_DEVICE_NODE:
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		sprintf(data, "/dev/iio:device%d", iio_dev_num);
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	case CMD_GET_SYSFS_KEY:
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		memset(key_path, 0, 100);
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if (iio_initialized == 1)
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(key_path, "/sys/bus/iio/devices/iio:device%d/key", iio_dev_num);
2922eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro		else
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			sprintf(key_path, "%s%s", sysfs_path, "/device/invensense/mpu/key");
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		if((fp = fopen(key_path, "rt")) == NULL)
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			return -1;
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		for(i=0;i<16;i++){
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			fscanf(fp, "%02x", &result);
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro			data[i] = (char)result;
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		}
3012eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		fclose(fp);
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	default:
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		break;
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	}
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	return 0;
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint find_name_by_sensor_type(const char *sensor_type, const char *type, char *sensor_name)
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    const struct dirent *ent;
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int number, numstrlen;
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *nameFile;
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    DIR *dp;
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    char *filename;
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    dp = opendir(iio_dir);
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (dp == NULL) {
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("No industrialio devices available");
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return -ENODEV;
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    while (ent = readdir(dp), ent != NULL) {
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        if (strcmp(ent->d_name, ".") != 0 &&
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            strcmp(ent->d_name, "..") != 0 &&
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            strlen(ent->d_name) > strlen(type) &&
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            strncmp(ent->d_name, type, strlen(type)) == 0) {
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            numstrlen = sscanf(ent->d_name + strlen(type),
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                       "%d",
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                       &number);
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            /* verify the next character is not a colon */
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            if (strncmp(ent->d_name + strlen(type) + numstrlen,
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    ":",
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    1) != 0) {
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                filename = malloc(strlen(iio_dir)
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + strlen(type)
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + numstrlen
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + 6
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + strlen(sensor_type));
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if (filename == NULL)
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    return -ENOMEM;
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                sprintf(filename, "%s%s%d/%s",
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    iio_dir,
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    type,
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    number,
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    sensor_type);
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                nameFile = fopen(filename, "r");
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                MPL_LOGI("sensor type path: %s\n", filename);
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                free(filename);
352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                //fscanf(nameFile, "%s", thisname);
353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                //if (strcmp(name, thisname) == 0) {
354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                if(nameFile == NULL) {
355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    MPL_LOGI("keeps searching");
356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    continue;
357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                } else{
358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    MPL_LOGI("found directory");
359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                }
360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                filename = malloc(strlen(iio_dir)
361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + strlen(type)
362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + numstrlen
363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        + 6);
364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                sprintf(filename, "%s%s%d/name",
365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    iio_dir,
366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    type,
367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    number);
368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    nameFile = fopen(filename, "r");
369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    MPL_LOGI("name path: %s\n", filename);
370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    free(filename);
371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    if (!nameFile)
372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        continue;
373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    fscanf(nameFile, "%s", sensor_name);
374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    MPL_LOGI("name found: %s now test for mpuxxxx", sensor_name);
3752eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro                    if( !strncmp("mpu",sensor_name, 3) ) {
3762eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro                        char secondaryFileName[200];
377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    sprintf(secondaryFileName, "%s%s%d/secondary_name",
378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        iio_dir,
379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        type,
380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        number);
381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        nameFile = fopen(secondaryFileName, "r");
3822eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro                        MPL_LOGI("name path: %s\n", secondaryFileName);
383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        if(!nameFile)
384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                            continue;
385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        fscanf(nameFile, "%s", sensor_name);
386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        MPL_LOGI("secondary name found: %s\n", sensor_name);
387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    else {
389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        fscanf(nameFile, "%s", sensor_name);
390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                        MPL_LOGI("name found: %s\n", sensor_name);
391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    }
392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                    return 0;
393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                //}
394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                fclose(nameFile);
395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro            }
396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        }
397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return -ENODEV;
399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
4012eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  return sysfs key. if the key is not available
403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          return false. So the return value must be checked
404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the key
406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           It should be zeroed before calling this function.
407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_sysfs_key(unsigned char *key)
410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (process_sysfs_request(CMD_GET_SYSFS_KEY, (char*)key) < 0)
412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
4172eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
4182eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro *  @brief  return the sysfs path. If the path is not
419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          found yet. return false. So the return value must be checked
420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the sysfs
422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           path. It should be zeroed before calling this function.
423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_sysfs_path(char *name)
426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (process_sysfs_request(CMD_GET_SYSFS_PATH, name) < 0)
428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_sysfs_abs_path(char *name)
434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    strcpy(name, MPU_SYSFS_ABS_PATH);
436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return INV_SUCCESS;
437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
4392eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
4402eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro *  @brief  return the dmp file path. If the path is not
441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          found yet. return false. So the return value must be checked
442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the dmp file
444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           path. It should be zeroed before calling this function.
445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_dmpfile(char *name)
448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   	if (process_sysfs_request(CMD_GET_DMP_PATH, name) < 0)
450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
4542eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
4552eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro *  @brief  return the chip name. If the chip is not
456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          found yet. return false. So the return value must be checked
457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the chip name
459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           path(8 bytes). It should be zeroed before calling this function.
460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_chip_name(char *name)
463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro   	if (process_sysfs_request(CMD_GET_CHIP_NAME, name) < 0)
465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
4692eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  return event handler number. If the handler number is not found
471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          return false. the return value must be checked
472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the chip name
474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           path(8 bytes). It should be zeroed before calling this function.
475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @int *num: event number store
477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t  inv_get_handler_number(const char *name, int *num)
479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	initialized = 0;
481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if ((*num = parsing_proc_input(1, (char *)name)) < 0)
482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
4842eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro		return INV_SUCCESS;
485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
4872eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  return input number. If the handler number is not found
489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          return false. the return value must be checked
490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          to make sure the path is valid.
491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the chip name
492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           path(8 bytes). It should be zeroed before calling this function.
493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @int *num: input number store
495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t  inv_get_input_number(const char *name, int *num)
497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	initialized = 0;
499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if ((*num = parsing_proc_input(2, (char *)name)) < 0)
500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else {
502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
5032eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro	}
504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
5062eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  return iio trigger name. If iio is not initialized, return false.
508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          So the return must be checked to make sure the numeber is valid.
509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the trigger
510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           name. It should be zeroed before calling this function.
511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_iio_trigger_path(const char *name)
514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (process_sysfs_request(CMD_GET_TRIGGER_PATH, (char *)name) < 0)
516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
5212eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro/**
522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  return iio device node. If iio is not initialized, return false.
523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          So the return must be checked to make sure the numeber is valid.
524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @unsigned char *name: This should be array big enough to hold the device
525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           node. It should be zeroed before calling this function.
526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *           Or it could have unpredicable result.
527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_iio_device_node(const char *name)
529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	if (process_sysfs_request(CMD_GET_DEVICE_NODE, (char *)name) < 0)
531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_ERROR_NOT_OPENED;
532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro	else
533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro		return INV_SUCCESS;
534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
535