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