/***************************************************************** * * adcapp.c * Simple interface to read and write adc. * * Author: Rama Rao Bisa * * Copyright (C) <2019> * *****************************************************************/ #include #include #include #include #include #include #include #include #include #include "adc.h" #include "adcifc.h" #include "EINTR_wrappers.h" /** \file adcifc.c \brief Source for all adc interface code */ static int adc_directory_check(char *path) { int retval = 0; struct stat sb; if (!(stat(path, &sb) == 0 && S_ISDIR(sb.st_mode))) { printf("%s is not exist!\n", path); retval = -1; } return retval; } static int sys_get_adc_vol( get_adc_value_t *argp ) { int retval = -1; int fd; int tmp; int devid = 0; char stringArray[50]; char devpath[50]; char val[5]; if(argp->channel_num > 15) retval = -1; #ifdef AST2600_ADCAPP if (argp->channel_num >= 8) { devid = 1; argp->channel_num -= 8; } #endif snprintf(devpath, sizeof(devpath), "/sys/bus/iio/devices/iio:device%d", devid); retval = adc_directory_check(devpath); if (retval != 0) { return retval; } snprintf(stringArray, sizeof(stringArray), "%s/in_voltage%d_raw", devpath, argp->channel_num); retval = access(stringArray, F_OK); if(retval != 0) { return retval; } fd = sigwrap_open(stringArray, O_RDONLY); if (fd < 0) { return fd; } read(fd, val, 5); tmp = atoi(val); (void)sigwrap_close(fd); argp->channel_value = (uint16_t)(tmp); retval = 0; return( retval ); } /** * get_adc_val * **/ int get_adc_val( int channel , unsigned short *data) { get_adc_value_t adc_arg; /* Set the adc channel to read */ adc_arg.channel_num = channel; adc_arg.channel_value = 0; if ( -1 == sys_get_adc_vol(&adc_arg)) { return -1; } *data = (unsigned short)(adc_arg.channel_value); return ( 0 ); }