blob: 9627b2824054905363d2348b90c85d6717dca9b0 [file] [log] [blame]
Hongwei Zhangcb66a9e2019-06-05 16:37:19 -04001 /*****************************************************************
2 *
3 * adcapp.c
4 * Simple interface to read and write adc.
5 *
6 * Author: Rama Rao Bisa <ramab@ami.com>
7 *
8 * Copyright (C) <2019> <American Megatrends International LLC>
9 *
10 *****************************************************************/
11
12#include <stdio.h>
13#include <unistd.h>
14#include <sys/types.h>
15#include <sys/stat.h>
16#include <fcntl.h>
17#include <sys/ioctl.h>
18#include <errno.h>
19#include <string.h>
20#include <stdint.h>
21#include "adc.h"
22#include "adcifc.h"
23#include "EINTR_wrappers.h"
24
25/** \file adcifc.c
26 \brief Source for all adc interface code
27 */
28
29static int adc_directory_check()
30{
31 int retval = 0;
32 struct stat sb;
33 if (!(stat("/sys/bus/iio/devices/iio:device0", &sb) == 0 && S_ISDIR(sb.st_mode)))
34 {
35 printf("\"/sys/bus/iio/devices/iio:device0\" is not exist!\n");
36 retval = -1;
37 }
38 return retval;
39}
40
41static int sys_get_adc_vol( get_adc_value_t *argp )
42{
43 int retval = -1;
44 int fd;
45 int tmp;
46 char stringArray[50];
47 char val[5];
48 if(argp->channel_num > 15) retval = -1;
49 retval = adc_directory_check();
50 if(retval != 0)
51 {
52 return retval;
53 }
54 snprintf(stringArray, sizeof(stringArray), "%s%s%d%s", "/sys/bus/iio/devices/iio:device0","/in_voltage", argp->channel_num,"_raw");
55 retval = access(stringArray,F_OK);
56 if(retval != 0)
57 {
58 return retval;
59 }
60 fd = sigwrap_open(stringArray, O_RDONLY);
61 if (fd < 0) {
62 return fd;
63 }
64 read(fd, val, 5);
65 tmp = atoi(val);
66 (void)sigwrap_close(fd);
67 argp->channel_value = (uint16_t)(tmp);
68 retval = 0;
69 return( retval );
70}
71
72/**
73 * get_adc_val
74 *
75 **/
76int get_adc_val( int channel , unsigned short *data)
77{
78 get_adc_value_t adc_arg;
79
80 /* Set the adc channel to read */
81 adc_arg.channel_num = channel;
82 adc_arg.channel_value = 0;
83
84 if ( -1 == sys_get_adc_vol(&adc_arg)) { return -1; }
85 *data = (unsigned short)(adc_arg.channel_value);
86
87 return ( 0 );
88}