root/lm-sensors/trunk/prog/sensord/chips.c @ 4265

Revision 4265, 55.4 KB (checked in by khali, 8 years ago)

Add support for the w83627dhg. Original patch by David Holl.
This closes ticket #2157.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * sensord
3 *
4 * A daemon that periodically logs sensor information to syslog.
5 *
6 * Copyright (c) 1999-2002 Merlin Hughes <merlin@merlin.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include "sensord.h"
28#include "lib/chips.h"
29#include "kernel/include/sensors.h"
30
31/* TODO: Temp in C/F */
32
33/** formatters **/
34
35static char buff[4096];
36
37static const char *
38fmtExtra
39(int alarm, int beep) {
40  if (alarm)
41    sprintf (buff + strlen (buff), " [ALARM]");
42  if (beep)
43    sprintf (buff + strlen (buff), " (beep)");
44  return buff;
45}
46
47static const char *
48fmtValu_0
49(const double values[], int alarm, int beep) {
50  sprintf (buff, "%.0f", values[0]);
51  return fmtExtra (alarm, beep);
52}
53
54static const char *
55fmtTemps_0
56(const double values[], int alarm, int beep) {
57  sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
58  return fmtExtra (alarm, beep);
59}
60
61static const char *
62fmtTemps_1_0
63(const double values[], int alarm, int beep) {
64  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
65  return fmtExtra (alarm, beep);
66}
67
68static const char *
69fmtTemps_1
70(const double values[], int alarm, int beep) {
71  sprintf (buff, "%.1f C (limit = %.1f C, hysteresis = %.1f C)", values[0], values[1], values[2]);
72  return fmtExtra (alarm, beep);
73}
74
75static const char *
76fmtTemps_minmax_0
77(const double values[], int alarm, int beep) {
78 sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
79 return fmtExtra (alarm, beep);
80}
81
82static const char *
83fmtVolt_2
84(const double values[], int alarm, int beep) {
85  sprintf (buff, "%+.2f V", values[0]);
86  return fmtExtra (alarm, beep);
87}
88
89static const char *
90fmtVolt_3
91(const double values[], int alarm, int beep) {
92  sprintf (buff, "%+.3f V", values[0]);
93  return fmtExtra (alarm, beep);
94}
95
96static const char *
97fmtVolts_2
98(const double values[], int alarm, int beep) {
99  sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
100  return fmtExtra (alarm, beep);
101}
102
103static const char *
104fmtFans_0
105(const double values[], int alarm, int beep) {
106  sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0], values[1], values[2]);
107  return fmtExtra (alarm, beep);
108}
109
110static const char *
111fmtFans_nodiv_0
112(const double values[], int alarm, int beep) {
113  sprintf (buff, "%.0f RPM (min = %.0f RPM)", values[0], values[1]);
114  return fmtExtra (alarm, beep);
115}
116
117static const char *
118fmtMHz_2
119(const double values[], int alarm, int beep) {
120  sprintf (buff, "%.2f MHz (min = %.2f MHz, max = %.2f MHz)", values[0], values[1], values[2]);
121  return fmtExtra (alarm, beep);
122}
123
124static const char *
125fmtChassisIntrusionDetection
126(const double values[], int alarm, int beep) {
127  sprintf (buff, "Chassis intrusion detection");
128  return fmtExtra (alarm, beep);
129}
130
131static const char *
132fmtBoardTemperatureInput
133(const double values[], int alarm, int beep) {
134  sprintf (buff, "Board temperature input"); /* N.B: "(usually LM75 chips)" */
135  return fmtExtra (alarm, beep);
136}
137
138static const char *
139fmtSoundAlarm
140(const double values[], int alarm, int beep) {
141  sprintf (buff, "Sound alarm %s", (values[0] < 0.5) ? "disabled" : "enabled");
142  return fmtExtra (alarm, beep);
143}
144
145static const char *
146rrdF0
147(const double values[]) {
148  sprintf (buff, "%.0f", values[0]);
149  return buff;
150}
151
152static const char *
153rrdF1
154(const double values[]) {
155  sprintf (buff, "%.1f", values[0]);
156  return buff;
157}
158
159static const char *
160rrdF2
161(const double values[]) {
162  sprintf (buff, "%.2f", values[0]);
163  return buff;
164}
165
166static const char *
167rrdF3
168(const double values[]) {
169  sprintf (buff, "%.3f", values[0]);
170  return buff;
171}
172
173/** DS1621 */
174
175static const char *
176fmtTemps_DS1621
177(const double values[], int alarm, int beep) {
178  sprintf (buff, "%.2f C (min = %.1f C, max = %.1f C)", values[0], values[1], values[2]);
179  if (alarm)
180    sprintf (buff + strlen (buff), " [ALARM(%s)]", (alarm == DS1621_ALARM_TEMP_LOW) ? "LOW" : (alarm == DS1621_ALARM_TEMP_HIGH) ? "HIGH" : "LOW,HIGH");
181  return buff;
182}
183
184static const char *ds1621_names[] = {
185  SENSORS_DS1621_PREFIX, NULL
186};
187
188static const FeatureDescriptor ds1621_features[] = {
189  { fmtTemps_DS1621, rrdF2, DataType_temperature, DS1621_ALARM_TEMP_LOW | DS1621_ALARM_TEMP_HIGH, 0,
190    { SENSORS_DS1621_TEMP, SENSORS_DS1621_TEMP_HYST, SENSORS_DS1621_TEMP_OVER, -1 } }, /* hyst=min, over=max */
191  { NULL }
192};
193
194static const ChipDescriptor ds1621_chip = {
195  ds1621_names, ds1621_features, SENSORS_DS1621_ALARMS, 0
196};
197
198/** LM75 **/
199
200static const char *lm75_names[] = {
201  SENSORS_LM75_PREFIX, NULL
202};
203
204static const FeatureDescriptor lm75_features[] = {
205  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
206    { SENSORS_LM75_TEMP, SENSORS_LM75_TEMP_OVER, SENSORS_LM75_TEMP_HYST, -1 } },
207  { NULL }
208};
209
210static const ChipDescriptor lm75_chip = {
211  lm75_names, lm75_features, 0, 0
212};
213
214/** ADM1021 **/
215
216static const char *
217fmtTemps_ADM1021_0
218(const double values[], int alarm, int beep) {
219  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
220  if (alarm) {
221    int low = alarm & ADM1021_ALARM_TEMP_LOW, high = alarm & ADM1021_ALARM_TEMP_HIGH;
222    sprintf (buff + strlen (buff), " [ALARM(%s%s%s)]", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
223  }
224  return buff;
225}
226
227static const char *
228fmtTemps_ADM1021_1
229(const double values[], int alarm, int beep) {
230  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
231  if (alarm) {
232    int na = alarm & ADM1021_ALARM_RTEMP_NA, low = alarm & ADM1021_ALARM_RTEMP_LOW,
233      high = alarm & ADM1021_ALARM_RTEMP_HIGH;
234    sprintf (buff + strlen (buff), " [ALARM(%s%s%s%s%s)]", na ? "N/A" : "", (na && (low || high)) ? "," : "", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
235  }
236  return buff;
237}
238
239static const char *adm1021_names[] = {
240  SENSORS_ADM1021_PREFIX, SENSORS_ADM1023_PREFIX, NULL
241}; /* N.B: Assume bs sensors 1023 is =~ 1021 */
242
243static const FeatureDescriptor adm1021_features[] = {
244  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
245    { SENSORS_ADM1021_TEMP, SENSORS_ADM1021_TEMP_HYST, SENSORS_ADM1021_TEMP_OVER, -1 } }, /* hyst=min, over=max */
246  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
247    { SENSORS_ADM1021_REMOTE_TEMP, SENSORS_ADM1021_REMOTE_TEMP_HYST, SENSORS_ADM1021_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
248  { fmtValu_0, NULL, DataType_other, 0, 0,
249    { SENSORS_ADM1021_DIE_CODE, -1 } },
250  { NULL }
251};
252
253static const ChipDescriptor adm1021_chip = {
254  adm1021_names, adm1021_features, SENSORS_ADM1021_ALARMS, 0
255};
256
257/** MAX1617 **/
258
259static const char *max1617_names[] = {
260  SENSORS_MAX1617_PREFIX, SENSORS_MAX1617A_PREFIX, SENSORS_THMC10_PREFIX, SENSORS_LM84_PREFIX, SENSORS_GL523_PREFIX, NULL
261}; /* N.B: Assume vs sensors these have no die code */
262
263static const FeatureDescriptor max1617_features[] = {
264  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
265    { SENSORS_MAX1617_TEMP, SENSORS_MAX1617_TEMP_HYST, SENSORS_MAX1617_TEMP_OVER, -1 } }, /* hyst=min, over=max */
266  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
267    { SENSORS_MAX1617_REMOTE_TEMP, SENSORS_MAX1617_REMOTE_TEMP_HYST, SENSORS_MAX1617_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
268  { NULL }
269};
270
271static const ChipDescriptor max1617_chip = {
272  max1617_names, max1617_features, SENSORS_MAX1617_ALARMS, 0
273};
274
275/** ADM9240 **/
276
277static const char *adm9240_names[] = {
278  SENSORS_ADM9240_PREFIX, SENSORS_DS1780_PREFIX, SENSORS_LM81_PREFIX, NULL
279};
280
281static const FeatureDescriptor adm9240_features[] = {
282  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN0, 0,
283    { SENSORS_ADM9240_IN0, SENSORS_ADM9240_IN0_MIN, SENSORS_ADM9240_IN0_MAX, -1 } },
284  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN1, 0,
285    { SENSORS_ADM9240_IN1, SENSORS_ADM9240_IN1_MIN, SENSORS_ADM9240_IN1_MAX, -1 } },
286  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN2, 0,
287    { SENSORS_ADM9240_IN2, SENSORS_ADM9240_IN2_MIN, SENSORS_ADM9240_IN2_MAX, -1 } },
288  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN3, 0,
289    { SENSORS_ADM9240_IN3, SENSORS_ADM9240_IN3_MIN, SENSORS_ADM9240_IN3_MAX, -1 } },
290  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN4, 0,
291    { SENSORS_ADM9240_IN4, SENSORS_ADM9240_IN4_MIN, SENSORS_ADM9240_IN4_MAX, -1 } },
292  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN5, 0,
293    { SENSORS_ADM9240_IN5, SENSORS_ADM9240_IN5_MIN, SENSORS_ADM9240_IN5_MAX, -1 } },
294  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN1, 0,
295    { SENSORS_ADM9240_FAN1, SENSORS_ADM9240_FAN1_MIN, SENSORS_ADM9240_FAN1_DIV, -1 } },
296  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN2, 0,
297    { SENSORS_ADM9240_FAN2, SENSORS_ADM9240_FAN2_MIN, SENSORS_ADM9240_FAN2_DIV, -1 } },
298  { fmtTemps_1_0, rrdF1, DataType_temperature, ADM9240_ALARM_TEMP, 0,
299    { SENSORS_ADM9240_TEMP, SENSORS_ADM9240_TEMP_OVER, SENSORS_ADM9240_TEMP_HYST, -1 } },
300  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
301    { SENSORS_ADM9240_VID, -1 } },
302  { fmtChassisIntrusionDetection, NULL, DataType_other, ADM9240_ALARM_CHAS, 0,
303    { SENSORS_ADM9240_ALARMS, -1 } },
304  { NULL }
305};
306
307static const ChipDescriptor adm9240_chip = {
308  adm9240_names, adm9240_features, SENSORS_ADM9240_ALARMS, 0
309};
310
311/** SIS5595 **/
312
313static const char *sis5595_names[] = {
314  SENSORS_SIS5595_PREFIX, NULL
315};
316
317static const FeatureDescriptor sis5595_features[] = {
318  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN0, 0,
319    { SENSORS_SIS5595_IN0, SENSORS_SIS5595_IN0_MIN, SENSORS_SIS5595_IN0_MAX, -1 } },
320  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN1, 0,
321    { SENSORS_SIS5595_IN1, SENSORS_SIS5595_IN1_MIN, SENSORS_SIS5595_IN1_MAX, -1 } },
322  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN2, 0,
323    { SENSORS_SIS5595_IN2, SENSORS_SIS5595_IN2_MIN, SENSORS_SIS5595_IN2_MAX, -1 } },
324  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN3, 0,
325    { SENSORS_SIS5595_IN3, SENSORS_SIS5595_IN3_MIN, SENSORS_SIS5595_IN3_MAX, -1 } },
326  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN4, 0,
327    { SENSORS_SIS5595_IN4, SENSORS_SIS5595_IN4_MIN, SENSORS_SIS5595_IN4_MAX, -1 } },
328  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN1, 0,
329    { SENSORS_SIS5595_FAN1, SENSORS_SIS5595_FAN1_MIN, SENSORS_SIS5595_FAN1_DIV, -1 } },
330  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN2, 0,
331    { SENSORS_SIS5595_FAN2, SENSORS_SIS5595_FAN2_MIN, SENSORS_SIS5595_FAN2_DIV, -1 } },
332  { fmtTemps_0, rrdF0, DataType_temperature, SIS5595_ALARM_TEMP, 0,
333    { SENSORS_SIS5595_TEMP, SENSORS_SIS5595_TEMP_OVER, SENSORS_SIS5595_TEMP_HYST, -1 } },
334  { fmtBoardTemperatureInput, NULL, DataType_other, SIS5595_ALARM_BTI, 0,
335    { SENSORS_SIS5595_ALARMS, -1 } },
336  { NULL }
337};
338
339static const ChipDescriptor sis5595_chip = {
340  sis5595_names, sis5595_features, SENSORS_SIS5595_ALARMS, 0
341};
342
343/** VIA686A **/
344
345static const char *via686a_names[] = {
346  SENSORS_VIA686A_PREFIX, NULL
347};
348
349static const FeatureDescriptor via686a_features[] = {
350  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN0, 0,
351    { SENSORS_VIA686A_IN0, SENSORS_VIA686A_IN0_MIN, SENSORS_VIA686A_IN0_MAX, -1 } },
352  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN1, 0,
353    { SENSORS_VIA686A_IN1, SENSORS_VIA686A_IN1_MIN, SENSORS_VIA686A_IN1_MAX, -1 } },
354  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN2, 0,
355    { SENSORS_VIA686A_IN2, SENSORS_VIA686A_IN2_MIN, SENSORS_VIA686A_IN2_MAX, -1 } },
356  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN3, 0,
357    { SENSORS_VIA686A_IN3, SENSORS_VIA686A_IN3_MIN, SENSORS_VIA686A_IN3_MAX, -1 } },
358  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN4, 0,
359    { SENSORS_VIA686A_IN4, SENSORS_VIA686A_IN4_MIN, SENSORS_VIA686A_IN4_MAX, -1 } },
360  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN1, 0,
361    { SENSORS_VIA686A_FAN1, SENSORS_VIA686A_FAN1_MIN, SENSORS_VIA686A_FAN1_DIV, -1 } },
362  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN2, 0,
363    { SENSORS_VIA686A_FAN2, SENSORS_VIA686A_FAN2_MIN, SENSORS_VIA686A_FAN2_DIV, -1 } },
364  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP, 0,
365    { SENSORS_VIA686A_TEMP, SENSORS_VIA686A_TEMP_OVER, SENSORS_VIA686A_TEMP_HYST, -1 } },
366  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP2, 0,
367    { SENSORS_VIA686A_TEMP2, SENSORS_VIA686A_TEMP2_OVER, SENSORS_VIA686A_TEMP2_HYST, -1 } },
368  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP3, 0,
369    { SENSORS_VIA686A_TEMP3, SENSORS_VIA686A_TEMP3_OVER, SENSORS_VIA686A_TEMP3_HYST, -1 } },
370  { NULL }
371};
372
373static const ChipDescriptor via686a_chip = {
374  via686a_names, via686a_features, SENSORS_VIA686A_ALARMS, 0
375};
376
377/** LM78 **/
378
379static const char *lm78_names[] = {
380  SENSORS_LM78_PREFIX, SENSORS_LM78J_PREFIX, SENSORS_LM79_PREFIX, NULL
381};
382
383static const FeatureDescriptor lm78_features[] = {
384  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN0, 0,
385    { SENSORS_LM78_IN0, SENSORS_LM78_IN0_MIN, SENSORS_LM78_IN0_MAX, -1 } },
386  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN1, 0,
387    { SENSORS_LM78_IN1, SENSORS_LM78_IN1_MIN, SENSORS_LM78_IN1_MAX, -1 } },
388  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN2, 0,
389    { SENSORS_LM78_IN2, SENSORS_LM78_IN2_MIN, SENSORS_LM78_IN2_MAX, -1 } },
390  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN3, 0,
391    { SENSORS_LM78_IN3, SENSORS_LM78_IN3_MIN, SENSORS_LM78_IN3_MAX, -1 } },
392  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN4, 0,
393    { SENSORS_LM78_IN4, SENSORS_LM78_IN4_MIN, SENSORS_LM78_IN4_MAX, -1 } },
394  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN5, 0,
395    { SENSORS_LM78_IN5, SENSORS_LM78_IN5_MIN, SENSORS_LM78_IN5_MAX, -1 } },
396  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN6, 0,
397    { SENSORS_LM78_IN6, SENSORS_LM78_IN6_MIN, SENSORS_LM78_IN6_MAX, -1 } },
398  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN1, 0,
399    { SENSORS_LM78_FAN1, SENSORS_LM78_FAN1_MIN, SENSORS_LM78_FAN1_DIV, -1 } },
400  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN2, 0,
401    { SENSORS_LM78_FAN2, SENSORS_LM78_FAN2_MIN, SENSORS_LM78_FAN2_DIV, -1 } },
402  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN3, 0,
403    { SENSORS_LM78_FAN3, SENSORS_LM78_FAN3_MIN, SENSORS_LM78_FAN3_DIV, -1 } },
404  { fmtTemps_1_0, rrdF1, DataType_rpm, LM78_ALARM_TEMP, 0,
405    { SENSORS_LM78_TEMP, SENSORS_LM78_TEMP_OVER, SENSORS_LM78_TEMP_HYST, -1 } },
406  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
407    { SENSORS_LM78_VID, -1 } },
408  { fmtBoardTemperatureInput, NULL, DataType_other, LM78_ALARM_BTI, 0,
409    { SENSORS_LM78_ALARMS, -1 } },
410  { fmtChassisIntrusionDetection, NULL, DataType_other, LM78_ALARM_CHAS, 0,
411    { SENSORS_LM78_ALARMS, -1 } },
412  { NULL }
413};
414
415static const ChipDescriptor lm78_chip = {
416  lm78_names, lm78_features, SENSORS_LM78_ALARMS, 0
417};
418
419/** GL518 **/
420
421/* N.B: sensors supports a "gl518sm-r00" but it is not picked up in main.c...
422static const char *
423fmtVolts_GL518_R00
424(const double values[], int alarm, int beep) {
425  if (values[0] == 0.0)
426    sprintf (buff, "n/a (min = %+.2f V, max = %+.2f V)", values[1], values[2]);
427  else
428    sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
429  return fmtExtra (alarm, beep);
430}
431*/
432
433static const char *gl518_names[] = {
434  SENSORS_GL518_PREFIX, NULL
435};
436
437static const FeatureDescriptor gl518_features[] = {
438  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VDD, GL518_ALARM_VDD,
439    { SENSORS_GL518_VDD, SENSORS_GL518_VDD_MIN, SENSORS_GL518_VDD_MAX, -1 } },
440  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN1, GL518_ALARM_VIN1,
441    { SENSORS_GL518_VIN1, SENSORS_GL518_VIN1_MIN, SENSORS_GL518_VIN1_MAX, -1 } },
442  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN2, GL518_ALARM_VIN2,
443    { SENSORS_GL518_VIN2, SENSORS_GL518_VIN2_MIN, SENSORS_GL518_VIN2_MAX, -1 } },
444  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN3, GL518_ALARM_VIN3,
445    { SENSORS_GL518_VIN3, SENSORS_GL518_VIN3_MIN, SENSORS_GL518_VIN3_MAX, -1 } },
446  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN1, GL518_ALARM_FAN1,
447    { SENSORS_GL518_FAN1, SENSORS_GL518_FAN1_MIN, SENSORS_GL518_FAN1_DIV, -1 } },
448  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN2, GL518_ALARM_FAN2,
449    { SENSORS_GL518_FAN2, SENSORS_GL518_FAN2_MIN, SENSORS_GL518_FAN2_DIV, -1 } },
450  { fmtTemps_1_0, rrdF1, DataType_temperature, GL518_ALARM_TEMP, GL518_ALARM_TEMP,
451    { SENSORS_GL518_TEMP, SENSORS_GL518_TEMP_OVER, SENSORS_GL518_TEMP_HYST, -1 } },
452  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
453    { SENSORS_GL518_BEEP_ENABLE, -1 } },
454  { NULL }
455};
456
457static const ChipDescriptor gl518_chip = {
458  gl518_names, gl518_features, SENSORS_GL518_ALARMS, SENSORS_GL518_BEEPS
459};
460
461/** ADM1025 **/
462
463static const char *
464fmtTemps_ADM1025
465(const double values[], int alarm, int beep) {
466  sprintf (buff, "%.1f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
467  return fmtExtra (alarm, beep);
468}
469
470static const char *adm1025_names[] = {
471  SENSORS_ADM1025_PREFIX, NULL
472};
473
474static const FeatureDescriptor adm1025_features[] = {
475  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN0, 0,
476    { SENSORS_ADM1025_IN0, SENSORS_ADM1025_IN0_MIN, SENSORS_ADM1025_IN0_MAX, -1 } },
477  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN1, 0,
478    { SENSORS_ADM1025_IN1, SENSORS_ADM1025_IN1_MIN, SENSORS_ADM1025_IN1_MAX, -1 } },
479  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN2, 0,
480    { SENSORS_ADM1025_IN2, SENSORS_ADM1025_IN2_MIN, SENSORS_ADM1025_IN2_MAX, -1 } },
481  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN3, 0,
482    { SENSORS_ADM1025_IN3, SENSORS_ADM1025_IN3_MIN, SENSORS_ADM1025_IN3_MAX, -1 } },
483  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN4, 0,
484    { SENSORS_ADM1025_IN4, SENSORS_ADM1025_IN4_MIN, SENSORS_ADM1025_IN4_MAX, -1 } },
485  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN5, 0,
486    { SENSORS_ADM1025_IN5, SENSORS_ADM1025_IN5_MIN, SENSORS_ADM1025_IN5_MAX, -1 } },
487  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_TEMP, 0,
488    { SENSORS_ADM1025_TEMP1, SENSORS_ADM1025_TEMP1_LOW, SENSORS_ADM1025_TEMP1_HIGH, -1 } },
489  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_RTEMP, 0,
490    { SENSORS_ADM1025_TEMP2, SENSORS_ADM1025_TEMP2_LOW, SENSORS_ADM1025_TEMP2_HIGH, -1 } },
491  { NULL }
492};
493
494static const ChipDescriptor adm1025_chip = {
495  adm1025_names, adm1025_features, SENSORS_ADM1025_ALARMS, 0
496};
497
498/** LM80 **/
499
500static const char *
501fmtTemps_LM80
502(const double values[], int alarm, int beep) {
503  sprintf (buff, "%.2f C (hot limit = %.0f C, hot hysteresis = %.0f C, os limit = %.0f C, os hysteresis = %.0f C)", values[0], values[1], values[2], values[3], values[4]);
504  return fmtExtra (alarm, beep);
505}
506
507static const char *lm80_names[] = {
508  SENSORS_LM80_PREFIX, NULL
509};
510
511static const FeatureDescriptor lm80_features[] = {
512  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN0, 0,
513    { SENSORS_LM80_IN0, SENSORS_LM80_IN0_MIN, SENSORS_LM80_IN0_MAX, -1 } },
514  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN1, 0,
515    { SENSORS_LM80_IN1, SENSORS_LM80_IN1_MIN, SENSORS_LM80_IN1_MAX, -1 } },
516  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN2, 0,
517    { SENSORS_LM80_IN2, SENSORS_LM80_IN2_MIN, SENSORS_LM80_IN2_MAX, -1 } },
518  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN3, 0,
519    { SENSORS_LM80_IN3, SENSORS_LM80_IN3_MIN, SENSORS_LM80_IN3_MAX, -1 } },
520  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN4, 0,
521    { SENSORS_LM80_IN4, SENSORS_LM80_IN4_MIN, SENSORS_LM80_IN4_MAX, -1 } },
522  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN5, 0,
523    { SENSORS_LM80_IN5, SENSORS_LM80_IN5_MIN, SENSORS_LM80_IN5_MAX, -1 } },
524  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN6, 0,
525    { SENSORS_LM80_IN6, SENSORS_LM80_IN6_MIN, SENSORS_LM80_IN6_MAX, -1 } },
526  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN1, 0,
527    { SENSORS_LM80_FAN1, SENSORS_LM80_FAN1_MIN, SENSORS_LM80_FAN1_DIV, -1 } },
528  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN2, 0,
529    { SENSORS_LM80_FAN2, SENSORS_LM80_FAN2_MIN, SENSORS_LM80_FAN2_DIV, -1 } },
530  { fmtTemps_LM80, rrdF2, DataType_temperature, LM80_ALARM_TEMP_HOT, 0,
531    { SENSORS_LM80_TEMP, SENSORS_LM80_TEMP_HOT_MAX, SENSORS_LM80_TEMP_HOT_HYST, SENSORS_LM80_TEMP_OS_MAX, SENSORS_LM80_TEMP_OS_HYST, -1 } },
532  { fmtBoardTemperatureInput, NULL, DataType_other, LM80_ALARM_BTI, 0,
533    { SENSORS_LM80_ALARMS, -1 } },
534  { fmtChassisIntrusionDetection, NULL, DataType_other, LM80_ALARM_CHAS, 0,
535    { SENSORS_LM80_ALARMS, -1 } },
536  { NULL }
537};
538
539static const ChipDescriptor lm80_chip = {
540  lm80_names, lm80_features, SENSORS_LM80_ALARMS, 0
541};
542
543/** IT87 (thanks to Mike Black) **/
544
545static const char *it87_names[] = {
546  SENSORS_IT87_PREFIX, SENSORS_IT8712_PREFIX,
547  SENSORS_IT8716_PREFIX, SENSORS_IT8718_PREFIX, NULL
548};
549
550static const FeatureDescriptor it87_features[] = {
551  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN0, 0,
552    { SENSORS_IT87_IN0, SENSORS_IT87_IN0_MIN, SENSORS_IT87_IN0_MAX, -1 } },
553  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN1, 0,
554    { SENSORS_IT87_IN1, SENSORS_IT87_IN1_MIN, SENSORS_IT87_IN1_MAX, -1 } },
555  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN2, 0,
556    { SENSORS_IT87_IN2, SENSORS_IT87_IN2_MIN, SENSORS_IT87_IN2_MAX, -1 } },
557  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN3, 0,
558    { SENSORS_IT87_IN3, SENSORS_IT87_IN3_MIN, SENSORS_IT87_IN3_MAX, -1 } },
559  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN4, 0,
560    { SENSORS_IT87_IN4, SENSORS_IT87_IN4_MIN, SENSORS_IT87_IN4_MAX, -1 } },
561  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN5, 0,
562    { SENSORS_IT87_IN5, SENSORS_IT87_IN5_MIN, SENSORS_IT87_IN5_MAX, -1 } },
563  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN6, 0,
564    { SENSORS_IT87_IN6, SENSORS_IT87_IN6_MIN, SENSORS_IT87_IN6_MAX, -1 } },
565  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN7, 0,
566    { SENSORS_IT87_IN7, SENSORS_IT87_IN7_MIN, SENSORS_IT87_IN7_MAX, -1 } },
567  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN1, 0,
568    { SENSORS_IT87_FAN1, SENSORS_IT87_FAN1_MIN, -1 } },
569  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN2, 0,
570    { SENSORS_IT87_FAN2, SENSORS_IT87_FAN2_MIN, -1 } },
571  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN3, 0,
572    { SENSORS_IT87_FAN3, SENSORS_IT87_FAN3_MIN, -1 } },
573  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP1, 0,
574    { SENSORS_IT87_TEMP1, SENSORS_IT87_TEMP1_LOW, SENSORS_IT87_TEMP1_HIGH, -1 } },
575  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP2, 0,
576    { SENSORS_IT87_TEMP2, SENSORS_IT87_TEMP2_LOW, SENSORS_IT87_TEMP2_HIGH, -1 } },
577  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP3, 0,
578    { SENSORS_IT87_TEMP3, SENSORS_IT87_TEMP3_LOW, SENSORS_IT87_TEMP3_HIGH, -1 } },
579  { NULL }
580};
581
582static const ChipDescriptor it87_chip = {
583  it87_names, it87_features, SENSORS_IT87_ALARMS, 0
584};
585
586/** W83781D **/
587
588static const char *
589fmtTemps_W83781D
590(const double values[], int alarm, int beep) {
591  if (values[2] == 127) {
592    sprintf (buff, "%.0f C (limit = %.0f C)",
593             values[0], values[1]);
594  } else {
595    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)",
596             values[0], values[1], values[2]);
597  }
598  return fmtExtra (alarm, beep);
599}
600
601static const char *w83781d_names[] = {
602  SENSORS_W83781D_PREFIX, NULL
603};
604
605static const FeatureDescriptor w83781d_features[] = {
606  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
607    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
608  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
609    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
610  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
611    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
612  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
613    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
614  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
615    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
616  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
617    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
618  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
619    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
620  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
621    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
622  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
623    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
624  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
625    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
626  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
627    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
628  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
629    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
630  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
631    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
632  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
633    { SENSORS_W83781D_VID, -1 } },
634  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
635    { SENSORS_W83781D_ALARMS, -1 } },
636  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
637    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
638  { NULL }
639};
640
641static const ChipDescriptor w83781d_chip = {
642  w83781d_names, w83781d_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
643};
644
645/** AS99127F **/
646
647static const char *as99127f_names[] = {
648  SENSORS_AS99127F_PREFIX, NULL
649};
650
651static const FeatureDescriptor as99127f_features[] = {
652  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
653    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
654  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
655    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
656  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
657    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
658  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
659    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
660  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
661    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
662  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
663    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
664  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
665    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
666  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
667    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
668  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
669    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
670  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
671    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
672  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
673    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
674  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
675    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
676  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
677    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
678  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
679    { SENSORS_W83781D_VID, -1 } },
680  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
681    { SENSORS_W83781D_ALARMS, -1 } },
682  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
683    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
684  { NULL }
685};
686
687static const ChipDescriptor as99127f_chip = {
688  as99127f_names, as99127f_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
689};
690
691/** W83782D **/
692
693static const char *
694fmtTemps_W8378x_0
695(const double values[], int alarm, int beep) {
696  int sensorID = (int) values[3];
697  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
698    (sensorID == 2) ? "3904 transistor" : "thermistor";
699  if (values[2] == 127) {
700    sprintf (buff, "%.0f C (limit = %.0f C, sensors = %s)",
701             values[0], values[1], sensor);
702  } else {
703    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C, sensors = %s)",
704             values[0], values[1], values[2], sensor);
705  }
706  return fmtExtra (alarm, beep);
707}
708
709static const char *
710fmtTemps_W8378x_1
711(const double values[], int alarm, int beep) {
712  int sensorID = (int) values[3];
713  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
714    (sensorID == 2) ? "3904 transistor" : "thermistor";
715  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C, sensor = %s)",
716           values[0], values[1], values[2], sensor);
717  return fmtExtra (alarm, beep);
718}
719
720static const char *w83782d_names[] = {
721  SENSORS_W83782D_PREFIX, SENSORS_W83627HF_PREFIX, SENSORS_W83627THF_PREFIX, SENSORS_W83637HF_PREFIX, NULL
722};
723
724static const FeatureDescriptor w83782d_features[] = {
725  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
726    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
727  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
728    { SENSORS_W83782D_IN1, SENSORS_W83782D_IN1_MIN, SENSORS_W83782D_IN1_MAX, -1 } },
729  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
730    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
731  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
732    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
733  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
734    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
735  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
736    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
737  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
738    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
739  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN7, W83782D_ALARM_IN7,
740    { SENSORS_W83782D_IN7, SENSORS_W83782D_IN7_MIN, SENSORS_W83782D_IN7_MAX, -1 } },
741  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN8, W83782D_ALARM_IN8,
742    { SENSORS_W83782D_IN8, SENSORS_W83782D_IN8_MIN, SENSORS_W83782D_IN8_MAX, -1 } },
743  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
744    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
745  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
746    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
747  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
748    { SENSORS_W83782D_FAN3, SENSORS_W83782D_FAN3_MIN, SENSORS_W83782D_FAN3_DIV, -1 } },
749  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
750    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
751  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
752    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
753  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
754    { SENSORS_W83782D_TEMP3, SENSORS_W83782D_TEMP3_OVER, SENSORS_W83782D_TEMP3_HYST, SENSORS_W83782D_SENS3, -1 } },
755  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
756    { SENSORS_W83782D_VID, -1 } },
757  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
758    { SENSORS_W83781D_ALARMS, -1 } },
759  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
760    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
761  { NULL }
762};
763
764static const ChipDescriptor w83782d_chip = {
765  w83782d_names, w83782d_features, SENSORS_W83782D_ALARMS, SENSORS_W83782D_BEEPS
766};
767
768/** W83783S **/
769
770static const char *w83783s_names[] = {
771  SENSORS_W83783S_PREFIX, NULL
772};
773
774static const FeatureDescriptor w83783s_features[] = {
775  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
776    { SENSORS_W83783S_IN0, SENSORS_W83783S_IN0_MIN, SENSORS_W83783S_IN0_MAX, -1 } },
777  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
778    { SENSORS_W83783S_IN2, SENSORS_W83783S_IN2_MIN, SENSORS_W83783S_IN2_MAX, -1 } },
779  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
780    { SENSORS_W83783S_IN3, SENSORS_W83783S_IN3_MIN, SENSORS_W83783S_IN3_MAX, -1 } },
781  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
782    { SENSORS_W83783S_IN4, SENSORS_W83783S_IN4_MIN, SENSORS_W83783S_IN4_MAX, -1 } },
783  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
784    { SENSORS_W83783S_IN5, SENSORS_W83783S_IN5_MIN, SENSORS_W83783S_IN5_MAX, -1 } },
785  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
786    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
787  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
788    { SENSORS_W83783S_FAN1, SENSORS_W83783S_FAN1_MIN, SENSORS_W83783S_FAN1_DIV, -1 } },
789  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
790    { SENSORS_W83783S_FAN2, SENSORS_W83783S_FAN2_MIN, SENSORS_W83783S_FAN2_DIV, -1 } },
791  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
792    { SENSORS_W83783S_FAN3, SENSORS_W83783S_FAN3_MIN, SENSORS_W83783S_FAN3_DIV, -1 } },
793  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
794    { SENSORS_W83783S_TEMP1, SENSORS_W83783S_TEMP1_OVER, SENSORS_W83783S_TEMP1_HYST, SENSORS_W83783S_SENS1, -1 } },
795  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
796    { SENSORS_W83783S_TEMP2, SENSORS_W83783S_TEMP2_OVER, SENSORS_W83783S_TEMP2_HYST, SENSORS_W83783S_SENS2, -1 } },
797  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
798    { SENSORS_W83783S_VID, -1 } },
799  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
800    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
801  { NULL }
802};
803
804static const ChipDescriptor w83783s_chip = {
805  w83783s_names, w83783s_features, SENSORS_W83783S_ALARMS, SENSORS_W83783S_BEEPS
806};
807
808/** W83697HF **/
809
810static const char *w83697hf_names[] = {
811  SENSORS_W83697HF_PREFIX, NULL
812};
813
814static const FeatureDescriptor w83697hf_features[] = {
815  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
816    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
817  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
818    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
819  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
820    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
821  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
822    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
823  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
824    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
825  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
826    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
827  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
828    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
829  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
830    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
831  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
832    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
833  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
834    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
835  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
836    { SENSORS_W83781D_ALARMS, -1 } },
837  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
838    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
839  { NULL }
840};
841
842static const ChipDescriptor w83697hf_chip = {
843  w83697hf_names, w83697hf_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
844};
845
846
847/** MAXILIFE **/
848
849static const char *
850fmtTemps_Maxilife
851(const double values[], int alarm, int beep) {
852  if (!values[0] && !values[1] && !values[2])
853    return NULL;
854  return fmtTemps_1_0 (values, alarm, beep);
855}
856
857static const char *
858rrdTemps_Maxilife
859(const double values[]) {
860  if (!values[0] && !values[1] && !values[2])
861    return NULL;
862  return rrdF1 (values);
863}
864
865static const char *
866fmtFans_Maxilife
867(const double values[], int alarm, int beep) {
868  if (!values[0] && !values[1] && !values[2])
869    return NULL;
870  if (values[0] < 0) {
871    sprintf (buff, "Off (min = %.0f RPM, div = %.0f)", values[1], values[2]); 
872  } else {
873    sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0] / values[2], values[1] / values[2], values[2]); 
874  }
875  return fmtExtra (alarm, beep);
876}
877
878static const char *
879rrdFans_Maxilife
880(const double values[]) {
881  if (!values[0] && !values[1] && !values[2])
882    return NULL;
883  if (values[0] < 0) {
884    return NULL;
885  } else {
886    sprintf (buff, "%.0f", values[0] / values[2]);
887    return buff;
888  }
889}
890
891static const char *
892fmtMHz_Maxilife
893(const double values[], int alarm, int beep) {
894  if (!values[0] && !values[1] && !values[2])
895    return NULL;
896  return fmtMHz_2 (values, alarm, beep);
897}
898
899static const char *
900rrdMHz_Maxilife
901(const double values[]) {
902  if (!values[0] && !values[1] && !values[2])
903    return NULL;
904  return rrdF2 (values);
905}
906
907static const char *
908fmtVolts_Maxilife
909(const double values[], int alarm, int beep) {
910  if (!values[0] && !values[1] && !values[2])
911    return NULL;
912  return fmtVolts_2 (values, alarm, beep);
913}
914
915static const char *
916rrdVolts_Maxilife
917(const double values[]) {
918  if (!values[0] && !values[1] && !values[2])
919    return NULL;
920  return rrdF2 (values);
921}
922
923static const char *maxilife_names[] = {
924  SENSORS_MAXI_CG_PREFIX, SENSORS_MAXI_CO_PREFIX, SENSORS_MAXI_AS_PREFIX, SENSORS_MAXI_NBA_PREFIX, NULL
925};
926
927static const FeatureDescriptor maxilife_features[] = {
928  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
929    { SENSORS_MAXI_CG_TEMP1, SENSORS_MAXI_CG_TEMP1_MAX, SENSORS_MAXI_CG_TEMP1_HYST, -1 } },
930  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP2, 0,
931    { SENSORS_MAXI_CG_TEMP2, SENSORS_MAXI_CG_TEMP2_MAX, SENSORS_MAXI_CG_TEMP2_HYST, -1 } },
932  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
933    { SENSORS_MAXI_CG_TEMP3, SENSORS_MAXI_CG_TEMP3_MAX, SENSORS_MAXI_CG_TEMP3_HYST, -1 } },
934  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP4, 0,
935    { SENSORS_MAXI_CG_TEMP4, SENSORS_MAXI_CG_TEMP4_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
936  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP5, 0,
937    { SENSORS_MAXI_CG_TEMP5, SENSORS_MAXI_CG_TEMP5_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
938  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN1, 0,
939    { SENSORS_MAXI_CG_FAN1, SENSORS_MAXI_CG_FAN1_MIN, SENSORS_MAXI_CG_FAN1_DIV, -1 } },
940  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN2, 0,
941    { SENSORS_MAXI_CG_FAN2, SENSORS_MAXI_CG_FAN2_MIN, SENSORS_MAXI_CG_FAN2_DIV, -1 } },
942  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN3, 0,
943    { SENSORS_MAXI_CG_FAN3, SENSORS_MAXI_CG_FAN3_MIN, SENSORS_MAXI_CG_FAN3_DIV, -1 } },
944  { fmtMHz_Maxilife, rrdMHz_Maxilife, DataType_mhz, MAXI_ALARM_PLL, 0,
945    { SENSORS_MAXI_CG_PLL, SENSORS_MAXI_CG_PLL_MIN, SENSORS_MAXI_CG_PLL_MAX, -1 } },
946  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID1, 0,
947    { SENSORS_MAXI_CG_VID1, SENSORS_MAXI_CG_VID1_MIN, SENSORS_MAXI_CG_VID1_MAX, -1 } },
948  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID2, 0,
949    { SENSORS_MAXI_CG_VID2, SENSORS_MAXI_CG_VID2_MIN, SENSORS_MAXI_CG_VID2_MAX, -1 } },
950  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID3, 0,
951    { SENSORS_MAXI_CG_VID3, SENSORS_MAXI_CG_VID3_MIN, SENSORS_MAXI_CG_VID3_MAX, -1 } },
952  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID4, 0,
953    { SENSORS_MAXI_CG_VID4, SENSORS_MAXI_CG_VID4_MIN, SENSORS_MAXI_CG_VID4_MAX, -1 } },
954  { NULL }
955};
956
957static const ChipDescriptor maxilife_chip = {
958  maxilife_names, maxilife_features, SENSORS_MAXI_CG_ALARMS, 0
959};
960
961/** ASB100 **/
962
963static const char *asb100_names[] = {
964        SENSORS_ASB100_PREFIX, NULL
965};
966
967static const FeatureDescriptor asb100_features[] = {
968  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
969    { SENSORS_ASB100_IN0, SENSORS_ASB100_IN0_MIN, SENSORS_ASB100_IN0_MAX, -1 } },
970  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
971    { SENSORS_ASB100_IN1, SENSORS_ASB100_IN1_MIN, SENSORS_ASB100_IN1_MAX, -1 } },
972  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
973    { SENSORS_ASB100_IN2, SENSORS_ASB100_IN2_MIN, SENSORS_ASB100_IN2_MAX, -1 } },
974  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
975    { SENSORS_ASB100_IN3, SENSORS_ASB100_IN3_MIN, SENSORS_ASB100_IN3_MAX, -1 } },
976  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
977    { SENSORS_ASB100_IN4, SENSORS_ASB100_IN4_MIN, SENSORS_ASB100_IN4_MAX, -1 } },
978  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
979    { SENSORS_ASB100_IN5, SENSORS_ASB100_IN5_MIN, SENSORS_ASB100_IN5_MAX, -1 } },
980  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
981    { SENSORS_ASB100_IN6, SENSORS_ASB100_IN6_MIN, SENSORS_ASB100_IN6_MAX, -1 } },
982
983  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
984    { SENSORS_ASB100_FAN1, SENSORS_ASB100_FAN1_MIN, -1 } },
985  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
986    { SENSORS_ASB100_FAN2, SENSORS_ASB100_FAN2_MIN, -1 } },
987  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
988    { SENSORS_ASB100_FAN3, SENSORS_ASB100_FAN3_MIN, -1 } },
989
990  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
991    { SENSORS_ASB100_TEMP1, SENSORS_ASB100_TEMP1_HYST, SENSORS_ASB100_TEMP1_OVER, -1 } },
992  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
993    { SENSORS_ASB100_TEMP2, SENSORS_ASB100_TEMP2_HYST, SENSORS_ASB100_TEMP2_OVER, -1 } },
994  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
995    { SENSORS_ASB100_TEMP3, SENSORS_ASB100_TEMP3_HYST, SENSORS_ASB100_TEMP3_OVER, -1 } },
996  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
997    { SENSORS_ASB100_TEMP4, SENSORS_ASB100_TEMP4_HYST, SENSORS_ASB100_TEMP4_OVER, -1 } },
998
999  { NULL }
1000};
1001
1002static const ChipDescriptor asb100_chip = {
1003  asb100_names, asb100_features, 0, 0
1004};
1005
1006/** PC87360 **/
1007
1008static const char *
1009fmtTemps_PC87360_0
1010(const double values[], int alarm, int beep) {
1011  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C, crit = %.0f C)",
1012           values[0], values[1], values[2], values[3]);
1013  return fmtExtra (alarm, beep);
1014}
1015
1016static const char *
1017fmtTemps_PC87360_1
1018(const double values[], int alarm, int beep) {
1019  sprintf (buff, "%.1f C (min = %.1f C, max = %.1f C, crit = %.1f C)",
1020           values[0], values[1], values[2], values[3]);
1021  return fmtExtra (alarm, beep);
1022}
1023
1024static const char *pc87360_names[] = {
1025  SENSORS_PC87360_PREFIX,
1026  SENSORS_PC87363_PREFIX,
1027  SENSORS_PC87364_PREFIX,
1028  SENSORS_PC87365_PREFIX,
1029  SENSORS_PC87366_PREFIX,
1030  NULL
1031};
1032
1033static const FeatureDescriptor pc87360_features[] = {
1034  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1035    { SENSORS_PC87360_FAN1, SENSORS_PC87360_FAN1_MIN, SENSORS_PC87360_FAN1_DIV, -1 } },
1036  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1037    { SENSORS_PC87360_FAN2, SENSORS_PC87360_FAN2_MIN, SENSORS_PC87360_FAN2_DIV, -1 } },
1038  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1039    { SENSORS_PC87360_FAN3, SENSORS_PC87360_FAN3_MIN, SENSORS_PC87360_FAN3_DIV, -1 } },
1040
1041  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 0, 0,
1042    { SENSORS_PC87360_TEMP1, SENSORS_PC87360_TEMP1_MIN, SENSORS_PC87360_TEMP1_MAX,
1043      SENSORS_PC87360_TEMP1_CRIT, -1 } },
1044  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 2, 0,
1045    { SENSORS_PC87360_TEMP2, SENSORS_PC87360_TEMP2_MIN, SENSORS_PC87360_TEMP2_MAX,
1046      SENSORS_PC87360_TEMP2_CRIT, -1 } },
1047  { fmtTemps_PC87360_0, rrdF0, DataType_temperature, 3 << 4, 0,
1048    { SENSORS_PC87360_TEMP3, SENSORS_PC87360_TEMP3_MIN, SENSORS_PC87360_TEMP3_MAX,
1049      SENSORS_PC87360_TEMP3_CRIT, -1 } },
1050  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1051    { SENSORS_PC87360_TEMP4, SENSORS_PC87360_TEMP4_MIN, SENSORS_PC87360_TEMP4_MAX,
1052      SENSORS_PC87360_TEMP4_CRIT, -1 } },
1053  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1054    { SENSORS_PC87360_TEMP5, SENSORS_PC87360_TEMP5_MIN, SENSORS_PC87360_TEMP5_MAX,
1055      SENSORS_PC87360_TEMP5_CRIT, -1 } },
1056  { fmtTemps_PC87360_1, rrdF1, DataType_temperature, 0, 0,
1057    { SENSORS_PC87360_TEMP6, SENSORS_PC87360_TEMP6_MIN, SENSORS_PC87360_TEMP6_MAX,
1058      SENSORS_PC87360_TEMP6_CRIT, -1 } },
1059
1060  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1061    { SENSORS_PC87360_IN0, SENSORS_PC87360_IN0_MIN, SENSORS_PC87360_IN0_MAX, -1 } },
1062  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1063    { SENSORS_PC87360_IN1, SENSORS_PC87360_IN1_MIN, SENSORS_PC87360_IN1_MAX, -1 } },
1064  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1065    { SENSORS_PC87360_IN2, SENSORS_PC87360_IN2_MIN, SENSORS_PC87360_IN2_MAX, -1 } },
1066  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1067    { SENSORS_PC87360_IN3, SENSORS_PC87360_IN3_MIN, SENSORS_PC87360_IN3_MAX, -1 } },
1068  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1069    { SENSORS_PC87360_IN4, SENSORS_PC87360_IN4_MIN, SENSORS_PC87360_IN4_MAX, -1 } },
1070  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1071    { SENSORS_PC87360_IN5, SENSORS_PC87360_IN5_MIN, SENSORS_PC87360_IN5_MAX, -1 } },
1072  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1073    { SENSORS_PC87360_IN6, SENSORS_PC87360_IN6_MIN, SENSORS_PC87360_IN6_MAX, -1 } },
1074  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1075    { SENSORS_PC87360_IN7, SENSORS_PC87360_IN7_MIN, SENSORS_PC87360_IN7_MAX, -1 } },
1076  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1077    { SENSORS_PC87360_IN8, SENSORS_PC87360_IN8_MIN, SENSORS_PC87360_IN8_MAX, -1 } },
1078  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1079    { SENSORS_PC87360_IN9, SENSORS_PC87360_IN9_MIN, SENSORS_PC87360_IN9_MAX, -1 } },
1080  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
1081    { SENSORS_PC87360_IN10, SENSORS_PC87360_IN10_MIN, SENSORS_PC87360_IN10_MAX, -1 } },
1082
1083  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1084    { SENSORS_PC87360_VID, -1 } },
1085  { NULL }
1086};
1087
1088static const ChipDescriptor pc87360_chip = {
1089  /* No room for SENSORS_PC87360_ALARMS_IN */
1090  pc87360_names, pc87360_features, SENSORS_PC87360_ALARMS_TEMP, 0
1091};
1092
1093/** PC87427 **/
1094
1095static const char *pc87427_names[] = {
1096  SENSORS_PC87427_PREFIX,
1097  NULL
1098};
1099
1100static const FeatureDescriptor pc87427_features[] = {
1101  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1102    { SENSORS_PC87427_FAN(1), SENSORS_PC87427_FAN_MIN(1), -1, -1 } },
1103  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1104    { SENSORS_PC87427_FAN(2), SENSORS_PC87427_FAN_MIN(2), -1, -1 } },
1105  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1106    { SENSORS_PC87427_FAN(3), SENSORS_PC87427_FAN_MIN(3), -1, -1 } },
1107  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1108    { SENSORS_PC87427_FAN(4), SENSORS_PC87427_FAN_MIN(4), -1, -1 } },
1109  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1110    { SENSORS_PC87427_FAN(5), SENSORS_PC87427_FAN_MIN(5), -1, -1 } },
1111  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1112    { SENSORS_PC87427_FAN(6), SENSORS_PC87427_FAN_MIN(6), -1, -1 } },
1113  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1114    { SENSORS_PC87427_FAN(7), SENSORS_PC87427_FAN_MIN(7), -1, -1 } },
1115  { fmtFans_nodiv_0, rrdF0, DataType_rpm, 0, 0,
1116    { SENSORS_PC87427_FAN(8), SENSORS_PC87427_FAN_MIN(8), -1, -1 } },
1117  { NULL }
1118};
1119
1120static const ChipDescriptor pc87427_chip = {
1121  pc87427_names, pc87427_features, 0, 0
1122};
1123
1124/** W83627EHF & W83627DHG **/
1125
1126static const char *w83627ehf_names[] = {
1127  SENSORS_W83627EHF_PREFIX, SENSORS_W83627DHG_PREFIX, NULL
1128};
1129
1130static const FeatureDescriptor w83627ehf_features[] = {
1131  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1132    { SENSORS_W83627EHF_FAN1, SENSORS_W83627EHF_FAN1_MIN, SENSORS_W83627EHF_FAN1_DIV, -1 } },
1133  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1134    { SENSORS_W83627EHF_FAN2, SENSORS_W83627EHF_FAN2_MIN, SENSORS_W83627EHF_FAN2_DIV, -1 } },
1135  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1136    { SENSORS_W83627EHF_FAN3, SENSORS_W83627EHF_FAN3_MIN, SENSORS_W83627EHF_FAN3_DIV, -1 } },
1137  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1138    { SENSORS_W83627EHF_FAN4, SENSORS_W83627EHF_FAN4_MIN, SENSORS_W83627EHF_FAN4_DIV, -1 } },
1139  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1140    { SENSORS_W83627EHF_FAN5, SENSORS_W83627EHF_FAN5_MIN, SENSORS_W83627EHF_FAN5_DIV, -1 } },
1141  { fmtTemps_0, rrdF0, DataType_temperature, 0, 0,
1142    { SENSORS_W83627EHF_TEMP1, SENSORS_W83627EHF_TEMP1_OVER, SENSORS_W83627EHF_TEMP1_HYST, -1 } },
1143  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1144    { SENSORS_W83627EHF_TEMP2, SENSORS_W83627EHF_TEMP2_OVER, SENSORS_W83627EHF_TEMP2_HYST, -1 } },
1145  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
1146    { SENSORS_W83627EHF_TEMP3, SENSORS_W83627EHF_TEMP3_OVER, SENSORS_W83627EHF_TEMP3_HYST, -1 } },
1147  { NULL }
1148};
1149
1150static const ChipDescriptor w83627ehf_chip = {
1151  w83627ehf_names, w83627ehf_features, 0, 0
1152};
1153
1154/** F71805F **/
1155
1156static const char *f71805f_names[] = {
1157  SENSORS_F71805F_PREFIX, NULL
1158};
1159
1160static const FeatureDescriptor f71805f_features[] = {
1161  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1162    { SENSORS_F71805F_IN(0), SENSORS_F71805F_IN_MIN(0), SENSORS_F71805F_IN_MAX(0), -1 } },
1163  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1164    { SENSORS_F71805F_IN(1), SENSORS_F71805F_IN_MIN(1), SENSORS_F71805F_IN_MAX(1), -1 } },
1165  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1166    { SENSORS_F71805F_IN(2), SENSORS_F71805F_IN_MIN(2), SENSORS_F71805F_IN_MAX(2), -1 } },
1167  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1168    { SENSORS_F71805F_IN(3), SENSORS_F71805F_IN_MIN(3), SENSORS_F71805F_IN_MAX(3), -1 } },
1169  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1170    { SENSORS_F71805F_IN(4), SENSORS_F71805F_IN_MIN(4), SENSORS_F71805F_IN_MAX(4), -1 } },
1171  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1172    { SENSORS_F71805F_IN(5), SENSORS_F71805F_IN_MIN(5), SENSORS_F71805F_IN_MAX(5), -1 } },
1173  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1174    { SENSORS_F71805F_IN(6), SENSORS_F71805F_IN_MIN(6), SENSORS_F71805F_IN_MAX(6), -1 } },
1175  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1176    { SENSORS_F71805F_IN(7), SENSORS_F71805F_IN_MIN(7), SENSORS_F71805F_IN_MAX(7), -1 } },
1177  { fmtVolts_2, rrdF3, DataType_voltage, 0, 0,
1178    { SENSORS_F71805F_IN(8), SENSORS_F71805F_IN_MIN(8), SENSORS_F71805F_IN_MAX(8), -1 } },
1179  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1180    { SENSORS_F71805F_FAN(1), SENSORS_F71805F_FAN_MIN(1), -1, -1 } },
1181  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1182    { SENSORS_F71805F_FAN(2), SENSORS_F71805F_FAN_MIN(2), -1, -1 } },
1183  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
1184    { SENSORS_F71805F_FAN(3), SENSORS_F71805F_FAN_MIN(3), -1, -1 } },
1185  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 0, 0,
1186    { SENSORS_F71805F_TEMP(1), SENSORS_F71805F_TEMP_MAX(1), SENSORS_F71805F_TEMP_HYST(1), -1 } },
1187  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 1, 0,
1188    { SENSORS_F71805F_TEMP(2), SENSORS_F71805F_TEMP_MAX(2), SENSORS_F71805F_TEMP_HYST(2), -1 } },
1189  { fmtTemps_0, rrdF0, DataType_temperature, 1 << 2, 0,
1190    { SENSORS_F71805F_TEMP(3), SENSORS_F71805F_TEMP_MAX(3), SENSORS_F71805F_TEMP_HYST(3), -1 } },
1191  { NULL }
1192};
1193
1194static const ChipDescriptor f71805f_chip = {
1195  /* No room for SENSORS_F71805F_ALARMS_IN nor SENSORS_F71805F_ALARMS_FAN */
1196  f71805f_names, f71805f_features, SENSORS_F71805F_ALARMS_TEMP, 0
1197};
1198
1199/** VT1211 **/
1200
1201static const char *vt1211_names[] = {
1202  SENSORS_VT1211_PREFIX, NULL
1203};
1204
1205static const FeatureDescriptor vt1211_features[] = {
1206  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN0, 0,
1207    { SENSORS_VT1211_IN0, SENSORS_VT1211_IN0_MIN, SENSORS_VT1211_IN0_MAX, -1 } },
1208  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN1, 0,
1209    { SENSORS_VT1211_IN1, SENSORS_VT1211_IN1_MIN, SENSORS_VT1211_IN1_MAX, -1 } },
1210  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN2, 0,
1211    { SENSORS_VT1211_IN2, SENSORS_VT1211_IN2_MIN, SENSORS_VT1211_IN2_MAX, -1 } },
1212  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN3, 0,
1213    { SENSORS_VT1211_IN3, SENSORS_VT1211_IN3_MIN, SENSORS_VT1211_IN3_MAX, -1 } },
1214  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN4, 0,
1215    { SENSORS_VT1211_IN4, SENSORS_VT1211_IN4_MIN, SENSORS_VT1211_IN4_MAX, -1 } },
1216  { fmtVolts_2, rrdF2, DataType_voltage, VT1211_ALARM_IN5, 0,
1217    { SENSORS_VT1211_IN5, SENSORS_VT1211_IN5_MIN, SENSORS_VT1211_IN5_MAX, -1 } },
1218  { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN1, 0,
1219    { SENSORS_VT1211_FAN1, SENSORS_VT1211_FAN1_MIN, SENSORS_VT1211_FAN1_DIV, -1 } },
1220  { fmtFans_0, rrdF0, DataType_rpm, VT1211_ALARM_FAN2, 0,
1221    { SENSORS_VT1211_FAN2, SENSORS_VT1211_FAN2_MIN, SENSORS_VT1211_FAN2_DIV, -1 } },
1222  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP1, 0,
1223    { SENSORS_VT1211_TEMP1, SENSORS_VT1211_TEMP1_OVER, SENSORS_VT1211_TEMP1_HYST, -1 } },
1224  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP2, 0,
1225    { SENSORS_VT1211_TEMP2, SENSORS_VT1211_TEMP2_OVER, SENSORS_VT1211_TEMP2_HYST, -1 } },
1226  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP3, 0,
1227    { SENSORS_VT1211_TEMP3, SENSORS_VT1211_TEMP3_OVER, SENSORS_VT1211_TEMP3_HYST, -1 } },
1228  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP4, 0,
1229    { SENSORS_VT1211_TEMP4, SENSORS_VT1211_TEMP4_OVER, SENSORS_VT1211_TEMP4_HYST, -1 } },
1230  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP5, 0,
1231    { SENSORS_VT1211_TEMP5, SENSORS_VT1211_TEMP5_OVER, SENSORS_VT1211_TEMP5_HYST, -1 } },
1232  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP6, 0,
1233    { SENSORS_VT1211_TEMP6, SENSORS_VT1211_TEMP6_OVER, SENSORS_VT1211_TEMP6_HYST, -1 } },
1234  { fmtTemps_1_0, rrdF1, DataType_temperature, VT1211_ALARM_TEMP7, 0,
1235    { SENSORS_VT1211_TEMP7, SENSORS_VT1211_TEMP7_OVER, SENSORS_VT1211_TEMP7_HYST, -1 } },
1236  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
1237    { SENSORS_VT1211_VID, -1 } },
1238  { NULL }
1239};
1240
1241static const ChipDescriptor vt1211_chip = {
1242  vt1211_names, vt1211_features, SENSORS_VT1211_ALARMS, 0
1243};
1244
1245
1246/** ALL **/
1247
1248const ChipDescriptor * const knownChips[] = {
1249  &adm1021_chip,
1250  &adm1025_chip,
1251  &adm9240_chip,
1252  &ds1621_chip,
1253  &gl518_chip,
1254  &lm75_chip,
1255  &lm78_chip,
1256  &lm80_chip,
1257  &max1617_chip,
1258  &maxilife_chip,
1259  &sis5595_chip,
1260  &via686a_chip,
1261  &as99127f_chip,
1262  &w83781d_chip,
1263  &w83782d_chip,
1264  &w83783s_chip,
1265  &w83697hf_chip,
1266  &it87_chip,
1267  &asb100_chip,
1268  &pc87360_chip,
1269  &pc87427_chip,
1270  &w83627ehf_chip,
1271  &f71805f_chip,
1272  &vt1211_chip,
1273  NULL
1274};
Note: See TracBrowser for help on using the browser.