blob: b54f7977c6891f46ca387352c4239421ac65c9b0 [file] [log] [blame]
/*****************************************************************
*
* adcapp.c
* Simple interface to read and write adc.
*
* Author: Rama Rao Bisa <ramab@ami.com>
*
* Copyright (C) <2019> <American Megatrends International LLC>
*
*****************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#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 );
}