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

Revision 5068, 64.8 KB (checked in by khali, 7 years ago)

sensord: Add lm85 support.
The extra voltage inputs aren't supported yet, we can add them later if
anybody cares.

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