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