149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Provides helpful file IO wrappers for use with sysfs. 349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @details Based on Jonathan Cameron's @e iio_utils.h. 449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <string.h> 749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdlib.h> 849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <ctype.h> 949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdio.h> 1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdint.h> 1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <dirent.h> 1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h> 1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <unistd.h> 1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "inv_sysfs_utils.h" 1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* General TODO list: 1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Select more reasonable string lengths or use fseek and malloc. 1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_sysfs_write() - Write an integer to a file. 2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @filename: Path to file. 2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Value to write to file. 2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_sysfs_write(char *filename, long data) 2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow FILE *fp; 2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!filename) 3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -1; 3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fp = fopen(filename, "w"); 3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!fp) 3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -errno; 3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = fprintf(fp, "%ld", data); 3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fclose(fp); 3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_sysfs_read() - Read a string from a file. 4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @filename: Path to file. 4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @num_bytes: Number of bytes to read. 4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Data from file. 4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_sysfs_read(char *filename, long num_bytes, char *data) 4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow FILE *fp; 5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!filename) 5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -1; 5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fp = fopen(filename, "r"); 5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!fp) 5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -errno; 5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = fread(data, 1, num_bytes, fp); 5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fclose(fp); 6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_buffer() - Read data from ring buffer. 6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @fd: File descriptor for buffer file. 6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Data in hardware units. 6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @timestamp: Time when data was read from device. Use NULL if unsupported. 6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_buffer(int fd, long *data, long long *timestamp) 7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[35]; 7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = read(fd, str, sizeof(str)); 7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!count) 7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!timestamp) 7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]); 8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow else 8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1], 8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow &data[2], timestamp); 8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < (timestamp?4:3)) 8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_raw() - Read raw data. 9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Data in hardware units. 9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @timestamp: Time when data was read from device. Use NULL if unsupported. 9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_raw(const struct inv_sysfs_names_s *names, long *data, 9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow long long *timestamp) 9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[40]; 10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->raw_data, sizeof(str), str); 10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (!timestamp) 10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]); 10749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow else 10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1], 10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow &data[2], timestamp); 11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < (timestamp?4:3)) 11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_temperature_raw() - Read temperature. 11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Data in hardware units. 11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @timestamp: Time when data was read from device. 12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temperature_raw(const struct inv_sysfs_names_s *names, short *data, 12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow long long *timestamp) 12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[25]; 12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->temperature, sizeof(str), str); 12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%hd%lld", &data[0], timestamp); 13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 2) 13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_fifo_rate() - Read fifo rate. 13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Fifo rate. 14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_fifo_rate(const struct inv_sysfs_names_s *names, short *data) 14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[8]; 14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->fifo_rate, sizeof(str), str); 14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%hd", data); 15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 1) 15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_power_state() - Read power state. 15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_power_state(const struct inv_sysfs_names_s *names, char *data) 16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[2]; 16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->power_state, sizeof(str), str); 16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%hd", (short*)data); 17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 1) 17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_scale() - Read scale. 17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_scale(const struct inv_sysfs_names_s *names, float *data) 18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[5]; 18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->scale, sizeof(str), str); 18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%f", data); 19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 1) 19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_temp_scale() - Read temperature scale. 19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 20349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_scale(const struct inv_sysfs_names_s *names, short *data) 20449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 20549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[4]; 20649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->temp_scale, sizeof(str), str); 20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%hd", data); 21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 1) 21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_temp_offset() - Read temperature offset. 21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_offset(const struct inv_sysfs_names_s *names, short *data) 22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow char str[4]; 22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_sysfs_read((char*)names->temp_offset, sizeof(str), str); 22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 0) 23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = sscanf(str, "%hd", data); 23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (count < 1) 23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return -EAGAIN; 23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_q16() - Get data as q16 fixed point. 23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @timestamp: Time when data was read from device. 24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_q16(const struct inv_sysfs_names_s *names, long *data, 24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow long long *timestamp) 24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count; 24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow short raw[3]; 24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow float scale; 25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count = inv_read_raw(names, (long*)raw, timestamp); 25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count += inv_read_scale(names, &scale); 25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow data[0] = (long)(raw[0] * (65536.f / scale)); 25349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow data[1] = (long)(raw[1] * (65536.f / scale)); 25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow data[2] = (long)(raw[2] * (65536.f / scale)); 25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 25749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_read_q16() - Get temperature data as q16 fixed point. 26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 if device is on. 26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @timestamp: Time when data was read from device. 26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes read or a negative error code. 26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_read_temp_q16(const struct inv_sysfs_names_s *names, long *data, 26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow long long *timestamp) 26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int count = 0; 26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow short raw; 27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow static short scale, offset; 27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow static unsigned char first_read = 1; 27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (first_read) { 27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count += inv_read_temp_scale(names, &scale); 27549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count += inv_read_temp_offset(names, &offset); 27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow first_read = 0; 27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow count += inv_read_temperature_raw(names, &raw, timestamp); 27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow data[0] = (long)((35 + ((float)(raw - offset) / scale)) * 65536.f); 28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 28149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return count; 28249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 28549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_write_fifo_rate() - Write fifo rate. 28649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Fifo rate. 28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_fifo_rate(const struct inv_sysfs_names_s *names, short data) 29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return inv_sysfs_write((char*)names->fifo_rate, (long)data); 29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 29649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_write_buffer_enable() - Enable/disable buffer in /dev. 29749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: Fifo rate. 29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 30149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_buffer_enable(const struct inv_sysfs_names_s *names, char data) 30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return inv_sysfs_write((char*)names->enable, (long)data); 30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * inv_write_power_state() - Turn device on/off. 30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @names: Names of sysfs files. 30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @data: 1 to turn on. 31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Returns number of bytes written or a negative error code. 31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint inv_write_power_state(const struct inv_sysfs_names_s *names, char data) 31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return inv_sysfs_write((char*)names->power_state, (long)data); 31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 31649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 31749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 319