|  | /***************************************************************** | 
|  | * | 
|  | * 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 ); | 
|  | } |