2009-08-18 21:06:32 +04:00
/* IIO - useful set of util functionality
*
* Copyright ( c ) 2008 Jonathan Cameron
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation .
*/
2015-03-04 03:37:15 +03:00
# ifndef _IIO_UTILS_H
# define _IIO_UTILS_H
2009-08-18 21:06:32 +04:00
2010-05-04 17:43:13 +04:00
# include <string.h>
# include <stdlib.h>
2010-10-08 15:14:14 +04:00
# include <stdio.h>
# include <stdint.h>
2011-10-26 20:27:44 +04:00
# include <dirent.h>
2012-06-26 01:12:17 +04:00
# include <errno.h>
2015-02-26 11:49:24 +03:00
# include <ctype.h>
# include "iio_utils.h"
2009-08-18 21:06:32 +04:00
2010-05-04 17:43:13 +04:00
const char * iio_dir = " /sys/bus/iio/devices/ " ;
2015-03-27 14:53:00 +03:00
static char * const iio_direction [ ] = {
" in " ,
" out " ,
} ;
2010-10-08 15:14:14 +04:00
/**
* iioutils_break_up_name ( ) - extract generic name from full channel name
* @ full_name : the full channel name
* @ generic_name : the output generic channel name
* */
2015-02-26 11:49:24 +03:00
int iioutils_break_up_name ( const char * full_name ,
2010-10-08 15:14:14 +04:00
char * * generic_name )
{
char * current ;
char * w , * r ;
2015-03-27 14:53:00 +03:00
char * working , * prefix = " " ;
int i ;
for ( i = 0 ; i < sizeof ( iio_direction ) / sizeof ( iio_direction [ 0 ] ) ; i + + )
if ( ! strncmp ( full_name , iio_direction [ i ] ,
strlen ( iio_direction [ i ] ) ) ) {
prefix = iio_direction [ i ] ;
break ;
}
2014-10-04 00:35:54 +04:00
2015-03-27 14:53:00 +03:00
current = strdup ( full_name + strlen ( prefix ) + 1 ) ;
2010-10-08 15:14:14 +04:00
working = strtok ( current , " _ \0 " ) ;
2015-03-27 14:53:00 +03:00
2010-10-08 15:14:14 +04:00
w = working ;
r = working ;
2011-03-08 10:55:48 +03:00
while ( * r ! = ' \0 ' ) {
2010-10-08 15:14:14 +04:00
if ( ! isdigit ( * r ) ) {
* w = * r ;
w + + ;
}
r + + ;
}
* w = ' \0 ' ;
2015-03-27 14:53:00 +03:00
asprintf ( generic_name , " %s_%s " , prefix , working ) ;
2010-10-08 15:14:14 +04:00
free ( current ) ;
return 0 ;
}
/**
* iioutils_get_type ( ) - find and process _type attribute data
* @ is_signed : output whether channel is signed
* @ bytes : output how many bytes the channel storage occupies
* @ mask : output a bit mask for the raw data
2011-12-04 23:10:59 +04:00
* @ be : big endian
2010-10-08 15:14:14 +04:00
* @ device_dir : the iio device directory
* @ name : the channel name
* @ generic_name : the channel type name
* */
2015-02-26 11:49:24 +03:00
int iioutils_get_type ( unsigned * is_signed ,
2010-10-08 15:14:14 +04:00
unsigned * bytes ,
unsigned * bits_used ,
2011-05-18 17:41:19 +04:00
unsigned * shift ,
2010-10-08 15:14:14 +04:00
uint64_t * mask ,
2011-12-04 23:10:59 +04:00
unsigned * be ,
2010-10-08 15:14:14 +04:00
const char * device_dir ,
const char * name ,
const char * generic_name )
{
FILE * sysfsfp ;
int ret ;
DIR * dp ;
char * scan_el_dir , * builtname , * builtname_generic , * filename = 0 ;
2011-12-04 23:10:59 +04:00
char signchar , endianchar ;
2011-02-24 18:34:54 +03:00
unsigned padint ;
2010-10-08 15:14:14 +04:00
const struct dirent * ent ;
ret = asprintf ( & scan_el_dir , FORMAT_SCAN_ELEMENTS_DIR , device_dir ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_ret ;
}
ret = asprintf ( & builtname , FORMAT_TYPE_FILE , name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_free_scan_el_dir ;
}
ret = asprintf ( & builtname_generic , FORMAT_TYPE_FILE , generic_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_free_builtname ;
}
dp = opendir ( scan_el_dir ) ;
if ( dp = = NULL ) {
ret = - errno ;
goto error_free_builtname_generic ;
}
while ( ent = readdir ( dp ) , ent ! = NULL )
/*
* Do we allow devices to override a generic name with
* a specific one ?
*/
if ( ( strcmp ( builtname , ent - > d_name ) = = 0 ) | |
( strcmp ( builtname_generic , ent - > d_name ) = = 0 ) ) {
ret = asprintf ( & filename ,
" %s/%s " , scan_el_dir , ent - > d_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_closedir ;
}
sysfsfp = fopen ( filename , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " failed to open %s \n " , filename ) ;
2010-10-08 15:14:14 +04:00
goto error_free_filename ;
}
2011-12-04 23:10:58 +04:00
ret = fscanf ( sysfsfp ,
" %ce:%c%u/%u>>%u " ,
& endianchar ,
& signchar ,
bits_used ,
& padint , shift ) ;
if ( ret < 0 ) {
2012-06-26 01:13:24 +04:00
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " failed to pass scan type description \n " ) ;
2012-06-26 01:13:24 +04:00
goto error_close_sysfsfp ;
2015-05-31 15:39:59 +03:00
} else if ( ret ! = 5 ) {
ret = - EIO ;
printf ( " scan type description didn't match \n " ) ;
goto error_close_sysfsfp ;
2011-12-04 23:10:58 +04:00
}
2011-12-04 23:10:59 +04:00
* be = ( endianchar = = ' b ' ) ;
2010-10-08 15:14:14 +04:00
* bytes = padint / 8 ;
2011-02-24 18:34:54 +03:00
if ( * bits_used = = 64 )
2010-10-08 15:14:14 +04:00
* mask = ~ 0 ;
else
* mask = ( 1 < < * bits_used ) - 1 ;
if ( signchar = = ' s ' )
* is_signed = 1 ;
else
* is_signed = 0 ;
2011-12-04 23:10:58 +04:00
fclose ( sysfsfp ) ;
free ( filename ) ;
filename = 0 ;
2012-06-26 01:13:24 +04:00
sysfsfp = 0 ;
2010-10-08 15:14:14 +04:00
}
2012-06-26 01:13:24 +04:00
error_close_sysfsfp :
if ( sysfsfp )
fclose ( sysfsfp ) ;
2010-10-08 15:14:14 +04:00
error_free_filename :
if ( filename )
free ( filename ) ;
error_closedir :
closedir ( dp ) ;
error_free_builtname_generic :
free ( builtname_generic ) ;
error_free_builtname :
free ( builtname ) ;
error_free_scan_el_dir :
free ( scan_el_dir ) ;
error_ret :
return ret ;
}
2015-02-26 11:49:24 +03:00
int iioutils_get_param_float ( float * output ,
2010-10-08 15:14:14 +04:00
const char * param_name ,
const char * device_dir ,
const char * name ,
const char * generic_name )
{
FILE * sysfsfp ;
int ret ;
DIR * dp ;
char * builtname , * builtname_generic ;
char * filename = NULL ;
const struct dirent * ent ;
ret = asprintf ( & builtname , " %s_%s " , name , param_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_ret ;
}
ret = asprintf ( & builtname_generic ,
" %s_%s " , generic_name , param_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_free_builtname ;
}
dp = opendir ( device_dir ) ;
if ( dp = = NULL ) {
ret = - errno ;
goto error_free_builtname_generic ;
}
while ( ent = readdir ( dp ) , ent ! = NULL )
if ( ( strcmp ( builtname , ent - > d_name ) = = 0 ) | |
( strcmp ( builtname_generic , ent - > d_name ) = = 0 ) ) {
ret = asprintf ( & filename ,
" %s/%s " , device_dir , ent - > d_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_closedir ;
}
sysfsfp = fopen ( filename , " r " ) ;
if ( ! sysfsfp ) {
ret = - errno ;
goto error_free_filename ;
}
fscanf ( sysfsfp , " %f " , output ) ;
break ;
}
error_free_filename :
if ( filename )
free ( filename ) ;
error_closedir :
closedir ( dp ) ;
error_free_builtname_generic :
free ( builtname_generic ) ;
error_free_builtname :
free ( builtname ) ;
error_ret :
return ret ;
}
2011-03-08 10:55:48 +03:00
/**
* bsort_channel_array_by_index ( ) - reorder so that the array is in index order
*
* */
2015-02-26 11:49:24 +03:00
void bsort_channel_array_by_index ( struct iio_channel_info * * ci_array ,
2011-03-08 10:55:48 +03:00
int cnt )
{
struct iio_channel_info temp ;
int x , y ;
for ( x = 0 ; x < cnt ; x + + )
for ( y = 0 ; y < ( cnt - 1 ) ; y + + )
if ( ( * ci_array ) [ y ] . index > ( * ci_array ) [ y + 1 ] . index ) {
temp = ( * ci_array ) [ y + 1 ] ;
( * ci_array ) [ y + 1 ] = ( * ci_array ) [ y ] ;
( * ci_array ) [ y ] = temp ;
}
}
2010-10-08 15:14:14 +04:00
/**
* build_channel_array ( ) - function to figure out what channels are present
* @ device_dir : the IIO device directory in sysfs
* @
* */
2015-02-26 11:49:24 +03:00
int build_channel_array ( const char * device_dir ,
2010-10-08 15:14:14 +04:00
struct iio_channel_info * * ci_array ,
int * counter )
{
DIR * dp ;
FILE * sysfsfp ;
2012-06-26 01:12:12 +04:00
int count , i ;
2010-10-08 15:14:14 +04:00
struct iio_channel_info * current ;
int ret ;
const struct dirent * ent ;
char * scan_el_dir ;
char * filename ;
* counter = 0 ;
ret = asprintf ( & scan_el_dir , FORMAT_SCAN_ELEMENTS_DIR , device_dir ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_ret ;
}
dp = opendir ( scan_el_dir ) ;
if ( dp = = NULL ) {
ret = - errno ;
goto error_free_name ;
}
while ( ent = readdir ( dp ) , ent ! = NULL )
if ( strcmp ( ent - > d_name + strlen ( ent - > d_name ) - strlen ( " _en " ) ,
" _en " ) = = 0 ) {
ret = asprintf ( & filename ,
" %s/%s " , scan_el_dir , ent - > d_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
goto error_close_dir ;
}
sysfsfp = fopen ( filename , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
free ( filename ) ;
goto error_close_dir ;
}
2014-05-24 17:25:00 +04:00
fscanf ( sysfsfp , " %i " , & ret ) ;
2010-10-08 15:14:14 +04:00
if ( ret = = 1 )
( * counter ) + + ;
fclose ( sysfsfp ) ;
free ( filename ) ;
}
2011-03-08 10:55:48 +03:00
* ci_array = malloc ( sizeof ( * * ci_array ) * ( * counter ) ) ;
2010-10-08 15:14:14 +04:00
if ( * ci_array = = NULL ) {
ret = - ENOMEM ;
goto error_close_dir ;
}
seekdir ( dp , 0 ) ;
2011-02-24 18:34:53 +03:00
count = 0 ;
2010-10-08 15:14:14 +04:00
while ( ent = readdir ( dp ) , ent ! = NULL ) {
if ( strcmp ( ent - > d_name + strlen ( ent - > d_name ) - strlen ( " _en " ) ,
" _en " ) = = 0 ) {
2014-01-01 19:38:52 +04:00
int current_enabled = 0 ;
2014-10-04 00:35:54 +04:00
2010-10-08 15:14:14 +04:00
current = & ( * ci_array ) [ count + + ] ;
ret = asprintf ( & filename ,
" %s/%s " , scan_el_dir , ent - > d_name ) ;
if ( ret < 0 ) {
ret = - ENOMEM ;
/* decrement count to avoid freeing name */
count - - ;
goto error_cleanup_array ;
}
sysfsfp = fopen ( filename , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
free ( filename ) ;
2015-05-31 15:39:45 +03:00
count - - ;
2010-10-08 15:14:14 +04:00
goto error_cleanup_array ;
}
2014-05-24 17:25:00 +04:00
fscanf ( sysfsfp , " %i " , & current_enabled ) ;
2010-10-08 15:14:14 +04:00
fclose ( sysfsfp ) ;
2011-03-08 10:55:48 +03:00
2014-01-01 19:38:52 +04:00
if ( ! current_enabled ) {
2011-03-08 10:55:48 +03:00
free ( filename ) ;
count - - ;
continue ;
}
2010-10-08 15:14:14 +04:00
current - > scale = 1.0 ;
current - > offset = 0 ;
current - > name = strndup ( ent - > d_name ,
strlen ( ent - > d_name ) -
strlen ( " _en " ) ) ;
if ( current - > name = = NULL ) {
free ( filename ) ;
ret = - ENOMEM ;
2015-05-31 15:39:45 +03:00
count - - ;
2010-10-08 15:14:14 +04:00
goto error_cleanup_array ;
}
/* Get the generic and specific name elements */
ret = iioutils_break_up_name ( current - > name ,
& current - > generic_name ) ;
if ( ret ) {
free ( filename ) ;
2015-05-31 15:39:45 +03:00
free ( current - > name ) ;
count - - ;
2010-10-08 15:14:14 +04:00
goto error_cleanup_array ;
}
ret = asprintf ( & filename ,
" %s/%s_index " ,
scan_el_dir ,
current - > name ) ;
if ( ret < 0 ) {
free ( filename ) ;
ret = - ENOMEM ;
goto error_cleanup_array ;
}
sysfsfp = fopen ( filename , " r " ) ;
fscanf ( sysfsfp , " %u " , & current - > index ) ;
fclose ( sysfsfp ) ;
free ( filename ) ;
/* Find the scale */
ret = iioutils_get_param_float ( & current - > scale ,
" scale " ,
device_dir ,
current - > name ,
current - > generic_name ) ;
if ( ret < 0 )
goto error_cleanup_array ;
ret = iioutils_get_param_float ( & current - > offset ,
" offset " ,
device_dir ,
current - > name ,
current - > generic_name ) ;
if ( ret < 0 )
goto error_cleanup_array ;
ret = iioutils_get_type ( & current - > is_signed ,
& current - > bytes ,
& current - > bits_used ,
2011-05-18 17:41:19 +04:00
& current - > shift ,
2010-10-08 15:14:14 +04:00
& current - > mask ,
2011-12-04 23:10:59 +04:00
& current - > be ,
2010-10-08 15:14:14 +04:00
device_dir ,
current - > name ,
current - > generic_name ) ;
}
}
2011-03-08 10:55:48 +03:00
2010-10-08 15:14:14 +04:00
closedir ( dp ) ;
2015-05-31 15:39:43 +03:00
free ( scan_el_dir ) ;
2011-03-08 10:55:48 +03:00
/* reorder so that the array is in index order */
bsort_channel_array_by_index ( ci_array , * counter ) ;
2010-10-08 15:14:14 +04:00
return 0 ;
error_cleanup_array :
2015-05-31 15:39:44 +03:00
for ( i = count - 1 ; i > = 0 ; i - - ) {
2010-10-08 15:14:14 +04:00
free ( ( * ci_array ) [ i ] . name ) ;
2015-05-31 15:39:44 +03:00
free ( ( * ci_array ) [ i ] . generic_name ) ;
}
2010-10-08 15:14:14 +04:00
free ( * ci_array ) ;
error_close_dir :
closedir ( dp ) ;
error_free_name :
free ( scan_el_dir ) ;
error_ret :
return ret ;
}
2015-05-31 15:40:00 +03:00
int calc_digits ( int num )
{
int count = 0 ;
while ( num ! = 0 ) {
num / = 10 ;
count + + ;
}
return count ;
}
2010-05-04 17:43:13 +04:00
/**
* find_type_by_name ( ) - function to match top level types by name
* @ name : top level type instance name
* @ type : the type of top level instance being sort
*
* Typical types this is used for are device and trigger .
* */
2015-02-26 11:49:24 +03:00
int find_type_by_name ( const char * name , const char * type )
2009-08-18 21:06:32 +04:00
{
const struct dirent * ent ;
2015-05-31 15:40:00 +03:00
int number , numstrlen , ret ;
2009-08-18 21:06:32 +04:00
FILE * nameFile ;
DIR * dp ;
2010-05-04 17:43:13 +04:00
char thisname [ IIO_MAX_NAME_LENGTH ] ;
char * filename ;
2009-08-18 21:06:32 +04:00
dp = opendir ( iio_dir ) ;
if ( dp = = NULL ) {
2012-07-01 02:47:41 +04:00
printf ( " No industrialio devices available \n " ) ;
2010-05-04 17:43:13 +04:00
return - ENODEV ;
2009-08-18 21:06:32 +04:00
}
2010-05-04 17:43:13 +04:00
2009-08-18 21:06:32 +04:00
while ( ent = readdir ( dp ) , ent ! = NULL ) {
if ( strcmp ( ent - > d_name , " . " ) ! = 0 & &
2010-05-04 17:43:13 +04:00
strcmp ( ent - > d_name , " .. " ) ! = 0 & &
strlen ( ent - > d_name ) > strlen ( type ) & &
strncmp ( ent - > d_name , type , strlen ( type ) ) = = 0 ) {
2015-05-31 15:40:00 +03:00
errno = 0 ;
ret = sscanf ( ent - > d_name + strlen ( type ) , " %d " , & number ) ;
if ( ret < 0 ) {
ret = - errno ;
printf ( " failed to read element number \n " ) ;
goto error_close_dir ;
} else if ( ret ! = 1 ) {
ret = - EIO ;
printf ( " failed to match element number \n " ) ;
goto error_close_dir ;
}
numstrlen = calc_digits ( number ) ;
2010-05-04 17:43:13 +04:00
/* verify the next character is not a colon */
if ( strncmp ( ent - > d_name + strlen ( type ) + numstrlen ,
" : " ,
1 ) ! = 0 ) {
filename = malloc ( strlen ( iio_dir )
+ strlen ( type )
+ numstrlen
2010-05-25 13:40:04 +04:00
+ 6 ) ;
2012-06-26 01:13:25 +04:00
if ( filename = = NULL ) {
closedir ( dp ) ;
2010-05-04 17:43:13 +04:00
return - ENOMEM ;
2012-06-26 01:13:25 +04:00
}
2010-05-04 17:43:13 +04:00
sprintf ( filename , " %s%s%d/name " ,
iio_dir ,
type ,
number ) ;
nameFile = fopen ( filename , " r " ) ;
2012-06-26 01:13:25 +04:00
if ( ! nameFile ) {
free ( filename ) ;
2010-05-04 17:43:13 +04:00
continue ;
2012-06-26 01:13:25 +04:00
}
2010-05-04 17:43:13 +04:00
free ( filename ) ;
2009-08-18 21:06:32 +04:00
fscanf ( nameFile , " %s " , thisname ) ;
fclose ( nameFile ) ;
2012-06-26 01:13:25 +04:00
if ( strcmp ( name , thisname ) = = 0 ) {
closedir ( dp ) ;
return number ;
}
2009-08-18 21:06:32 +04:00
}
}
}
2012-06-26 01:13:25 +04:00
closedir ( dp ) ;
2010-05-04 17:43:13 +04:00
return - ENODEV ;
2015-05-31 15:40:00 +03:00
error_close_dir :
if ( closedir ( dp ) = = - 1 )
perror ( " find_type_by_name(): Failed to close directory " ) ;
return ret ;
2009-08-18 21:06:32 +04:00
}
2015-02-26 11:49:24 +03:00
int _write_sysfs_int ( char * filename , char * basedir , int val , int verify )
2009-08-18 21:06:32 +04:00
{
2013-10-07 16:42:00 +04:00
int ret = 0 ;
2010-05-04 17:43:13 +04:00
FILE * sysfsfp ;
int test ;
char * temp = malloc ( strlen ( basedir ) + strlen ( filename ) + 2 ) ;
2014-10-04 00:35:54 +04:00
2010-05-04 17:43:13 +04:00
if ( temp = = NULL )
return - ENOMEM ;
sprintf ( temp , " %s/%s " , basedir , filename ) ;
2009-08-18 21:06:32 +04:00
sysfsfp = fopen ( temp , " w " ) ;
2010-05-04 17:43:13 +04:00
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " failed to open %s \n " , temp ) ;
2010-05-04 17:43:13 +04:00
goto error_free ;
}
2009-08-18 21:06:32 +04:00
fprintf ( sysfsfp , " %d " , val ) ;
fclose ( sysfsfp ) ;
2010-05-04 17:43:13 +04:00
if ( verify ) {
sysfsfp = fopen ( temp , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " failed to open %s \n " , temp ) ;
2010-05-04 17:43:13 +04:00
goto error_free ;
}
fscanf ( sysfsfp , " %d " , & test ) ;
2012-06-26 01:13:26 +04:00
fclose ( sysfsfp ) ;
2010-05-04 17:43:13 +04:00
if ( test ! = val ) {
printf ( " Possible failure in int write %d to %s%s \n " ,
val ,
basedir ,
filename ) ;
ret = - 1 ;
}
}
error_free :
free ( temp ) ;
return ret ;
}
int write_sysfs_int ( char * filename , char * basedir , int val )
{
return _write_sysfs_int ( filename , basedir , val , 0 ) ;
2009-08-18 21:06:32 +04:00
}
2010-05-04 17:43:04 +04:00
int write_sysfs_int_and_verify ( char * filename , char * basedir , int val )
2010-05-04 17:43:13 +04:00
{
return _write_sysfs_int ( filename , basedir , val , 1 ) ;
}
int _write_sysfs_string ( char * filename , char * basedir , char * val , int verify )
2010-05-04 17:43:04 +04:00
{
2010-10-08 15:14:14 +04:00
int ret = 0 ;
2010-05-04 17:43:04 +04:00
FILE * sysfsfp ;
2010-05-04 17:43:13 +04:00
char * temp = malloc ( strlen ( basedir ) + strlen ( filename ) + 2 ) ;
2014-10-04 00:35:54 +04:00
2010-05-04 17:43:13 +04:00
if ( temp = = NULL ) {
printf ( " Memory allocation failed \n " ) ;
return - ENOMEM ;
}
sprintf ( temp , " %s/%s " , basedir , filename ) ;
2010-05-04 17:43:04 +04:00
sysfsfp = fopen ( temp , " w " ) ;
2010-05-04 17:43:13 +04:00
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " Could not open %s \n " , temp ) ;
2010-05-04 17:43:13 +04:00
goto error_free ;
}
fprintf ( sysfsfp , " %s " , val ) ;
2010-05-04 17:43:04 +04:00
fclose ( sysfsfp ) ;
2010-05-04 17:43:13 +04:00
if ( verify ) {
sysfsfp = fopen ( temp , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
2015-05-31 15:39:48 +03:00
printf ( " could not open file to verify \n " ) ;
2010-05-04 17:43:13 +04:00
goto error_free ;
}
fscanf ( sysfsfp , " %s " , temp ) ;
2012-06-26 01:13:26 +04:00
fclose ( sysfsfp ) ;
2010-05-04 17:43:13 +04:00
if ( strcmp ( temp , val ) ! = 0 ) {
printf ( " Possible failure in string write of %s "
" Should be %s "
2011-03-31 05:57:33 +04:00
" written to %s \ %s \n " ,
2010-05-04 17:43:13 +04:00
temp ,
val ,
basedir ,
filename ) ;
ret = - 1 ;
}
2010-05-04 17:43:04 +04:00
}
2010-05-04 17:43:13 +04:00
error_free :
free ( temp ) ;
2010-05-04 17:43:04 +04:00
2010-05-04 17:43:13 +04:00
return ret ;
2010-05-04 17:43:04 +04:00
}
2010-10-08 15:14:14 +04:00
2009-08-18 21:06:32 +04:00
/**
* write_sysfs_string_and_verify ( ) - string write , readback and verify
* @ filename : name of file to write to
* @ basedir : the sysfs directory in which the file is to be found
* @ val : the string to write
* */
int write_sysfs_string_and_verify ( char * filename , char * basedir , char * val )
{
2010-05-04 17:43:13 +04:00
return _write_sysfs_string ( filename , basedir , val , 1 ) ;
}
2009-08-18 21:06:32 +04:00
2010-05-04 17:43:13 +04:00
int write_sysfs_string ( char * filename , char * basedir , char * val )
{
return _write_sysfs_string ( filename , basedir , val , 0 ) ;
2009-08-18 21:06:32 +04:00
}
int read_sysfs_posint ( char * filename , char * basedir )
{
int ret ;
FILE * sysfsfp ;
2010-05-04 17:43:13 +04:00
char * temp = malloc ( strlen ( basedir ) + strlen ( filename ) + 2 ) ;
2014-10-04 00:35:54 +04:00
2010-05-04 17:43:13 +04:00
if ( temp = = NULL ) {
printf ( " Memory allocation failed " ) ;
return - ENOMEM ;
}
sprintf ( temp , " %s/%s " , basedir , filename ) ;
2009-08-18 21:06:32 +04:00
sysfsfp = fopen ( temp , " r " ) ;
2010-05-04 17:43:13 +04:00
if ( sysfsfp = = NULL ) {
ret = - errno ;
goto error_free ;
}
2009-08-18 21:06:32 +04:00
fscanf ( sysfsfp , " %d \n " , & ret ) ;
fclose ( sysfsfp ) ;
2010-05-04 17:43:13 +04:00
error_free :
free ( temp ) ;
return ret ;
}
int read_sysfs_float ( char * filename , char * basedir , float * val )
{
2014-12-06 09:00:00 +03:00
int ret = 0 ;
2010-05-04 17:43:13 +04:00
FILE * sysfsfp ;
char * temp = malloc ( strlen ( basedir ) + strlen ( filename ) + 2 ) ;
2014-10-04 00:35:54 +04:00
2010-05-04 17:43:13 +04:00
if ( temp = = NULL ) {
printf ( " Memory allocation failed " ) ;
return - ENOMEM ;
}
sprintf ( temp , " %s/%s " , basedir , filename ) ;
sysfsfp = fopen ( temp , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
goto error_free ;
}
fscanf ( sysfsfp , " %f \n " , val ) ;
fclose ( sysfsfp ) ;
error_free :
free ( temp ) ;
2009-08-18 21:06:32 +04:00
return ret ;
}
2014-05-02 16:23:00 +04:00
2014-12-06 09:00:00 +03:00
int read_sysfs_string ( const char * filename , const char * basedir , char * str )
2014-05-02 16:23:00 +04:00
{
2014-12-06 09:00:00 +03:00
int ret = 0 ;
2014-05-02 16:23:00 +04:00
FILE * sysfsfp ;
char * temp = malloc ( strlen ( basedir ) + strlen ( filename ) + 2 ) ;
2014-10-04 00:35:54 +04:00
2014-05-02 16:23:00 +04:00
if ( temp = = NULL ) {
printf ( " Memory allocation failed " ) ;
return - ENOMEM ;
}
sprintf ( temp , " %s/%s " , basedir , filename ) ;
sysfsfp = fopen ( temp , " r " ) ;
if ( sysfsfp = = NULL ) {
ret = - errno ;
goto error_free ;
}
fscanf ( sysfsfp , " %s \n " , str ) ;
fclose ( sysfsfp ) ;
error_free :
free ( temp ) ;
return ret ;
}
2015-03-04 03:37:15 +03:00
# endif /* _IIO_UTILS_H */