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
ShowUsage(void)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
Verbose(char * msg)57 static void Verbose ( char * msg )
58 {
59 if (verbose ) printf ( "%s\n" , msg );
60 }
61
process_arguments(int argc,char ** argv,unsigned char * fan_num,unsigned int * rpm_value,unsigned int * dev_id)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
main(int argc,char * argv[])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