blob: b54f7977c6891f46ca387352c4239421ac65c9b0 [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
Raghul R7c0a5dc2021-12-13 17:54:34 +053029 static int adc_directory_check(char *path) {
30 int retval = 0;
31 struct stat sb;
32 if (!(stat(path, &sb) == 0 && S_ISDIR(sb.st_mode))) {
33 printf("%s is not exist!\n", path);
34 retval = -1;
35 }
36 return retval;
37 }
Hongwei Zhangcb66a9e2019-06-05 16:37:19 -040038
39static int sys_get_adc_vol( get_adc_value_t *argp )
40{
41 int retval = -1;
42 int fd;
43 int tmp;
Raghul R7c0a5dc2021-12-13 17:54:34 +053044 int devid = 0;
45 char stringArray[50];
46 char devpath[50];
47 char val[5];
48 if(argp->channel_num > 15) retval = -1;
49#ifdef AST2600_ADCAPP
50 if (argp->channel_num >= 8) {
51 devid = 1;
52 argp->channel_num -= 8;
53 }
54#endif
55 snprintf(devpath, sizeof(devpath), "/sys/bus/iio/devices/iio:device%d",
56 devid);
57 retval = adc_directory_check(devpath);
58 if (retval != 0) {
59 return retval;
60 }
61 snprintf(stringArray, sizeof(stringArray), "%s/in_voltage%d_raw",
62 devpath, argp->channel_num);
63 retval = access(stringArray, F_OK);
64 if(retval != 0)
Hongwei Zhangcb66a9e2019-06-05 16:37:19 -040065 {
66 return retval;
67 }
68 fd = sigwrap_open(stringArray, O_RDONLY);
69 if (fd < 0) {
70 return fd;
71 }
72 read(fd, val, 5);
73 tmp = atoi(val);
74 (void)sigwrap_close(fd);
75 argp->channel_value = (uint16_t)(tmp);
76 retval = 0;
77 return( retval );
78}
79
80/**
81 * get_adc_val
82 *
83 **/
84int get_adc_val( int channel , unsigned short *data)
85{
86 get_adc_value_t adc_arg;
87
88 /* Set the adc channel to read */
89 adc_arg.channel_num = channel;
90 adc_arg.channel_value = 0;
91
92 if ( -1 == sys_get_adc_vol(&adc_arg)) { return -1; }
93 *data = (unsigned short)(adc_arg.channel_value);
94
95 return ( 0 );
96}