1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* IIO - useful set of util functionality 2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 3c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Copyright (c) 2008 Jonathan Cameron 4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * This program is free software; you can redistribute it and/or modify it 6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * under the terms of the GNU General Public License version 2 as published by 7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * the Free Software Foundation. 8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* Made up value to limit allocation sizes */ 11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <string.h> 12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdlib.h> 13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <ctype.h> 14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h> 15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdint.h> 16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <dirent.h> 17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define IIO_MAX_NAME_LENGTH 30 19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements" 21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define FORMAT_TYPE_FILE "%s_type" 22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroconst char *iio_dir = "/sys/bus/iio/devices/"; 24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroextern int verbose; 26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * iioutils_break_up_name() - extract generic name from full channel name 29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @full_name: the full channel name 30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: the output generic channel name 31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostatic int iioutils_break_up_name(const char *full_name, 33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char **generic_name) 34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *current; 36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *w, *r; 37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *working; 38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current = strdup(full_name); 39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro working = strtok(current, "_\0"); 40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro w = working; 41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro r = working; 42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (*r != '\0') { 44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!isdigit(*r)) { 45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *w = *r; 46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro w++; 47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro r++; 49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *w = '\0'; 51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *generic_name = strdup(working); 52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(current); 53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * struct iio_channel_info - information about a given channel 59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @name: channel name 60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: general name for channel type 61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @scale: scale factor to be applied for conversion to si units 62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @offset: offset to be applied for conversion to si units 63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @index: the channel index in the buffer output 64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @bytes: number of bytes occupied in buffer output 65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @mask: a bit mask for the raw output 66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @is_signed: is the raw value stored signed 67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @enabled: is this channel enabled 68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct iio_channel_info { 70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *name; 71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *generic_name; 72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro float scale; 73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro float offset; 74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned index; 75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned bytes; 76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned bits_used; 77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned shift; 78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro uint64_t mask; 79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned be; 80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned is_signed; 81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned enabled; 82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned location; 83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}; 84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * iioutils_get_type() - find and process _type attribute data 87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @is_signed: output whether channel is signed 88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @bytes: output how many bytes the channel storage occupies 89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @mask: output a bit mask for the raw data 90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @be: big endian 91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @device_dir: the iio device directory 92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @name: the channel name 93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @generic_name: the channel type name 94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int iioutils_get_type(unsigned *is_signed, 96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned *bytes, 97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned *bits_used, 98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned *shift, 99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro uint64_t *mask, 100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned *be, 101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *device_dir, 102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *name, 103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *generic_name) 104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro DIR *dp; 108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *scan_el_dir, *builtname, *builtname_generic, *filename = 0; 109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char signchar, endianchar; 110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro unsigned padint; 111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const struct dirent *ent; 112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir); 114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&builtname, FORMAT_TYPE_FILE, name); 119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_scan_el_dir; 122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&builtname_generic, FORMAT_TYPE_FILE, generic_name); 124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_builtname; 127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dp = opendir(scan_el_dir); 130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dp == NULL) { 131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_builtname_generic; 133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (ent = readdir(dp), ent != NULL) 135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* 136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * Do we allow devices to override a generic name with 137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * a specific one? 138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */ 139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((strcmp(builtname, ent->d_name) == 0) || 140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (strcmp(builtname_generic, ent->d_name) == 0)) { 141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&filename, 142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s/%s", scan_el_dir, ent->d_name); 143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_closedir; 146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(filename, "r"); 148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("failed to open %s\n", filename); 150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_filename; 152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = fscanf(sysfsfp, 155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%ce:%c%u/%u>>%u", 156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro &endianchar, 157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro &signchar, 158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro bits_used, 159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro &padint, shift); 160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("failed to pass scan type description\n"); 162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *be = (endianchar == 'b'); 165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *bytes = padint / 8; 166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (*bits_used == 64) 167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *mask = ~0; 168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro else 169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *mask = (1 << *bits_used) - 1; 170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (signchar == 's') 171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *is_signed = 1; 172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro else 173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *is_signed = 0; 174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro filename = 0; 178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_filename: 180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (filename) 181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_closedir: 183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro closedir(dp); 184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname_generic: 185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(builtname_generic); 186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname: 187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(builtname); 188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_scan_el_dir: 189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(scan_el_dir); 190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret: 191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int iioutils_get_param_float(float *output, 195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *param_name, 196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *device_dir, 197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *name, 198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const char *generic_name) 199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro DIR *dp; 203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *builtname, *builtname_generic; 204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *filename = NULL; 205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const struct dirent *ent; 206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&builtname, "%s_%s", name, param_name); 208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&builtname_generic, 213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s_%s", generic_name, param_name); 214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_builtname; 217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dp = opendir(device_dir); 219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dp == NULL) { 220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_builtname_generic; 222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (ent = readdir(dp), ent != NULL) 224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((strcmp(builtname, ent->d_name) == 0) || 225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (strcmp(builtname_generic, ent->d_name) == 0)) { 226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&filename, 227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s/%s", device_dir, ent->d_name); 228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_closedir; 231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(filename, "r"); 233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!sysfsfp) { 234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_filename; 236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%f", output); 238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro break; 239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_filename: 241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (filename) 242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_closedir: 244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro closedir(dp); 245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname_generic: 246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(builtname_generic); 247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_builtname: 248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(builtname); 249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret: 250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * bsort_channel_array_by_index() - reorder so that the array is in index order 255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * 256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline void bsort_channel_array_by_index(struct iio_channel_info **ci_array, 259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int cnt) 260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info temp; 262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int x, y; 263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (x = 0; x < cnt; x++) 265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (y = 0; y < (cnt - 1); y++) 266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if ((*ci_array)[y].index > (*ci_array)[y+1].index) { 267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro temp = (*ci_array)[y + 1]; 268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (*ci_array)[y + 1] = (*ci_array)[y]; 269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (*ci_array)[y] = temp; 270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * build_channel_array() - function to figure out what channels are present 275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @device_dir: the IIO device directory in sysfs 276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @ 277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int build_channel_array(const char *device_dir, 279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info **ci_array, 280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int *counter) 281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro DIR *dp; 283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int count, i; 285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info *current; 286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const struct dirent *ent; 288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *scan_el_dir; 289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *filename; 290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *counter = 0; 292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir); 293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dp = opendir(scan_el_dir); 298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dp == NULL) { 299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_name; 301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (ent = readdir(dp), ent != NULL) 303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"), 304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "_en") == 0) { 305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&filename, 306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s/%s", scan_el_dir, ent->d_name); 307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_close_dir; 310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(filename, "r"); 312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_close_dir; 316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%u", &ret); 318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //printf("%s, %d\n", filename, ret); 319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret == 1) 320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro (*counter)++; 321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *ci_array = malloc(sizeof(**ci_array) * (*counter)); 325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (*ci_array == NULL) { 326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_close_dir; 328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro closedir(dp); 330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dp = opendir(scan_el_dir); 331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro //seekdir(dp, 0); 332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro count = 0; 333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (ent = readdir(dp), ent != NULL) { 334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"), 335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "_en") == 0) { 336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current = &(*ci_array)[count++]; 337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&filename, 338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s/%s", scan_el_dir, ent->d_name); 339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* decrement count to avoid freeing name */ 342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro count--; 343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(filename, "r"); 346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%u", ¤t->enabled); 352c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 353c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 354c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (!current->enabled) { 355c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 356c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro count--; 357c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro continue; 358c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 359c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 360c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->scale = 1.0; 361c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->offset = 0; 362c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->name = strndup(ent->d_name, 363c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro strlen(ent->d_name) - 364c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro strlen("_en")); 365c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (current->name == NULL) { 366c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 367c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 368c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 369c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 370c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Get the generic and specific name elements */ 371c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = iioutils_break_up_name(current->name, 372c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->generic_name); 373c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret) { 374c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 375c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 376c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 377c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&filename, 378c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "%s/%s_index", 379c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro scan_el_dir, 380c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->name); 381c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 382c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 383c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 384c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 385c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 386c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(filename, "r"); 387c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%u", ¤t->index); 388c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 389c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(filename); 390c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* Find the scale */ 391c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = iioutils_get_param_float(¤t->scale, 392c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "scale", 393c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro device_dir, 394c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->name, 395c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->generic_name); 396c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 397c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 398c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = iioutils_get_param_float(¤t->offset, 399c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "offset", 400c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro device_dir, 401c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->name, 402c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->generic_name); 403c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) 404c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_cleanup_array; 405c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = iioutils_get_type(¤t->is_signed, 406c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->bytes, 407c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->bits_used, 408c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->shift, 409c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->mask, 410c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ¤t->be, 411c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro device_dir, 412c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->name, 413c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro current->generic_name); 414c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 415c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 416c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 417c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro closedir(dp); 418c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro /* reorder so that the array is in index order */ 419c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro bsort_channel_array_by_index(ci_array, *counter); 420c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 421c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 422c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 423c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_cleanup_array: 424c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro for (i = count - 1; i >= 0; i--) 425c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free((*ci_array)[i].name); 426c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(*ci_array); 427c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_close_dir: 428c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro closedir(dp); 429c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_name: 430c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(scan_el_dir); 431c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret: 432c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 433c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 434c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 435c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinline int _write_sysfs_int(char *filename, char *basedir, int val, int verify) 436c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 437c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret = 0; 438c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 439c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int test; 440c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *temp = malloc(strlen(basedir) + strlen(filename) + 2); 441c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (temp == NULL) 442c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -ENOMEM; 443c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 444c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(temp, "%s/%s", basedir, filename); 445c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 446c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (verbose) 447c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("VERB: echo %d > %s\n", val, temp); 448c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "w"); 449c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 450c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("failed to open %s\n", temp); 451c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 452c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 453c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 454c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(sysfsfp, "%d", val); 455c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 456c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 457c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (verify) { 458c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "r"); 459c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 460c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("failed to open %s\n", temp); 461c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 462c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 463c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 464c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%d", &test); 465c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 466c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (verbose) 467c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("VERB: cat %s = %d\n", temp, test); 468c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (test != val) { 469c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Possible failure in int write %d to %s\n", 470c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro val, temp); 471c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -1; 472c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 473c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 474c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 475c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free: 476c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(temp); 477c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 478c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 479c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 480c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_int(char *filename, char *basedir, int val) 481c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 482c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return _write_sysfs_int(filename, basedir, val, 0); 483c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 484c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 485c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_int_and_verify(char *filename, char *basedir, int val) 486c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 487c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return _write_sysfs_int(filename, basedir, val, 1); 488c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 489c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 490c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint _write_sysfs_string(char *filename, char *basedir, char *val, int verify) 491c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 492c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret = 0; 493c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 494c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *temp = malloc(strlen(basedir) + strlen(filename) + 2); 495c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (temp == NULL) { 496c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Memory allocation failed\n"); 497c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -ENOMEM; 498c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 499c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(temp, "%s/%s", basedir, filename); 500c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 501c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "w"); 502c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 503c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Could not open %s\n", temp); 504c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 505c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 506c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 507c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fprintf(sysfsfp, "%s", val); 508c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 509c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 510c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (verify) { 511c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "r"); 512c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 513c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("could not open file to verify\n"); 514c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 515c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 516c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 517c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%s", temp); 518c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 519c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 520c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (strcmp(temp, val) != 0) { 521c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Possible failure in string write of %s " 522c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "Should be %s written to %s\%s\n", 523c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro temp, val, basedir, filename); 524c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -1; 525c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 526c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 527c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 528c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free: 529c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(temp); 530c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 531c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 532c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 533c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 534c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/** 535c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * write_sysfs_string_and_verify() - string write, readback and verify 536c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @filename: name of file to write to 537c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @basedir: the sysfs directory in which the file is to be found 538c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @val: the string to write 539c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro **/ 540c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_string_and_verify(char *filename, char *basedir, char *val) 541c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 542c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return _write_sysfs_string(filename, basedir, val, 1); 543c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 544c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 545c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint write_sysfs_string(char *filename, char *basedir, char *val) 546c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 547c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return _write_sysfs_string(filename, basedir, val, 0); 548c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 549c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 550c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint read_sysfs_posint(char *filename, char *basedir) 551c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 552c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 553c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 554c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *temp = malloc(strlen(basedir) + strlen(filename) + 2); 555c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (temp == NULL) { 556c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Memory allocation failed"); 557c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -ENOMEM; 558c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 559c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(temp, "%s/%s", basedir, filename); 560c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "r"); 561c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 562c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 563c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 564c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 565c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%d\n", &ret); 566c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 567c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free: 568c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(temp); 569c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 570c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 571c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 572c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint read_sysfs_float(char *filename, char *basedir, float *val) 573c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 574c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro float ret = 0; 575c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro FILE *sysfsfp; 576c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *temp = malloc(strlen(basedir) + strlen(filename) + 2); 577c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (temp == NULL) { 578c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro printf("Memory allocation failed"); 579c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -ENOMEM; 580c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 581c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sprintf(temp, "%s/%s", basedir, filename); 582c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro sysfsfp = fopen(temp, "r"); 583c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (sysfsfp == NULL) { 584c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 585c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free; 586c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 587c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fscanf(sysfsfp, "%f\n", val); 588c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro fclose(sysfsfp); 589c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 590c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free: 591c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro free(temp); 592c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return ret; 593c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 594c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 595c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_se(const char *device_dir, struct iio_channel_info **ci_array, 596c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int *counter, char *sensor, int en) 597c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 598c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro DIR *dp; 599c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int ret; 600c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro const struct dirent *ent; 601c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char *scan_el_dir; 602c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro char pattern[50] = "in_"; 603c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 604c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *counter = 0; 605c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir); 606c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (ret < 0) { 607c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -ENOMEM; 608c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_ret; 609c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 610c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro dp = opendir(scan_el_dir); 611c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (dp == NULL) { 612c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro ret = -errno; 613c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro goto error_free_name; 614c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 615c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro strcat(pattern, sensor); 616c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro while (ent = readdir(dp), ent != NULL) { 617c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro if (strncmp(ent->d_name, pattern, strlen(pattern)) == 0 && 618c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro strncmp(ent->d_name + strlen(ent->d_name) - strlen("_en"), 619c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro "_en", strlen("_en")) == 0) { 620c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro write_sysfs_int_and_verify((char *)ent->d_name, scan_el_dir, en); 621c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 622c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro } 623c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return 0; 624c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 625c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_ret: 626c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroerror_free_name: 627c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return -1; 628c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 629c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 630c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_accel_se(const char *device_dir, 631c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info **ci_array, int *counter, 632c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int en) 633c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 634c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return enable_se(device_dir, ci_array, counter, "accel", en); 635c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 636c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 637c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_anglvel_se(const char *device_dir, 638c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info **ci_array, int *counter, 639c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int en) 640c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 641c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return enable_se(device_dir, ci_array, counter, "anglvel", en); 642c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 643c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 644c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint enable_quaternion_se(const char *device_dir, 645c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro struct iio_channel_info **ci_array, int *counter, 646c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro int en) 647c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{ 648c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro return enable_se(device_dir, ci_array, counter, "quaternion", en); 649c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro} 650c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro 651