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

Revision 3022, 45.4 KB (checked in by mds, 8 years ago)

add 637HF support. Ticket #1993.

  • 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/* NB:
32 *
33 * The following chips from prog/sensors are not (yet) supported:
34 *
35 * lm87 mtp008 fscpos fscscy pcf8591 vt1211 smsc47m1 lm92 adm1024 lm83
36 */
37
38/* NB: missing from sensors (and this) but in lib/chips.h:
39 * "gl520sm", "thmc50", "adm1022" */
40
41/* TODO: Temp in C/F */
42
43/** formatters **/
44
45static char buff[4096];
46
47static const char *
48fmtExtra
49(int alarm, int beep) {
50  if (alarm)
51    sprintf (buff + strlen (buff), " [ALARM]");
52  if (beep)
53    sprintf (buff + strlen (buff), " (beep)");
54  return buff;
55}
56
57static const char *
58fmtValu_0
59(const double values[], int alarm, int beep) {
60  sprintf (buff, "%.0f", values[0]);
61  return fmtExtra (alarm, beep);
62}
63
64static const char *
65fmtTemps_0
66(const double values[], int alarm, int beep) {
67  sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
68  return fmtExtra (alarm, beep);
69}
70
71static const char *
72fmtTemps_1_0
73(const double values[], int alarm, int beep) {
74  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C)", values[0], values[1], values[2]);
75  return fmtExtra (alarm, beep);
76}
77
78static const char *
79fmtTemps_1
80(const double values[], int alarm, int beep) {
81  sprintf (buff, "%.1f C (limit = %.1f C, hysteresis = %.1f C)", values[0], values[1], values[2]);
82  return fmtExtra (alarm, beep);
83}
84
85static const char *
86fmtTemps_minmax_0
87(const double values[], int alarm, int beep) {
88 sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
89 return fmtExtra (alarm, beep);
90}
91
92static const char *
93fmtVolt_2
94(const double values[], int alarm, int beep) {
95  sprintf (buff, "%+.2f V", values[0]);
96  return fmtExtra (alarm, beep);
97}
98
99static const char *
100fmtVolt_3
101(const double values[], int alarm, int beep) {
102  sprintf (buff, "%+.3f V", values[0]);
103  return fmtExtra (alarm, beep);
104}
105
106static const char *
107fmtVolts_2
108(const double values[], int alarm, int beep) {
109  sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
110  return fmtExtra (alarm, beep);
111}
112
113static const char *
114fmtFans_0
115(const double values[], int alarm, int beep) {
116  sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0], values[1], values[2]);
117  return fmtExtra (alarm, beep);
118}
119
120static const char *
121fmtMHz_2
122(const double values[], int alarm, int beep) {
123  sprintf (buff, "%.2f MHz (min = %.2f MHz, max = %.2f MHz)", values[0], values[1], values[2]);
124  return fmtExtra (alarm, beep);
125}
126
127static const char *
128fmtChassisIntrusionDetection
129(const double values[], int alarm, int beep) {
130  sprintf (buff, "Chassis intrusion detection");
131  return fmtExtra (alarm, beep);
132}
133
134static const char *
135fmtBoardTemperatureInput
136(const double values[], int alarm, int beep) {
137  sprintf (buff, "Board temperature input"); /* N.B: "(usually LM75 chips)" */
138  return fmtExtra (alarm, beep);
139}
140
141static const char *
142fmtSoundAlarm
143(const double values[], int alarm, int beep) {
144  sprintf (buff, "Sound alarm %s", (values[0] < 0.5) ? "disabled" : "enabled");
145  return fmtExtra (alarm, beep);
146}
147
148static const char *
149rrdF0
150(const double values[]) {
151  sprintf (buff, "%.0f", values[0]);
152  return buff;
153}
154
155static const char *
156rrdF1
157(const double values[]) {
158  sprintf (buff, "%.1f", values[0]);
159  return buff;
160}
161
162static const char *
163rrdF2
164(const double values[]) {
165  sprintf (buff, "%.2f", values[0]);
166  return buff;
167}
168
169static const char *
170rrdF3
171(const double values[]) {
172  sprintf (buff, "%.3f", values[0]);
173  return buff;
174}
175
176/** DS1621 */
177
178static const char *
179fmtTemps_DS1621
180(const double values[], int alarm, int beep) {
181  sprintf (buff, "%.2f C (min = %.1f C, max = %.1f C)", values[0], values[1], values[2]);
182  if (alarm)
183    sprintf (buff + strlen (buff), " [ALARM(%s)]", (alarm == DS1621_ALARM_TEMP_LOW) ? "LOW" : (alarm == DS1621_ALARM_TEMP_HIGH) ? "HIGH" : "LOW,HIGH");
184  return buff;
185}
186
187static const char *ds1621_names[] = {
188  SENSORS_DS1621_PREFIX, NULL
189};
190
191static const FeatureDescriptor ds1621_features[] = {
192  { fmtTemps_DS1621, rrdF2, DataType_temperature, DS1621_ALARM_TEMP_LOW | DS1621_ALARM_TEMP_HIGH, 0,
193    { SENSORS_DS1621_TEMP, SENSORS_DS1621_TEMP_HYST, SENSORS_DS1621_TEMP_OVER, -1 } }, /* hyst=min, over=max */
194  { NULL }
195};
196
197static const ChipDescriptor ds1621_chip = {
198  ds1621_names, ds1621_features, SENSORS_DS1621_ALARMS, 0
199};
200
201/** LM75 **/
202
203static const char *lm75_names[] = {
204  SENSORS_LM75_PREFIX, NULL
205};
206
207static const FeatureDescriptor lm75_features[] = {
208  { fmtTemps_1, rrdF1, DataType_temperature, 0, 0,
209    { SENSORS_LM75_TEMP, SENSORS_LM75_TEMP_OVER, SENSORS_LM75_TEMP_HYST, -1 } },
210  { NULL }
211};
212
213static const ChipDescriptor lm75_chip = {
214  lm75_names, lm75_features, 0, 0
215};
216
217/** ADM1021 **/
218
219static const char *
220fmtTemps_ADM1021_0
221(const double values[], int alarm, int beep) {
222  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
223  if (alarm) {
224    int low = alarm & ADM1021_ALARM_TEMP_LOW, high = alarm & ADM1021_ALARM_TEMP_HIGH;
225    sprintf (buff + strlen (buff), " [ALARM(%s%s%s)]", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
226  }
227  return buff;
228}
229
230static const char *
231fmtTemps_ADM1021_1
232(const double values[], int alarm, int beep) {
233  sprintf (buff, "%.0f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
234  if (alarm) {
235    int na = alarm & ADM1021_ALARM_RTEMP_NA, low = alarm & ADM1021_ALARM_RTEMP_LOW,
236      high = alarm & ADM1021_ALARM_RTEMP_HIGH;
237    sprintf (buff + strlen (buff), " [ALARM(%s%s%s%s%s)]", na ? "N/A" : "", (na && (low || high)) ? "," : "", low ? "LOW" : "", (low && high) ? "," : "", high ? "HIGH" : "");
238  }
239  return buff;
240}
241
242static const char *adm1021_names[] = {
243  SENSORS_ADM1021_PREFIX, SENSORS_ADM1023_PREFIX, NULL
244}; /* N.B: Assume bs sensors 1023 is =~ 1021 */
245
246static const FeatureDescriptor adm1021_features[] = {
247  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
248    { SENSORS_ADM1021_TEMP, SENSORS_ADM1021_TEMP_HYST, SENSORS_ADM1021_TEMP_OVER, -1 } }, /* hyst=min, over=max */
249  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
250    { SENSORS_ADM1021_REMOTE_TEMP, SENSORS_ADM1021_REMOTE_TEMP_HYST, SENSORS_ADM1021_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
251  { fmtValu_0, NULL, DataType_other, 0, 0,
252    { SENSORS_ADM1021_DIE_CODE, -1 } },
253  { NULL }
254};
255
256static const ChipDescriptor adm1021_chip = {
257  adm1021_names, adm1021_features, SENSORS_ADM1021_ALARMS, 0
258};
259
260/** MAX1617 **/
261
262static const char *max1617_names[] = {
263  SENSORS_MAX1617_PREFIX, SENSORS_MAX1617A_PREFIX, SENSORS_THMC10_PREFIX, SENSORS_LM84_PREFIX, SENSORS_GL523_PREFIX, NULL
264}; /* N.B: Assume vs sensors these have no die code */
265
266static const FeatureDescriptor max1617_features[] = {
267  { fmtTemps_ADM1021_0, rrdF0, DataType_temperature, ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW, 0,
268    { SENSORS_MAX1617_TEMP, SENSORS_MAX1617_TEMP_HYST, SENSORS_MAX1617_TEMP_OVER, -1 } }, /* hyst=min, over=max */
269  { fmtTemps_ADM1021_1, rrdF0, DataType_temperature, ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | ADM1021_ALARM_RTEMP_NA, 0,
270    { SENSORS_MAX1617_REMOTE_TEMP, SENSORS_MAX1617_REMOTE_TEMP_HYST, SENSORS_MAX1617_REMOTE_TEMP_OVER, -1 } }, /* hyst=min, over=max */
271  { NULL }
272};
273
274static const ChipDescriptor max1617_chip = {
275  max1617_names, max1617_features, SENSORS_MAX1617_ALARMS, 0
276};
277
278/** ADM9240 **/
279
280static const char *adm9240_names[] = {
281  SENSORS_ADM9240_PREFIX, SENSORS_DS1780_PREFIX, SENSORS_LM81_PREFIX, NULL
282};
283
284static const FeatureDescriptor adm9240_features[] = {
285  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN0, 0,
286    { SENSORS_ADM9240_IN0, SENSORS_ADM9240_IN0_MIN, SENSORS_ADM9240_IN0_MAX, -1 } },
287  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN1, 0,
288    { SENSORS_ADM9240_IN1, SENSORS_ADM9240_IN1_MIN, SENSORS_ADM9240_IN1_MAX, -1 } },
289  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN2, 0,
290    { SENSORS_ADM9240_IN2, SENSORS_ADM9240_IN2_MIN, SENSORS_ADM9240_IN2_MAX, -1 } },
291  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN3, 0,
292    { SENSORS_ADM9240_IN3, SENSORS_ADM9240_IN3_MIN, SENSORS_ADM9240_IN3_MAX, -1 } },
293  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN4, 0,
294    { SENSORS_ADM9240_IN4, SENSORS_ADM9240_IN4_MIN, SENSORS_ADM9240_IN4_MAX, -1 } },
295  { fmtVolts_2, rrdF2, DataType_voltage, ADM9240_ALARM_IN5, 0,
296    { SENSORS_ADM9240_IN5, SENSORS_ADM9240_IN5_MIN, SENSORS_ADM9240_IN5_MAX, -1 } },
297  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN1, 0,
298    { SENSORS_ADM9240_FAN1, SENSORS_ADM9240_FAN1_MIN, SENSORS_ADM9240_FAN1_DIV, -1 } },
299  { fmtFans_0, rrdF0, DataType_rpm, ADM9240_ALARM_FAN2, 0,
300    { SENSORS_ADM9240_FAN2, SENSORS_ADM9240_FAN2_MIN, SENSORS_ADM9240_FAN2_DIV, -1 } },
301  { fmtTemps_1_0, rrdF1, DataType_temperature, ADM9240_ALARM_TEMP, 0,
302    { SENSORS_ADM9240_TEMP, SENSORS_ADM9240_TEMP_OVER, SENSORS_ADM9240_TEMP_HYST, -1 } },
303  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
304    { SENSORS_ADM9240_VID, -1 } },
305  { fmtChassisIntrusionDetection, NULL, DataType_other, ADM9240_ALARM_CHAS, 0,
306    { SENSORS_ADM9240_ALARMS, -1 } },
307  { NULL }
308};
309
310static const ChipDescriptor adm9240_chip = {
311  adm9240_names, adm9240_features, SENSORS_ADM9240_ALARMS, 0
312};
313
314/** SIS5595 **/
315
316static const char *sis5595_names[] = {
317  SENSORS_SIS5595_PREFIX, NULL
318};
319
320static const FeatureDescriptor sis5595_features[] = {
321  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN0, 0,
322    { SENSORS_SIS5595_IN0, SENSORS_SIS5595_IN0_MIN, SENSORS_SIS5595_IN0_MAX, -1 } },
323  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN1, 0,
324    { SENSORS_SIS5595_IN1, SENSORS_SIS5595_IN1_MIN, SENSORS_SIS5595_IN1_MAX, -1 } },
325  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN2, 0,
326    { SENSORS_SIS5595_IN2, SENSORS_SIS5595_IN2_MIN, SENSORS_SIS5595_IN2_MAX, -1 } },
327  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN3, 0,
328    { SENSORS_SIS5595_IN3, SENSORS_SIS5595_IN3_MIN, SENSORS_SIS5595_IN3_MAX, -1 } },
329  { fmtVolts_2, rrdF2, DataType_voltage, SIS5595_ALARM_IN4, 0,
330    { SENSORS_SIS5595_IN4, SENSORS_SIS5595_IN4_MIN, SENSORS_SIS5595_IN4_MAX, -1 } },
331  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN1, 0,
332    { SENSORS_SIS5595_FAN1, SENSORS_SIS5595_FAN1_MIN, SENSORS_SIS5595_FAN1_DIV, -1 } },
333  { fmtFans_0, rrdF0, DataType_rpm, SIS5595_ALARM_FAN2, 0,
334    { SENSORS_SIS5595_FAN2, SENSORS_SIS5595_FAN2_MIN, SENSORS_SIS5595_FAN2_DIV, -1 } },
335  { fmtTemps_0, rrdF0, DataType_temperature, SIS5595_ALARM_TEMP, 0,
336    { SENSORS_SIS5595_TEMP, SENSORS_SIS5595_TEMP_OVER, SENSORS_SIS5595_TEMP_HYST, -1 } },
337  { fmtBoardTemperatureInput, NULL, DataType_other, SIS5595_ALARM_BTI, 0,
338    { SENSORS_SIS5595_ALARMS, -1 } },
339  { NULL }
340};
341
342static const ChipDescriptor sis5595_chip = {
343  sis5595_names, sis5595_features, SENSORS_SIS5595_ALARMS, 0
344};
345
346/** VIA686A **/
347
348static const char *via686a_names[] = {
349  SENSORS_VIA686A_PREFIX, NULL
350};
351
352static const FeatureDescriptor via686a_features[] = {
353  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN0, 0,
354    { SENSORS_VIA686A_IN0, SENSORS_VIA686A_IN0_MIN, SENSORS_VIA686A_IN0_MAX, -1 } },
355  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN1, 0,
356    { SENSORS_VIA686A_IN1, SENSORS_VIA686A_IN1_MIN, SENSORS_VIA686A_IN1_MAX, -1 } },
357  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN2, 0,
358    { SENSORS_VIA686A_IN2, SENSORS_VIA686A_IN2_MIN, SENSORS_VIA686A_IN2_MAX, -1 } },
359  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN3, 0,
360    { SENSORS_VIA686A_IN3, SENSORS_VIA686A_IN3_MIN, SENSORS_VIA686A_IN3_MAX, -1 } },
361  { fmtVolts_2, rrdF2, DataType_voltage, VIA686A_ALARM_IN4, 0,
362    { SENSORS_VIA686A_IN4, SENSORS_VIA686A_IN4_MIN, SENSORS_VIA686A_IN4_MAX, -1 } },
363  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN1, 0,
364    { SENSORS_VIA686A_FAN1, SENSORS_VIA686A_FAN1_MIN, SENSORS_VIA686A_FAN1_DIV, -1 } },
365  { fmtFans_0, rrdF0, DataType_rpm, VIA686A_ALARM_FAN2, 0,
366    { SENSORS_VIA686A_FAN2, SENSORS_VIA686A_FAN2_MIN, SENSORS_VIA686A_FAN2_DIV, -1 } },
367  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP, 0,
368    { SENSORS_VIA686A_TEMP, SENSORS_VIA686A_TEMP_OVER, SENSORS_VIA686A_TEMP_HYST, -1 } },
369  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP2, 0,
370    { SENSORS_VIA686A_TEMP2, SENSORS_VIA686A_TEMP2_OVER, SENSORS_VIA686A_TEMP2_HYST, -1 } },
371  { fmtTemps_1_0, rrdF1, DataType_temperature, VIA686A_ALARM_TEMP3, 0,
372    { SENSORS_VIA686A_TEMP3, SENSORS_VIA686A_TEMP3_OVER, SENSORS_VIA686A_TEMP3_HYST, -1 } },
373  { NULL }
374};
375
376static const ChipDescriptor via686a_chip = {
377  via686a_names, via686a_features, SENSORS_VIA686A_ALARMS, 0
378};
379
380/** LM78 **/
381
382static const char *lm78_names[] = {
383  SENSORS_LM78_PREFIX, SENSORS_LM78J_PREFIX, SENSORS_LM79_PREFIX, NULL
384};
385
386static const FeatureDescriptor lm78_features[] = {
387  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN0, 0,
388    { SENSORS_LM78_IN0, SENSORS_LM78_IN0_MIN, SENSORS_LM78_IN0_MAX, -1 } },
389  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN1, 0,
390    { SENSORS_LM78_IN1, SENSORS_LM78_IN1_MIN, SENSORS_LM78_IN1_MAX, -1 } },
391  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN2, 0,
392    { SENSORS_LM78_IN2, SENSORS_LM78_IN2_MIN, SENSORS_LM78_IN2_MAX, -1 } },
393  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN3, 0,
394    { SENSORS_LM78_IN3, SENSORS_LM78_IN3_MIN, SENSORS_LM78_IN3_MAX, -1 } },
395  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN4, 0,
396    { SENSORS_LM78_IN4, SENSORS_LM78_IN4_MIN, SENSORS_LM78_IN4_MAX, -1 } },
397  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN5, 0,
398    { SENSORS_LM78_IN5, SENSORS_LM78_IN5_MIN, SENSORS_LM78_IN5_MAX, -1 } },
399  { fmtVolts_2, rrdF2, DataType_voltage, LM78_ALARM_IN6, 0,
400    { SENSORS_LM78_IN6, SENSORS_LM78_IN6_MIN, SENSORS_LM78_IN6_MAX, -1 } },
401  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN1, 0,
402    { SENSORS_LM78_FAN1, SENSORS_LM78_FAN1_MIN, SENSORS_LM78_FAN1_DIV, -1 } },
403  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN2, 0,
404    { SENSORS_LM78_FAN2, SENSORS_LM78_FAN2_MIN, SENSORS_LM78_FAN2_DIV, -1 } },
405  { fmtFans_0, rrdF0, DataType_rpm, LM78_ALARM_FAN3, 0,
406    { SENSORS_LM78_FAN3, SENSORS_LM78_FAN3_MIN, SENSORS_LM78_FAN3_DIV, -1 } },
407  { fmtTemps_1_0, rrdF1, DataType_rpm, LM78_ALARM_TEMP, 0,
408    { SENSORS_LM78_TEMP, SENSORS_LM78_TEMP_OVER, SENSORS_LM78_TEMP_HYST, -1 } },
409  { fmtVolt_2, rrdF2, DataType_voltage, 0, 0,
410    { SENSORS_LM78_VID, -1 } },
411  { fmtBoardTemperatureInput, NULL, DataType_other, LM78_ALARM_BTI, 0,
412    { SENSORS_LM78_ALARMS, -1 } },
413  { fmtChassisIntrusionDetection, NULL, DataType_other, LM78_ALARM_CHAS, 0,
414    { SENSORS_LM78_ALARMS, -1 } },
415  { NULL }
416};
417
418static const ChipDescriptor lm78_chip = {
419  lm78_names, lm78_features, SENSORS_LM78_ALARMS, 0
420};
421
422/** GL518 **/
423
424/* N.B: sensors supports a "gl518sm-r00" but it is not picked up in main.c...
425static const char *
426fmtVolts_GL518_R00
427(const double values[], int alarm, int beep) {
428  if (values[0] == 0.0)
429    sprintf (buff, "n/a (min = %+.2f V, max = %+.2f V)", values[1], values[2]);
430  else
431    sprintf (buff, "%+.2f V (min = %+.2f V, max = %+.2f V)", values[0], values[1], values[2]);
432  return fmtExtra (alarm, beep);
433}
434*/
435
436static const char *gl518_names[] = {
437  SENSORS_GL518_PREFIX, NULL
438};
439
440static const FeatureDescriptor gl518_features[] = {
441  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VDD, GL518_ALARM_VDD,
442    { SENSORS_GL518_VDD, SENSORS_GL518_VDD_MIN, SENSORS_GL518_VDD_MAX, -1 } },
443  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN1, GL518_ALARM_VIN1,
444    { SENSORS_GL518_VIN1, SENSORS_GL518_VIN1_MIN, SENSORS_GL518_VIN1_MAX, -1 } },
445  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN2, GL518_ALARM_VIN2,
446    { SENSORS_GL518_VIN2, SENSORS_GL518_VIN2_MIN, SENSORS_GL518_VIN2_MAX, -1 } },
447  { fmtVolts_2, rrdF2, DataType_voltage, GL518_ALARM_VIN3, GL518_ALARM_VIN3,
448    { SENSORS_GL518_VIN3, SENSORS_GL518_VIN3_MIN, SENSORS_GL518_VIN3_MAX, -1 } },
449  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN1, GL518_ALARM_FAN1,
450    { SENSORS_GL518_FAN1, SENSORS_GL518_FAN1_MIN, SENSORS_GL518_FAN1_DIV, -1 } },
451  { fmtFans_0, rrdF0, DataType_rpm, GL518_ALARM_FAN2, GL518_ALARM_FAN2,
452    { SENSORS_GL518_FAN2, SENSORS_GL518_FAN2_MIN, SENSORS_GL518_FAN2_DIV, -1 } },
453  { fmtTemps_1_0, rrdF1, DataType_temperature, GL518_ALARM_TEMP, GL518_ALARM_TEMP,
454    { SENSORS_GL518_TEMP, SENSORS_GL518_TEMP_OVER, SENSORS_GL518_TEMP_HYST, -1 } },
455  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
456    { SENSORS_GL518_BEEP_ENABLE, -1 } },
457  { NULL }
458};
459
460static const ChipDescriptor gl518_chip = {
461  gl518_names, gl518_features, SENSORS_GL518_ALARMS, SENSORS_GL518_BEEPS
462};
463
464/** ADM1025 **/
465
466static const char *
467fmtTemps_ADM1025
468(const double values[], int alarm, int beep) {
469  sprintf (buff, "%.1f C (min = %.0f C, max = %.0f C)", values[0], values[1], values[2]);
470  return fmtExtra (alarm, beep);
471}
472
473static const char *adm1025_names[] = {
474  SENSORS_ADM1025_PREFIX, NULL
475};
476
477static const FeatureDescriptor adm1025_features[] = {
478  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN0, 0,
479    { SENSORS_ADM1025_IN0, SENSORS_ADM1025_IN0_MIN, SENSORS_ADM1025_IN0_MAX, -1 } },
480  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN1, 0,
481    { SENSORS_ADM1025_IN1, SENSORS_ADM1025_IN1_MIN, SENSORS_ADM1025_IN1_MAX, -1 } },
482  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN2, 0,
483    { SENSORS_ADM1025_IN2, SENSORS_ADM1025_IN2_MIN, SENSORS_ADM1025_IN2_MAX, -1 } },
484  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN3, 0,
485    { SENSORS_ADM1025_IN3, SENSORS_ADM1025_IN3_MIN, SENSORS_ADM1025_IN3_MAX, -1 } },
486  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN4, 0,
487    { SENSORS_ADM1025_IN4, SENSORS_ADM1025_IN4_MIN, SENSORS_ADM1025_IN4_MAX, -1 } },
488  { fmtVolts_2, rrdF2, DataType_voltage, ADM1025_ALARM_IN5, 0,
489    { SENSORS_ADM1025_IN5, SENSORS_ADM1025_IN5_MIN, SENSORS_ADM1025_IN5_MAX, -1 } },
490  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_TEMP, 0,
491    { SENSORS_ADM1025_TEMP1, SENSORS_ADM1025_TEMP1_LOW, SENSORS_ADM1025_TEMP1_HIGH, -1 } },
492  { fmtTemps_ADM1025, rrdF1, DataType_temperature, ADM1025_ALARM_RTEMP, 0,
493    { SENSORS_ADM1025_TEMP2, SENSORS_ADM1025_TEMP2_LOW, SENSORS_ADM1025_TEMP2_HIGH, -1 } },
494  { NULL }
495};
496
497static const ChipDescriptor adm1025_chip = {
498  adm1025_names, adm1025_features, SENSORS_ADM1025_ALARMS, 0
499};
500
501/** LM80 **/
502
503static const char *
504fmtTemps_LM80
505(const double values[], int alarm, int beep) {
506  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]);
507  return fmtExtra (alarm, beep);
508}
509
510static const char *lm80_names[] = {
511  SENSORS_LM80_PREFIX, NULL
512};
513
514static const FeatureDescriptor lm80_features[] = {
515  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN0, 0,
516    { SENSORS_LM80_IN0, SENSORS_LM80_IN0_MIN, SENSORS_LM80_IN0_MAX, -1 } },
517  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN1, 0,
518    { SENSORS_LM80_IN1, SENSORS_LM80_IN1_MIN, SENSORS_LM80_IN1_MAX, -1 } },
519  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN2, 0,
520    { SENSORS_LM80_IN2, SENSORS_LM80_IN2_MIN, SENSORS_LM80_IN2_MAX, -1 } },
521  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN3, 0,
522    { SENSORS_LM80_IN3, SENSORS_LM80_IN3_MIN, SENSORS_LM80_IN3_MAX, -1 } },
523  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN4, 0,
524    { SENSORS_LM80_IN4, SENSORS_LM80_IN4_MIN, SENSORS_LM80_IN4_MAX, -1 } },
525  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN5, 0,
526    { SENSORS_LM80_IN5, SENSORS_LM80_IN5_MIN, SENSORS_LM80_IN5_MAX, -1 } },
527  { fmtVolts_2, rrdF2, DataType_voltage, LM80_ALARM_IN6, 0,
528    { SENSORS_LM80_IN6, SENSORS_LM80_IN6_MIN, SENSORS_LM80_IN6_MAX, -1 } },
529  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN1, 0,
530    { SENSORS_LM80_FAN1, SENSORS_LM80_FAN1_MIN, SENSORS_LM80_FAN1_DIV, -1 } },
531  { fmtFans_0, rrdF0, DataType_rpm, LM80_ALARM_FAN2, 0,
532    { SENSORS_LM80_FAN2, SENSORS_LM80_FAN2_MIN, SENSORS_LM80_FAN2_DIV, -1 } },
533  { fmtTemps_LM80, rrdF2, DataType_temperature, LM80_ALARM_TEMP_HOT, 0,
534    { SENSORS_LM80_TEMP, SENSORS_LM80_TEMP_HOT_MAX, SENSORS_LM80_TEMP_HOT_HYST, SENSORS_LM80_TEMP_OS_MAX, SENSORS_LM80_TEMP_OS_HYST, -1 } },
535  { fmtBoardTemperatureInput, NULL, DataType_other, LM80_ALARM_BTI, 0,
536    { SENSORS_LM80_ALARMS, -1 } },
537  { fmtChassisIntrusionDetection, NULL, DataType_other, LM80_ALARM_CHAS, 0,
538    { SENSORS_LM80_ALARMS, -1 } },
539  { NULL }
540};
541
542static const ChipDescriptor lm80_chip = {
543  lm80_names, lm80_features, SENSORS_LM80_ALARMS, 0
544};
545
546/** IT87 (thanks to Mike Black) **/
547
548static const char *it87_names[] = {
549  SENSORS_IT87_PREFIX, SENSORS_IT8712_PREFIX, NULL
550};
551
552static const FeatureDescriptor it87_features[] = {
553  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN0, 0,
554    { SENSORS_IT87_IN0, SENSORS_IT87_IN0_MIN, SENSORS_IT87_IN0_MAX, -1 } },
555  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN1, 0,
556    { SENSORS_IT87_IN1, SENSORS_IT87_IN1_MIN, SENSORS_IT87_IN1_MAX, -1 } },
557  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN2, 0,
558    { SENSORS_IT87_IN2, SENSORS_IT87_IN2_MIN, SENSORS_IT87_IN2_MAX, -1 } },
559  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN3, 0,
560    { SENSORS_IT87_IN3, SENSORS_IT87_IN3_MIN, SENSORS_IT87_IN3_MAX, -1 } },
561  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN4, 0,
562    { SENSORS_IT87_IN4, SENSORS_IT87_IN4_MIN, SENSORS_IT87_IN4_MAX, -1 } },
563  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN5, 0,
564    { SENSORS_IT87_IN5, SENSORS_IT87_IN5_MIN, SENSORS_IT87_IN5_MAX, -1 } },
565  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN6, 0,
566    { SENSORS_IT87_IN6, SENSORS_IT87_IN6_MIN, SENSORS_IT87_IN6_MAX, -1 } },
567  { fmtVolts_2, rrdF2, DataType_voltage, IT87_ALARM_IN7, 0,
568    { SENSORS_IT87_IN7, SENSORS_IT87_IN7_MIN, SENSORS_IT87_IN7_MAX, -1 } },
569  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN1, 0,
570    { SENSORS_IT87_FAN1, SENSORS_IT87_FAN1_MIN, SENSORS_IT87_FAN1_DIV, -1 } },
571  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN2, 0,
572    { SENSORS_IT87_FAN2, SENSORS_IT87_FAN2_MIN, SENSORS_IT87_FAN2_DIV, -1 } },
573  { fmtFans_0, rrdF0, DataType_rpm, IT87_ALARM_FAN3, 0,
574    { SENSORS_IT87_FAN3, SENSORS_IT87_FAN3_MIN, SENSORS_IT87_FAN3_DIV, -1 } },
575  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP1, 0,
576    { SENSORS_IT87_TEMP1, SENSORS_IT87_TEMP1_LOW, SENSORS_IT87_TEMP1_HIGH, -1 } },
577  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP2, 0,
578    { SENSORS_IT87_TEMP2, SENSORS_IT87_TEMP2_LOW, SENSORS_IT87_TEMP2_HIGH, -1 } },
579  { fmtTemps_minmax_0, rrdF1, DataType_temperature, IT87_ALARM_TEMP3, 0,
580    { SENSORS_IT87_TEMP3, SENSORS_IT87_TEMP3_LOW, SENSORS_IT87_TEMP3_HIGH, -1 } },
581  { NULL }
582};
583
584static const ChipDescriptor it87_chip = {
585  it87_names, it87_features, SENSORS_IT87_ALARMS, 0
586};
587
588/** W83781D **/
589
590static const char *
591fmtTemps_W83781D
592(const double values[], int alarm, int beep) {
593  if (values[2] == 127) {
594    sprintf (buff, "%.0f C (limit = %.0f C)",
595             values[0], values[1]);
596  } else {
597    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C)",
598             values[0], values[1], values[2]);
599  }
600  return fmtExtra (alarm, beep);
601}
602
603static const char *w83781d_names[] = {
604  SENSORS_W83781D_PREFIX, NULL
605};
606
607static const FeatureDescriptor w83781d_features[] = {
608  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
609    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
610  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
611    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
612  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
613    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
614  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
615    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
616  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
617    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
618  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
619    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
620  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
621    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
622  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
623    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
624  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
625    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
626  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
627    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
628  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
629    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
630  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
631    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
632  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP23, W83781D_ALARM_TEMP23,
633    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
634  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
635    { SENSORS_W83781D_VID, -1 } },
636  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
637    { SENSORS_W83781D_ALARMS, -1 } },
638  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
639    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
640  { NULL }
641};
642
643static const ChipDescriptor w83781d_chip = {
644  w83781d_names, w83781d_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
645};
646
647/** AS99127F **/
648
649static const char *as99127f_names[] = {
650  SENSORS_AS99127F_PREFIX, NULL
651};
652
653static const FeatureDescriptor as99127f_features[] = {
654  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
655    { SENSORS_W83781D_IN0, SENSORS_W83781D_IN0_MIN, SENSORS_W83781D_IN0_MAX, -1 } },
656  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
657    { SENSORS_W83781D_IN1, SENSORS_W83781D_IN1_MIN, SENSORS_W83781D_IN1_MAX, -1 } },
658  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
659    { SENSORS_W83781D_IN2, SENSORS_W83781D_IN2_MIN, SENSORS_W83781D_IN2_MAX, -1 } },
660  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
661    { SENSORS_W83781D_IN3, SENSORS_W83781D_IN3_MIN, SENSORS_W83781D_IN3_MAX, -1 } },
662  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
663    { SENSORS_W83781D_IN4, SENSORS_W83781D_IN4_MIN, SENSORS_W83781D_IN4_MAX, -1 } },
664  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
665    { SENSORS_W83781D_IN5, SENSORS_W83781D_IN5_MIN, SENSORS_W83781D_IN5_MAX, -1 } },
666  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
667    { SENSORS_W83781D_IN6, SENSORS_W83781D_IN6_MIN, SENSORS_W83781D_IN6_MAX, -1 } },
668  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
669    { SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1_MIN, SENSORS_W83781D_FAN1_DIV, -1 } },
670  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
671    { SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2_MIN, SENSORS_W83781D_FAN2_DIV, -1 } },
672  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
673    { SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3_MIN, SENSORS_W83781D_FAN3_DIV, -1 } },
674  { fmtTemps_W83781D, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
675    { SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1_OVER, SENSORS_W83781D_TEMP1_HYST, -1 } },
676  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
677    { SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2_OVER, SENSORS_W83781D_TEMP2_HYST, -1 } },
678  { fmtTemps_1_0, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
679    { SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3_OVER, SENSORS_W83781D_TEMP3_HYST, -1 } },
680  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
681    { SENSORS_W83781D_VID, -1 } },
682  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
683    { SENSORS_W83781D_ALARMS, -1 } },
684  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
685    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
686  { NULL }
687};
688
689static const ChipDescriptor as99127f_chip = {
690  as99127f_names, as99127f_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
691};
692
693/** W83782D **/
694
695static const char *
696fmtTemps_W8378x_0
697(const double values[], int alarm, int beep) {
698  int sensorID = (int) values[3];
699  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
700    (sensorID == 2) ? "3904 transistor" : "thermistor";
701  if (values[2] == 127) {
702    sprintf (buff, "%.0f C (limit = %.0f C, sensors = %s)",
703             values[0], values[1], sensor);
704  } else {
705    sprintf (buff, "%.0f C (limit = %.0f C, hysteresis = %.0f C, sensors = %s)",
706             values[0], values[1], values[2], sensor);
707  }
708  return fmtExtra (alarm, beep);
709}
710
711static const char *
712fmtTemps_W8378x_1
713(const double values[], int alarm, int beep) {
714  int sensorID = (int) values[3];
715  const char *sensor = (sensorID == 1) ? "PII/Celeron diode" :
716    (sensorID == 2) ? "3904 transistor" : "thermistor";
717  sprintf (buff, "%.1f C (limit = %.0f C, hysteresis = %.0f C, sensor = %s)",
718           values[0], values[1], values[2], sensor);
719  return fmtExtra (alarm, beep);
720}
721
722static const char *w83782d_names[] = {
723  SENSORS_W83782D_PREFIX, SENSORS_W83627HF_PREFIX, SENSORS_W83627THF_PREFIX, SENSORS_W83637HF_PREFIX, NULL
724};
725
726static const FeatureDescriptor w83782d_features[] = {
727  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
728    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
729  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN1, W83781D_ALARM_IN1,
730    { SENSORS_W83782D_IN1, SENSORS_W83782D_IN1_MIN, SENSORS_W83782D_IN1_MAX, -1 } },
731  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
732    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
733  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
734    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
735  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
736    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
737  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
738    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
739  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
740    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
741  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN7, W83782D_ALARM_IN7,
742    { SENSORS_W83782D_IN7, SENSORS_W83782D_IN7_MIN, SENSORS_W83782D_IN7_MAX, -1 } },
743  { fmtVolts_2, rrdF2, DataType_voltage, W83782D_ALARM_IN8, W83782D_ALARM_IN8,
744    { SENSORS_W83782D_IN8, SENSORS_W83782D_IN8_MIN, SENSORS_W83782D_IN8_MAX, -1 } },
745  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
746    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
747  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
748    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
749  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
750    { SENSORS_W83782D_FAN3, SENSORS_W83782D_FAN3_MIN, SENSORS_W83782D_FAN3_DIV, -1 } },
751  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
752    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
753  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
754    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
755  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP3, W83781D_ALARM_TEMP3,
756    { SENSORS_W83782D_TEMP3, SENSORS_W83782D_TEMP3_OVER, SENSORS_W83782D_TEMP3_HYST, SENSORS_W83782D_SENS3, -1 } },
757  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
758    { SENSORS_W83782D_VID, -1 } },
759  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
760    { SENSORS_W83781D_ALARMS, -1 } },
761  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
762    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
763  { NULL }
764};
765
766static const ChipDescriptor w83782d_chip = {
767  w83782d_names, w83782d_features, SENSORS_W83782D_ALARMS, SENSORS_W83782D_BEEPS
768};
769
770/** W83783S **/
771
772static const char *w83783s_names[] = {
773  SENSORS_W83783S_PREFIX, NULL
774};
775
776static const FeatureDescriptor w83783s_features[] = {
777  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
778    { SENSORS_W83783S_IN0, SENSORS_W83783S_IN0_MIN, SENSORS_W83783S_IN0_MAX, -1 } },
779  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
780    { SENSORS_W83783S_IN2, SENSORS_W83783S_IN2_MIN, SENSORS_W83783S_IN2_MAX, -1 } },
781  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
782    { SENSORS_W83783S_IN3, SENSORS_W83783S_IN3_MIN, SENSORS_W83783S_IN3_MAX, -1 } },
783  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
784    { SENSORS_W83783S_IN4, SENSORS_W83783S_IN4_MIN, SENSORS_W83783S_IN4_MAX, -1 } },
785  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
786    { SENSORS_W83783S_IN5, SENSORS_W83783S_IN5_MIN, SENSORS_W83783S_IN5_MAX, -1 } },
787  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
788    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
789  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
790    { SENSORS_W83783S_FAN1, SENSORS_W83783S_FAN1_MIN, SENSORS_W83783S_FAN1_DIV, -1 } },
791  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
792    { SENSORS_W83783S_FAN2, SENSORS_W83783S_FAN2_MIN, SENSORS_W83783S_FAN2_DIV, -1 } },
793  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN3, W83781D_ALARM_FAN3,
794    { SENSORS_W83783S_FAN3, SENSORS_W83783S_FAN3_MIN, SENSORS_W83783S_FAN3_DIV, -1 } },
795  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
796    { SENSORS_W83783S_TEMP1, SENSORS_W83783S_TEMP1_OVER, SENSORS_W83783S_TEMP1_HYST, SENSORS_W83783S_SENS1, -1 } },
797  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
798    { SENSORS_W83783S_TEMP2, SENSORS_W83783S_TEMP2_OVER, SENSORS_W83783S_TEMP2_HYST, SENSORS_W83783S_SENS2, -1 } },
799  { fmtVolt_3, rrdF3, DataType_voltage, 0, 0,
800    { SENSORS_W83783S_VID, -1 } },
801  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
802    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
803  { NULL }
804};
805
806static const ChipDescriptor w83783s_chip = {
807  w83783s_names, w83783s_features, SENSORS_W83783S_ALARMS, SENSORS_W83783S_BEEPS
808};
809
810/** W83697HF **/
811
812static const char *w83697hf_names[] = {
813  SENSORS_W83697HF_PREFIX, NULL
814};
815
816static const FeatureDescriptor w83697hf_features[] = {
817  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN0, W83781D_ALARM_IN0,
818    { SENSORS_W83782D_IN0, SENSORS_W83782D_IN0_MIN, SENSORS_W83782D_IN0_MAX, -1 } },
819  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN2, W83781D_ALARM_IN2,
820    { SENSORS_W83782D_IN2, SENSORS_W83782D_IN2_MIN, SENSORS_W83782D_IN2_MAX, -1 } },
821  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN3, W83781D_ALARM_IN3,
822    { SENSORS_W83782D_IN3, SENSORS_W83782D_IN3_MIN, SENSORS_W83782D_IN3_MAX, -1 } },
823  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN4, W83781D_ALARM_IN4,
824    { SENSORS_W83782D_IN4, SENSORS_W83782D_IN4_MIN, SENSORS_W83782D_IN4_MAX, -1 } },
825  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN5, W83781D_ALARM_IN5,
826    { SENSORS_W83782D_IN5, SENSORS_W83782D_IN5_MIN, SENSORS_W83782D_IN5_MAX, -1 } },
827  { fmtVolts_2, rrdF2, DataType_voltage, W83781D_ALARM_IN6, W83781D_ALARM_IN6,
828    { SENSORS_W83782D_IN6, SENSORS_W83782D_IN6_MIN, SENSORS_W83782D_IN6_MAX, -1 } },
829  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN1, W83781D_ALARM_FAN1,
830    { SENSORS_W83782D_FAN1, SENSORS_W83782D_FAN1_MIN, SENSORS_W83782D_FAN1_DIV, -1 } },
831  { fmtFans_0, rrdF0, DataType_rpm, W83781D_ALARM_FAN2, W83781D_ALARM_FAN2,
832    { SENSORS_W83782D_FAN2, SENSORS_W83782D_FAN2_MIN, SENSORS_W83782D_FAN2_DIV, -1 } },
833  { fmtTemps_W8378x_0, rrdF0, DataType_temperature, W83781D_ALARM_TEMP1, W83781D_ALARM_TEMP1,
834    { SENSORS_W83782D_TEMP1, SENSORS_W83782D_TEMP1_OVER, SENSORS_W83782D_TEMP1_HYST, SENSORS_W83782D_SENS1, -1 } },
835  { fmtTemps_W8378x_1, rrdF1, DataType_temperature, W83781D_ALARM_TEMP2, W83781D_ALARM_TEMP2,
836    { SENSORS_W83782D_TEMP2, SENSORS_W83782D_TEMP2_OVER, SENSORS_W83782D_TEMP2_HYST, SENSORS_W83782D_SENS2, -1 } },
837  { fmtChassisIntrusionDetection, NULL, DataType_other, W83781D_ALARM_CHAS, W83781D_ALARM_CHAS,
838    { SENSORS_W83781D_ALARMS, -1 } },
839  { fmtSoundAlarm, NULL, DataType_other, 0, 0,
840    { SENSORS_W83781D_BEEP_ENABLE, -1 } },
841  { NULL }
842};
843
844static const ChipDescriptor w83697hf_chip = {
845  w83697hf_names, w83697hf_features, SENSORS_W83781D_ALARMS, SENSORS_W83781D_BEEPS
846};
847
848
849/** MAXILIFE **/
850
851static const char *
852fmtTemps_Maxilife
853(const double values[], int alarm, int beep) {
854  if (!values[0] && !values[1] && !values[2])
855    return NULL;
856  return fmtTemps_1_0 (values, alarm, beep);
857}
858
859static const char *
860rrdTemps_Maxilife
861(const double values[]) {
862  if (!values[0] && !values[1] && !values[2])
863    return NULL;
864  return rrdF1 (values);
865}
866
867static const char *
868fmtFans_Maxilife
869(const double values[], int alarm, int beep) {
870  if (!values[0] && !values[1] && !values[2])
871    return NULL;
872  if (values[0] < 0) {
873    sprintf (buff, "Off (min = %.0f RPM, div = %.0f)", values[1], values[2]); 
874  } else {
875    sprintf (buff, "%.0f RPM (min = %.0f RPM, div = %.0f)", values[0] / values[2], values[1] / values[2], values[2]); 
876  }
877  return fmtExtra (alarm, beep);
878}
879
880static const char *
881rrdFans_Maxilife
882(const double values[]) {
883  if (!values[0] && !values[1] && !values[2])
884    return NULL;
885  if (values[0] < 0) {
886    return NULL;
887  } else {
888    sprintf (buff, "%.0f", values[0] / values[2]);
889    return buff;
890  }
891}
892
893static const char *
894fmtMHz_Maxilife
895(const double values[], int alarm, int beep) {
896  if (!values[0] && !values[1] && !values[2])
897    return NULL;
898  return fmtMHz_2 (values, alarm, beep);
899}
900
901static const char *
902rrdMHz_Maxilife
903(const double values[]) {
904  if (!values[0] && !values[1] && !values[2])
905    return NULL;
906  return rrdF2 (values);
907}
908
909static const char *
910fmtVolts_Maxilife
911(const double values[], int alarm, int beep) {
912  if (!values[0] && !values[1] && !values[2])
913    return NULL;
914  return fmtVolts_2 (values, alarm, beep);
915}
916
917static const char *
918rrdVolts_Maxilife
919(const double values[]) {
920  if (!values[0] && !values[1] && !values[2])
921    return NULL;
922  return rrdF2 (values);
923}
924
925static const char *maxilife_names[] = {
926  SENSORS_MAXI_CG_PREFIX, SENSORS_MAXI_CO_PREFIX, SENSORS_MAXI_AS_PREFIX, SENSORS_MAXI_NBA_PREFIX, NULL
927};
928
929static const FeatureDescriptor maxilife_features[] = {
930  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
931    { SENSORS_MAXI_CG_TEMP1, SENSORS_MAXI_CG_TEMP1_MAX, SENSORS_MAXI_CG_TEMP1_HYST, -1 } },
932  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP2, 0,
933    { SENSORS_MAXI_CG_TEMP2, SENSORS_MAXI_CG_TEMP2_MAX, SENSORS_MAXI_CG_TEMP2_HYST, -1 } },
934  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, 0, 0,
935    { SENSORS_MAXI_CG_TEMP3, SENSORS_MAXI_CG_TEMP3_MAX, SENSORS_MAXI_CG_TEMP3_HYST, -1 } },
936  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP4, 0,
937    { SENSORS_MAXI_CG_TEMP4, SENSORS_MAXI_CG_TEMP4_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
938  { fmtTemps_Maxilife, rrdTemps_Maxilife, DataType_temperature, MAXI_ALARM_TEMP5, 0,
939    { SENSORS_MAXI_CG_TEMP5, SENSORS_MAXI_CG_TEMP5_MAX, SENSORS_MAXI_CG_TEMP4_HYST, -1 } },
940  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN1, 0,
941    { SENSORS_MAXI_CG_FAN1, SENSORS_MAXI_CG_FAN1_MIN, SENSORS_MAXI_CG_FAN1_DIV, -1 } },
942  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN2, 0,
943    { SENSORS_MAXI_CG_FAN2, SENSORS_MAXI_CG_FAN2_MIN, SENSORS_MAXI_CG_FAN2_DIV, -1 } },
944  { fmtFans_Maxilife, rrdFans_Maxilife, DataType_rpm, MAXI_ALARM_FAN3, 0,
945    { SENSORS_MAXI_CG_FAN3, SENSORS_MAXI_CG_FAN3_MIN, SENSORS_MAXI_CG_FAN3_DIV, -1 } },
946  { fmtMHz_Maxilife, rrdMHz_Maxilife, DataType_mhz, MAXI_ALARM_PLL, 0,
947    { SENSORS_MAXI_CG_PLL, SENSORS_MAXI_CG_PLL_MIN, SENSORS_MAXI_CG_PLL_MAX, -1 } },
948  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID1, 0,
949    { SENSORS_MAXI_CG_VID1, SENSORS_MAXI_CG_VID1_MIN, SENSORS_MAXI_CG_VID1_MAX, -1 } },
950  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID2, 0,
951    { SENSORS_MAXI_CG_VID2, SENSORS_MAXI_CG_VID2_MIN, SENSORS_MAXI_CG_VID2_MAX, -1 } },
952  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID3, 0,
953    { SENSORS_MAXI_CG_VID3, SENSORS_MAXI_CG_VID3_MIN, SENSORS_MAXI_CG_VID3_MAX, -1 } },
954  { fmtVolts_Maxilife, rrdVolts_Maxilife, DataType_voltage, MAXI_ALARM_VID4, 0,
955    { SENSORS_MAXI_CG_VID4, SENSORS_MAXI_CG_VID4_MIN, SENSORS_MAXI_CG_VID4_MAX, -1 } },
956  { NULL }
957};
958
959static const ChipDescriptor maxilife_chip = {
960  maxilife_names, maxilife_features, SENSORS_MAXI_CG_ALARMS, 0
961};
962
963/** ASB100 **/
964
965static const char *asb100_names[] = {
966        SENSORS_ASB100_PREFIX, NULL
967};
968
969static const FeatureDescriptor asb100_features[] = {
970  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
971    { SENSORS_ASB100_IN0, SENSORS_ASB100_IN0_MIN, SENSORS_ASB100_IN0_MAX, -1 } },
972  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
973    { SENSORS_ASB100_IN1, SENSORS_ASB100_IN1_MIN, SENSORS_ASB100_IN1_MAX, -1 } },
974  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
975    { SENSORS_ASB100_IN2, SENSORS_ASB100_IN2_MIN, SENSORS_ASB100_IN2_MAX, -1 } },
976  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
977    { SENSORS_ASB100_IN3, SENSORS_ASB100_IN3_MIN, SENSORS_ASB100_IN3_MAX, -1 } },
978  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
979    { SENSORS_ASB100_IN4, SENSORS_ASB100_IN4_MIN, SENSORS_ASB100_IN4_MAX, -1 } },
980  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
981    { SENSORS_ASB100_IN5, SENSORS_ASB100_IN5_MIN, SENSORS_ASB100_IN5_MAX, -1 } },
982  { fmtVolts_2, rrdF2, DataType_voltage, 0, 0,
983    { SENSORS_ASB100_IN6, SENSORS_ASB100_IN6_MIN, SENSORS_ASB100_IN6_MAX, -1 } },
984
985  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
986    { SENSORS_ASB100_FAN1, SENSORS_ASB100_FAN1_MIN, -1 } },
987  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
988    { SENSORS_ASB100_FAN2, SENSORS_ASB100_FAN2_MIN, -1 } },
989  { fmtFans_0, rrdF0, DataType_rpm, 0, 0,
990    { SENSORS_ASB100_FAN3, SENSORS_ASB100_FAN3_MIN, -1 } },
991
992  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
993    { SENSORS_ASB100_TEMP1, SENSORS_ASB100_TEMP1_HYST, SENSORS_ASB100_TEMP1_OVER, -1 } },
994  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
995    { SENSORS_ASB100_TEMP2, SENSORS_ASB100_TEMP2_HYST, SENSORS_ASB100_TEMP2_OVER, -1 } },
996  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
997    { SENSORS_ASB100_TEMP3, SENSORS_ASB100_TEMP3_HYST, SENSORS_ASB100_TEMP3_OVER, -1 } },
998  { fmtTemps_1_0, rrdF1, DataType_temperature, 0, 0,
999    { SENSORS_ASB100_TEMP4, SENSORS_ASB100_TEMP4_HYST, SENSORS_ASB100_TEMP4_OVER, -1 } },
1000
1001  { NULL }
1002};
1003
1004static const ChipDescriptor asb100_chip = {
1005  asb100_names, asb100_features, 0, 0
1006};
1007
1008/** EEPROM **/
1009
1010static const char *
1011fmtType_EEPROM
1012(const double values[], int alarm, int beep) {
1013  if ((int) values[0] == 4)
1014    sprintf (buff, "SDRAM DIMM SPD");
1015  else if ((int) values[0] == 7)
1016    sprintf (buff, "DDR SDRAM DIMM SPD");
1017  else
1018    sprintf (buff, "Invalid"); /* N.B: sensors just returns, aborting further tests; I don't.. */
1019  return fmtExtra (alarm, beep);
1020}
1021
1022static const char *
1023fmtRowCol_EEPROM
1024(const double values[], int alarm, int beep) {
1025  int row = (int) values[0];
1026  int col = (int) values[1];
1027  int num = (int) values[2];
1028  int banks = (int) values[3];
1029  int foo = (row & 0xf) + (col & 0xf) + 17;
1030  if ((foo > 0) && (foo <= 12) && (num <= 8) && (banks <= 8)) {
1031    sprintf (buff, "%d", (1 << foo) * num * banks);
1032  } else {
1033    sprintf (buff, "Invalid %d %d %d %d", row, col, num, banks);
1034  }
1035  return buff;
1036}
1037
1038static const char *eeprom_names[] = {
1039  SENSORS_EEPROM_PREFIX, NULL
1040};
1041
1042static const FeatureDescriptor eeprom_features[] = {
1043  { fmtType_EEPROM, NULL, DataType_other, 0, 0,
1044    { SENSORS_EEPROM_TYPE, -1 } },
1045  { fmtRowCol_EEPROM, NULL, DataType_other, 0, 0,
1046    { SENSORS_EEPROM_ROWADDR, SENSORS_EEPROM_COLADDR, SENSORS_EEPROM_NUMROWS, SENSORS_EEPROM_BANKS, -1 } },
1047  { NULL }
1048};
1049
1050static const ChipDescriptor eeprom_chip = {
1051  eeprom_names, eeprom_features, 0, 0
1052};
1053
1054/** ALL **/
1055
1056const ChipDescriptor * const knownChips[] = {
1057  &adm1021_chip,
1058  &adm1025_chip,
1059  &adm9240_chip,
1060  &ds1621_chip,
1061  &eeprom_chip,
1062  &gl518_chip,
1063  &lm75_chip,
1064  &lm78_chip,
1065  &lm80_chip,
1066  &max1617_chip,
1067  &maxilife_chip,
1068  &sis5595_chip,
1069  &via686a_chip,
1070  &as99127f_chip,
1071  &w83781d_chip,
1072  &w83782d_chip,
1073  &w83783s_chip,
1074  &w83697hf_chip,
1075  &it87_chip,
1076  &asb100_chip,
1077  NULL
1078};
Note: See TracBrowser for help on using the browser.