1 
2 /*
3 * Pwmtachtool Application
4 * This application provides functions to get/set fan speed / PWM dutycycle.
5 * Copyright (C) <2019>  <American Megatrends International LLC>
6 *
7 */
8 
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <errno.h>
12 #include <string.h>
13 #include <fcntl.h>
14 #include <ctype.h>
15 #include <unistd.h>
16 #include <sys/select.h>
17 #include <sys/ioctl.h>
18 #include <sys/poll.h>
19 #include <sys/time.h>
20 #include <stdint.h>
21 #include <limits.h>
22 #include "libpwmtach.h"
23 
24 #define VERSION_STR "1.0"
25 typedef enum {
26 	SET_FAN_SPEED,
27 	GET_FAN_SPEED,
28 	SET_PWM_DUTYCYCLE,
29 	SET_PWM_DUTYCYCLE_VALUE,
30 	GET_PWM_DUTYCYCLE,
31 	END_OF_FUNCLIST
32 }ePwmTachactions;
33 
34 
35 ePwmTachactions action = END_OF_FUNCLIST;
36 
37 static int verbose = 0;
38 
39 static void ShowUsage ( void )
40 	/*@globals fileSystem@*/
41 	/*@modifies fileSystem@*/
42 {
43 	printf ("PWMTACH Test Tool (Version %s)\n",VERSION_STR);
44 	printf ("Copyright (c) 2009-2015 American Megatrends Inc.\n");
45 	printf( "Usage : pwmtachtool <device_id> <command-option> <fannum>\n" );
46 	printf( "\t--set-fan-speed:         Set Fan's speed. Takes the RPM value as the last argument\n" );
47 	printf("\t\tparameters: <Fan_Number> <Fan_Speed>\n");
48 	printf( "\t--set-pwm-dutycycle:         Set Fan's dutycycle. dutycycle_percentage value should be between 1 to 100\n" );
49 	printf( "\t--set-pwm-dutycycle-value:   Set Fan's dutycycle. dutycycle_value should be between 0 to 255\n" );
50 	printf("\t\tparameters: <pwm_number> <dutycycle value>\n");
51 	printf( "\t--get-pwm-dutycycle:		Get Fan's dutycycle\n");
52 	printf( "\t--get-fan-speed:         Get Fan's speed\n" );
53 	printf( "\t--verbose:         Enable Debug messages\n" );
54 	printf( "\n" );
55 }
56 
57 static void Verbose ( char * msg )
58 {
59 	if (verbose ) printf ( "%s\n" , msg );
60 }
61 
62 static int process_arguments( int argc, char **argv,
63 		unsigned char* fan_num,unsigned int* rpm_value,
64 		unsigned int* dev_id )
65 {
66 	int i = 1;
67 
68 	if (argc < 3)
69 	{
70 		printf("need Device Name and Command to process request\n");
71 		return -1;
72 	}
73 
74 	*dev_id = (unsigned char)strtol( argv[ i++ ], NULL, 10);
75 
76 	if( strcmp( argv[ i ], "--set-fan-speed" ) == 0 )
77 	{
78 		if (argc < 5)
79 		{
80 			printf("need Fan Number and RPM value to process request\n");
81 			return -1;
82 		}
83 		*fan_num = (unsigned char)strtol( argv[ ++i ], NULL, 10);
84 		*rpm_value = (unsigned int)strtol( argv[ ++i ], NULL, 10);
85 		action = SET_FAN_SPEED;
86 	}
87 	else if( strcmp( argv[ i ], "--set-pwm-dutycycle" ) == 0 )
88 	{
89 		if (argc < 5)
90 		{
91 			printf("need Fan Number and Dutycycle value to process request\n");
92 			return -1;
93 		}
94 		*fan_num = (unsigned char)strtol( argv[ ++i ], NULL, 10);
95 		*rpm_value = (unsigned int)strtol( argv[ ++i ], NULL, 10);
96 		action = SET_PWM_DUTYCYCLE;
97 	}
98 	else if( strcmp( argv[ i ], "--set-pwm-dutycycle-value" ) == 0 )
99 	{
100 		if (argc < 5)
101 		{
102 			printf("need Fan Number and Dutycycle value to process request\n");
103 			return -1;
104 		}
105 		*fan_num = (unsigned char)strtol( argv[ ++i ], NULL, 10);
106 		*rpm_value = (unsigned int)strtol( argv[ ++i ], NULL, 10);
107 		action = SET_PWM_DUTYCYCLE_VALUE;
108 	}
109 	else if( strcmp( argv[i], "--get-pwm-dutycycle" ) == 0)
110 	{
111 		if (argc < 4)
112 		{
113 			printf("need PWM Number to process request\n");
114 			return -1;
115 		}
116 		*fan_num = (unsigned char)strtol( argv[ ++i ], NULL, 10);
117 		action = GET_PWM_DUTYCYCLE;
118 	}
119 
120 	else if( strcmp( argv[ i ], "--get-fan-speed" ) == 0 )
121 	{
122 		if (argc < 4)
123 		{
124 			printf("need more parameters to process request\n");
125 			return -1;
126 		}
127 		*fan_num = (unsigned char)strtol( argv[ ++i ], NULL, 10);
128 		action = GET_FAN_SPEED;
129 	}
130 
131 	else if( strcmp( argv[ i ], "--verbose" ) == 0 )
132 		verbose = 1;
133 
134 	return 0;
135 }
136 
137 int main ( int argc , char* argv [] )
138 {
139 	unsigned char fannum = 0, property_id = 0;
140 	unsigned int rpmvalue = 0;
141 	unsigned char dutycycle = 0;
142 	int Value = 0;
143 	int ret = 0;
144 	unsigned int dev_id = 0;
145 
146 	if (argc < 2)
147 	{
148 		ShowUsage();
149 		return 0;
150 	}
151 	ret = process_arguments( argc , argv , &fannum, &rpmvalue, &dev_id );
152 	if (ret != 0)
153 	{
154 		return -1;
155 	}
156 
157 	if (END_OF_FUNCLIST == action)
158 	{
159 		ShowUsage ();
160 		return 0;
161 	}
162 
163 	switch ( action )
164 	{
165 
166 		case SET_FAN_SPEED:
167 			Verbose   ("Inside Set Fan Speed \n");
168 			Value = set_fan_speed (dev_id, fannum, rpmvalue);
169 			if  ( -1 == Value )
170 			{
171 				printf ( "Set Fan Speed Failed \n");
172 				return -1;
173 			}
174 			printf ( "Fan Speed set Successfully\n");
175 			break;
176 		case GET_FAN_SPEED:
177 			Verbose   ("Inside Get Fan Speed \n");
178 			Value = get_fan_speed (dev_id, fannum, &rpmvalue);
179 			if ( -1 == Value)
180 			{
181 				printf ( "Get Fan Speed Failed \n");
182 				return -1;
183 			}
184 			printf("Fan %d speed is %d \n", fannum, rpmvalue);
185 			break;
186 
187 		case SET_PWM_DUTYCYCLE:
188 			Verbose   ("Inside Set PWM Dutycycle \n");
189 			Value = set_pwm_dutycycle (dev_id, fannum, rpmvalue);
190 			if  ( -1 == Value )
191 			{
192 				printf ( "Set PWM Dutycycle Failed \n");
193 				return -1;
194 			}
195 			printf ( "Fan PWM set dutycycle Successfully\n");
196 			break;
197 		case SET_PWM_DUTYCYCLE_VALUE:
198 			Verbose   ("Inside Set PWM Dutycycle Value\n");
199 			Value = set_pwm_dutycycle_value (dev_id, fannum, rpmvalue);
200 			if  ( -1 == Value )
201 			{
202 				printf ( "Set PWM Dutycycle Value Failed \n");
203 				return -1;
204 			}
205 			printf ( "Fan PWM set dutycycle value Successfully\n");
206 			break;
207 		case GET_PWM_DUTYCYCLE:
208 			Verbose   ("Inside Get PWM Dutycycle \n");
209 			Value = get_pwm_dutycycle (dev_id, fannum, &dutycycle);
210 			if  ( -1 == Value )
211 			{
212 				printf ( "Set PWM Dutycycle Failed \n");
213 				return -1;
214 			}
215 			printf ( "PWM %d Dutycycle is %d\n",fannum, dutycycle);
216 			break;
217 
218 		default:
219 			printf("Invalid PWMTACH Function Call\n");
220 			break;
221 	}
222 	return 0;
223 }
224