From 9f600e9c2c6d63f1233e20abffd3488bc7a659fe Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Tue, 9 Feb 1999 23:57:27 +0000 Subject: [PATCH] Documentation updates, small bug fixes I am trying to create a more-or-less standard documentation format for doc/chips/* files. I am not quite satisfied with the lm75 and lm78 docs yet, but it is starting to come. Basically, I want as much information in it as possible, and to generate most of it automatically. But that is harder than I though it would be. Also, a small library bugfix (class problem) and a doc-features fix. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@210 7894878c-1315-0410-8ee3-d5d059ff63e0 --- doc/chips/lm75 | 47 ++++----- doc/chips/lm78 | 204 +++++++++++++++++++++++----------------- lib/chips.c | 18 ++-- prog/doc/doc-features.c | 9 +- 4 files changed, 157 insertions(+), 121 deletions(-) diff --git a/doc/chips/lm75 b/doc/chips/lm75 index db2db788..1b429a1c 100644 --- a/doc/chips/lm75 +++ b/doc/chips/lm75 @@ -1,24 +1,29 @@ -This file documents the lm75 directories. +Kernel driver `lm75.o' -There will be one directory created for each detected LM75 chip. As LM75 -chips can only be on a SMBus, they will be called lm75-i2c-?-??, with -the first question mark being the number of the i2c bus (see /proc/bus/i2c -for a list of them, if i2c-proc is loaded), and the SMBus (I2C) address -of the chip at the end. An LM75 is uniquely characterised with these -two numbers. /proc/sys/dev/sensors/chips contains the SYSCTL values for -all chip directories. +Prefixes: lm75 (LM75, I2C) -Within each LM75 directory, you can find the following files: -* temp (LM75_SYSCTL_TEMP) - A list of three numbers. The first number is the Overtemperature Shutdown - value, the second number is Hysteris value, and the third number is the - current temperature. The first two values can be modified. Each value can - be set and read to half-degree accuracy. All values are in degrees Celcius. - An alarm is issued (usually to a connected LM78) when the temperature - gets higher then the Overtemperature Shutdown value; it stays on until - the temperature falls below the Hysteris value. - If accessed through sysctl, this is a list of longs, each being the - temperature times 10. +This driver implements support for the National Semiconductor LM75, a +`Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface'. -The data for each LM75 is updated each 1.5 seconds, but only if it is actually -read. +The LM75 implements one temperature sensor. Limits can be set through the +Overtemperature Shutdown register and Hysteris register. Each value can be +set and read to half-degree accuracy. +An alarm is issued (usually to a connected LM78) when the temperature +gets higher then the Overtemperature Shutdown value; it stays on until +the temperature falls below the Hysteris value. +All temperatures are in degrees Celcius. + +The LM75 only updates its values each 1.5 seconds; reading it more often +will do no harm, but will return 'old' values. + + +/proc and sysctl interface files: + * temp (LM75_SYSCTL_TEMP) + Overtemperature Shutdown Value (RW,1), Hysteris Value (RW,1) and Current + Temperature (R,1). + +configuration file features: + NAME LABEL CLASS COMPUTE CLASS RW + temp: R + temp_hyst: temp temp RW + temp_over: temp temp RW diff --git a/doc/chips/lm78 b/doc/chips/lm78 index 4ebda968..d392bd0a 100644 --- a/doc/chips/lm78 +++ b/doc/chips/lm78 @@ -1,89 +1,121 @@ -This file documents the lm78 directories. +Kernel driver `lm78.o' -There will be one directory created for each detected LM78, LM78-J or LM79 -chip. Each chip can both be on the ISA bus and the SMBus. Directories -are called things like lm78-isa-0290, lm78-j-i2c-3-4e or lm79-isa-0280. -/proc/sys/dev/sensors/chips contains the SYSCTL values for all chip -directories. +Prefixes: lm78 (LM78, I2C and ISA) + lm78-j (LM78-J, I2C and ISA) + lm79 (LM79, I2C and ISA) -Within each LM78 directory, you can find the following files: -* alarms (LM78_SYSCTL_ALARMS) - A number which indicates which alarms are on. An alarm gets triggered when - some limit has been crossed. Even if the cause of the alarm is over, it - stays triggered until it has been read at least once. Because the LM78 - values are updated at most once every 1.5 seconds, this means the alarm - can be read several times before it is erased. - This file can not be written to. - The number is the logical OR of the following components: - - LM78_ALARM_IN[0-6] - Gets triggered when the corresponding in value is higher or lower than - its limits - - LM78_ALARM_FAN[1-3] - Gets triggered when the corresponding fan value is lower than its limit - - LM78_ALARM_TEMP - Gets triggered when the temp value has crossed its limits. See the - description under temp. - - LM78_ALARM_BTI - Gets triggered if some other chip which is connected to it has crossed - its limits. Usually, it is connected to all LM75 chips; if at least one - crosses its limits, this bit gets set. - - LM78_ALARM_CHAS - Gets triggered if someone opens your computer case (if connected at all). - - LM78_ALARM_FIFO - Gets triggered if something is very wrong with our LM78 driver. Ignore. - - LM78_ALARM_SMI_IN - Gets triggered if some other chip has triggered a SMI interrupt. Can be - ignored. - If accessed through sysctl, this value is a long. -* fan[1-3] (LM78_SYSCTL_FAN[1-3]) - A list of two numbers. The first is the minimum fan rotation limit; the - second is the current fan rotation speed. Both are in RPM (rotation per - minute). An alarm is triggered if the rotation speed drops below the - limit. The first value can be changed. Not all RPM values can accurately - be represented, so some rounding is done. - If accessed through sysctl, this is a list of longs. -* fan_div (LM78_SYSCTL_FAN_DIV) - A list of three numbers, one for each fan. Each number can be either 1, 2, - 4 or 8. It is the internal scaling factor used for the FAN rotations. If - you change this number, the FAN readings get more or less detailed, but - the range in which they can be read too. Higher numbers give better - resolution, but less range. The first two numbers can be changed, the - third not. - If accessed through sysctl, this is a list of longs. -* in[0-6] (LM78_SYSCTL_IN[0-6]) - A list of three numbers. The first is the minimum limit, the second is the - maximum limit, and the third is the current value. If you have a weird - mainboard, all values may be off because some other scaling factor has - to be used; user-space programs should compensate for this. Note that - minimum means 'closest to zero'; so if the normal value equals -10, a - minimum could equal -9, and a maximum -11. IN0 and IN1 reflect core - voltages; they are by default set from the vid values, or set to 2.80V - if the vid lines seem to be unconnected. IN2 should equal +3.30V, - IN3 +5.00V, IN4 +12.00V, IN5 -12.00V and IN6 -5V. Not all voltage values - can be accurately represented, so some rounding is done. - The first two numbers can be changed, the third not. - If accessed through sysctl, this is a list of longs, each being the voltage - times 100. -* temp - A list of three numbers. The first number is the Overtemperature Shutdown - value; the second is the Hysteris value and the third number is the - current value. The first two values can be modified. All values are in - degrees Celcius. An alarm is issued when the temperature first gets above - the Overtemperature Shutdown value; no more alarms are issued until the - temperature gets below the Hysteris value, at which moment another alarm - is issued, and the state is reset. A more useful behaviour can be found - by setting the Hysteris value to +127 degrees Celcius; in this case, - alarms are issued during all the time when the actual temperature is - above the Overtemperature Shutdown value. - The first two numbers can be changed, the third not. - If accessed through sysctl, this is a list of longs, each being the - temperature in degrees Celcius times 10. -* vid - The core voltage value (the voltage level your processor should work with), - in volts. This is the value IN0 and IN1 are initialized to. If unconnected, - it usually reads 3.50V. - This number can not be changed. - If accessed through sysctl, this is a long, being the voltage times 100. +This driver implements support for the National Semiconductor LM78, LM78-J +and LM79. They are described as `Microprocessor System Hardware Monitors'. -The data for each LM78 is updated each 1.5 seconds, but only if it is actually -read. +There is almost no difference between these three chips. Functionally, the +LM78 and LM78-J are exactly identical. The LM79 has one more VID line, +which is used to report the lower voltages newer Pentium processors use. +From now on, LM7* means either of these three types. + +The LM7* implements one temperatur sensor, three FAN rotation speed sensors, +seven voltage sensors, VID lines, alarms, and some miscellaneous stuff. + +Temperatures are measured in degrees Celcius. An alarm is triggered once +when the Overtemperature Shutdown limit is crossed; it is triggered again +as soon as it drops below the Hysteris value. A more useful behaviour +can be found by setting the Hysteris value to +127 degrees Celcius; in +this case, alarms are issued during all the time when the actual temperature \ +is above the Overtemperature Shutdown value. + +FAN rotation speeds are reported in RPM (rotations per minute). An alarm is +triggered if the rotation speed has dropped below a programmable limit. FAN +readings can be divided by a programmable divider (1, 2, 4 or 8) to give +the readings more range or accuracy. This is imporatant because some FANs +report only one 'tick' each rotation, while others report two - making +all readings twice as high. Not all RPM values can accurately be represented, +so some rounding is done. + +Voltage sensors (also known as IN sensors) report their values in volts. +An alarm is triggered if the voltage has crossed a programmable minimum +or maximum limit. Note that minimum in this case always means 'closest to +zero'; this is important for negative voltage measurements. + +The VID lines encode the core voltage value: the voltage level your processor +should work with. This is hardcoded by the mainboard and/or processor itself. +It is a value in volts. + +In addition to the alarms described above, there are a couple of additional +ones. There is a BTI alarm, which gets triggered when an external chip has +crossed its limits. Usually, this is connected to all LM75 chips; if at +least one crosses its limits, this bit gets set. The CHAS alarm triggers +if your computer case is open. The FIFO alarms should never trigger; it +indicates an internal error. The SMI_IN alarm indicates some other chip +has triggered an SMI interrupt. As we do not use SMI interrupts at all, +this condition usually indicates there is a problem with some other +device. + +If an alarm triggers, it will remain triggered until the hardware register + is read at least once. This means that the cause for the alarm may +already have disappeared! Note that in the current implementation, all +hardware registers are read whenever any data is read (unless it is less +than 1.5 seconds since the last update). This means that you can easily +miss once-only alarms. + +The LM7* only updates its values each 1.5 seconds; reading it more often +will do no harm, but will return 'old' values. + + +/proc and sysctl interface files: + * alarms (LM78_SYSCTL_ALARMS) + A single number (R,0) which indicates which alarms are currently + triggered. It is a logical OR of the following bit values: + LM78_ALARM_BTI, LM78_ALARM_CHAS, LM78_ALARM_FIFO, LM78_ALARM_SMI_IN, + LM78_ALARMS_IN[0-6], LM78_ALARM_FAN[1-3], LM78_ALARM_TEMP + * fan[1-3] (LM78_SYSCTL_FAN[1-3]) + The Fan Low Limit (RW,0) and Current Fan Reading (R,0). + * fan_div (LM78_SYSCTL_FAN_DIV) + The FAN1 Scaling Factor (RW,0), FAN2 Scaling Factor (RW,0) and FAN3 Scaling + Factor (RW,0). + * in[0-6] (LM78_SYSCTL_IN[0-6]) + The Voltage Low Limit (RW,2), Voltage High Limit (RW,2) and Current + Voltage Reading (R,2). + * temp + The Overtemperature Shutdown Value (RW,1), Hysteris Value (RW,1) and + Current Temperature (R,1). + * vid + The Core Voltage Value (R,2). + + +configuration file features: + + NAME LABEL CLASS COMPUTE CLASS RW + alarms: R + fan1: R + fan1_div: fan1 RW + fan1_min: fan1 RW + fan2: R + fan2_div: fan2 RW + fan2_min: fan2 RW + fan3: R + fan3_div: fan3 R + fan3_min: fan3 RW + in0: R + in0_max: in0 in0 RW + in0_min: in0 in0 RW + in1: R + in1_max: in1 in1 RW + in1_min: in1 in1 RW + in2: R + in2_max: in2 in2 RW + in2_min: in2 in2 RW + in3: R + in3_max: in3 in3 RW + in3_min: in3 in3 RW + in4: R + in4_max: in4 in4 RW + in4_min: in4 in4 RW + in5: R + in5_max: in5 in5 RW + in5_min: in5 in5 RW + in6: R + in6_max: in6 in6 RW + in6_min: in6 in6 RW + temp: R + temp_hyst: temp temp RW + temp_over: temp temp RW + vid: R diff --git a/lib/chips.c b/lib/chips.c index 0ebfe4e1..dfd7897e 100644 --- a/lib/chips.c +++ b/lib/chips.c @@ -88,11 +88,11 @@ static sensors_chip_feature lm78_features[] = SENSORS_MODE_R, LM78_SYSCTL_FAN2, VALUE(2), 0 }, { SENSORS_LM78_FAN3, "fan3", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_FAN3, VALUE(2), 0 }, - { SENSORS_LM78_FAN1_MIN, "fan1_min", SENSORS_LM78_FAN1, SENSORS_NO_MAPPING, + { SENSORS_LM78_FAN1_MIN, "fan1_min", SENSORS_LM78_FAN1, SENSORS_LM78_FAN1, SENSORS_MODE_RW, LM78_SYSCTL_FAN1, VALUE(1), 0 }, - { SENSORS_LM78_FAN2_MIN, "fan2_min", SENSORS_LM78_FAN2, SENSORS_NO_MAPPING, + { SENSORS_LM78_FAN2_MIN, "fan2_min", SENSORS_LM78_FAN2, SENSORS_LM78_FAN2, SENSORS_MODE_RW, LM78_SYSCTL_FAN2, VALUE(1), 0 }, - { SENSORS_LM78_FAN3_MIN, "fan3_min", SENSORS_LM78_FAN3, SENSORS_NO_MAPPING, + { SENSORS_LM78_FAN3_MIN, "fan3_min", SENSORS_LM78_FAN3, SENSORS_LM78_FAN3, SENSORS_MODE_RW, LM78_SYSCTL_FAN3, VALUE(1), 0 }, { SENSORS_LM78_TEMP, "temp", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_TEMP, VALUE(3), 1 }, @@ -169,13 +169,13 @@ static sensors_chip_feature lm78j_features[] = { SENSORS_LM78J_FAN3, "fan3", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_FAN3, VALUE(2), 0 }, { SENSORS_LM78J_FAN1_MIN, "fan1_min", SENSORS_LM78J_FAN1, - SENSORS_NO_MAPPING, SENSORS_MODE_RW, + SENSORS_LM78J_FAN1, SENSORS_MODE_RW, LM78_SYSCTL_FAN1, VALUE(1), 0 }, { SENSORS_LM78J_FAN2_MIN, "fan2_min", SENSORS_LM78J_FAN2, - SENSORS_NO_MAPPING, SENSORS_MODE_RW, + SENSORS_LM78J_FAN2, SENSORS_MODE_RW, LM78_SYSCTL_FAN2, VALUE(1), 0 }, { SENSORS_LM78J_FAN3_MIN, "fan3_min", SENSORS_LM78J_FAN3, - SENSORS_NO_MAPPING, SENSORS_MODE_RW, + SENSORS_LM78J_FAN3, SENSORS_MODE_RW, LM78_SYSCTL_FAN3, VALUE(1), 0 }, { SENSORS_LM78J_TEMP, "temp", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_TEMP, VALUE(3), 1 }, @@ -251,11 +251,11 @@ static sensors_chip_feature lm79_features[] = SENSORS_MODE_R, LM78_SYSCTL_FAN2, VALUE(2), 0 }, { SENSORS_LM79_FAN3, "fan3", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_FAN3, VALUE(2), 0 }, - { SENSORS_LM79_FAN1_MIN, "fan1_min", SENSORS_LM79_FAN1, SENSORS_NO_MAPPING, + { SENSORS_LM79_FAN1_MIN, "fan1_min", SENSORS_LM79_FAN1, SENSORS_LM79_FAN1, SENSORS_MODE_RW, LM78_SYSCTL_FAN1, VALUE(1), 0 }, - { SENSORS_LM79_FAN2_MIN, "fan2_min", SENSORS_LM79_FAN2, SENSORS_NO_MAPPING, + { SENSORS_LM79_FAN2_MIN, "fan2_min", SENSORS_LM79_FAN2, SENSORS_LM79_FAN2, SENSORS_MODE_RW, LM78_SYSCTL_FAN2, VALUE(1), 0 }, - { SENSORS_LM79_FAN3_MIN, "fan3_min", SENSORS_LM79_FAN3, SENSORS_NO_MAPPING, + { SENSORS_LM79_FAN3_MIN, "fan3_min", SENSORS_LM79_FAN3, SENSORS_LM79_FAN3, SENSORS_MODE_RW, LM78_SYSCTL_FAN3, VALUE(1), 0 }, { SENSORS_LM79_TEMP, "temp", SENSORS_NO_MAPPING, SENSORS_NO_MAPPING, SENSORS_MODE_R, LM78_SYSCTL_TEMP, VALUE(3), 1 }, diff --git a/prog/doc/doc-features.c b/prog/doc/doc-features.c index 2d23b648..86828abb 100644 --- a/prog/doc/doc-features.c +++ b/prog/doc/doc-features.c @@ -51,11 +51,10 @@ const char *mode_string(int mode) void dump_feature(const sensors_chip_feature *featuredata, const sensors_chip_features *chipdata) { - printf(" %17s: %17s %17s %2s %2d\n",featuredata->name, + printf(" %17s: %17s %17s %2s\n",featuredata->name, lookup_feature_name(featuredata->logical_mapping,chipdata), lookup_feature_name(featuredata->compute_mapping,chipdata), - mode_string(featuredata->mode), - featuredata->scaling); + mode_string(featuredata->mode)); } int qsort_compare (const void *f1, const void *f2) @@ -77,8 +76,8 @@ void dump_chip (const sensors_chip_features *chipdata) qsort(features,i,sizeof(*features),qsort_compare); printf("Chip `%s'\n",chipdata->prefix); - printf(" %17s %17s %17s %2s %s\n","NAME","LABEL CLASS","COMPUTE CLASS", - "RW","SCALE"); + printf(" %17s %17s %17s %2s\n","NAME","LABEL CLASS","COMPUTE CLASS", + "RW"); for (i = 0; features[i]->name; i++) dump_feature(features[i],chipdata);