xref: /openbmc/openbmc-tools/adcapp/src/adcifc.c (revision 7c0a5dc19419a453774e9bc5265f60af655ec0c0)
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