0001 Kernel driver vt1211
0002 ====================
0003
0004 Supported chips:
0005
0006 * VIA VT1211
0007
0008 Prefix: 'vt1211'
0009
0010 Addresses scanned: none, address read from Super-I/O config space
0011
0012 Datasheet: Provided by VIA upon request and under NDA
0013
0014 Authors: Juerg Haefliger <juergh@gmail.com>
0015
0016 This driver is based on the driver for kernel 2.4 by Mark D. Studebaker and
0017 its port to kernel 2.6 by Lars Ekman.
0018
0019 Thanks to Joseph Chan and Fiona Gatt from VIA for providing documentation and
0020 technical support.
0021
0022
0023 Module Parameters
0024 -----------------
0025
0026
0027 * uch_config: int
0028 Override the BIOS default universal channel (UCH)
0029 configuration for channels 1-5.
0030 Legal values are in the range of 0-31. Bit 0 maps to
0031 UCH1, bit 1 maps to UCH2 and so on. Setting a bit to 1
0032 enables the thermal input of that particular UCH and
0033 setting a bit to 0 enables the voltage input.
0034
0035 * int_mode: int
0036 Override the BIOS default temperature interrupt mode.
0037 The only possible value is 0 which forces interrupt
0038 mode 0. In this mode, any pending interrupt is cleared
0039 when the status register is read but is regenerated as
0040 long as the temperature stays above the hysteresis
0041 limit.
0042
0043 Be aware that overriding BIOS defaults might cause some unwanted side effects!
0044
0045
0046 Description
0047 -----------
0048
0049 The VIA VT1211 Super-I/O chip includes complete hardware monitoring
0050 capabilities. It monitors 2 dedicated temperature sensor inputs (temp1 and
0051 temp2), 1 dedicated voltage (in5) and 2 fans. Additionally, the chip
0052 implements 5 universal input channels (UCH1-5) that can be individually
0053 programmed to either monitor a voltage or a temperature.
0054
0055 This chip also provides manual and automatic control of fan speeds (according
0056 to the datasheet). The driver only supports automatic control since the manual
0057 mode doesn't seem to work as advertised in the datasheet. In fact I couldn't
0058 get manual mode to work at all! Be aware that automatic mode hasn't been
0059 tested very well (due to the fact that my EPIA M10000 doesn't have the fans
0060 connected to the PWM outputs of the VT1211 :-().
0061
0062 The following table shows the relationship between the vt1211 inputs and the
0063 sysfs nodes.
0064
0065 =============== ============== =========== ================================
0066 Sensor Voltage Mode Temp Mode Default Use (from the datasheet)
0067 =============== ============== =========== ================================
0068 Reading 1 temp1 Intel thermal diode
0069 Reading 3 temp2 Internal thermal diode
0070 UCH1/Reading2 in0 temp3 NTC type thermistor
0071 UCH2 in1 temp4 +2.5V
0072 UCH3 in2 temp5 VccP (processor core)
0073 UCH4 in3 temp6 +5V
0074 UCH5 in4 temp7 +12V
0075 +3.3V in5 Internal VCC (+3.3V)
0076 =============== ============== =========== ================================
0077
0078
0079 Voltage Monitoring
0080 ------------------
0081
0082 Voltages are sampled by an 8-bit ADC with a LSB of ~10mV. The supported input
0083 range is thus from 0 to 2.60V. Voltage values outside of this range need
0084 external scaling resistors. This external scaling needs to be compensated for
0085 via compute lines in sensors.conf, like:
0086
0087 compute inx @*(1+R1/R2), @/(1+R1/R2)
0088
0089 The board level scaling resistors according to VIA's recommendation are as
0090 follows. And this is of course totally dependent on the actual board
0091 implementation :-) You will have to find documentation for your own
0092 motherboard and edit sensors.conf accordingly.
0093
0094 ============= ====== ====== ========= ============
0095 Expected
0096 Voltage R1 R2 Divider Raw Value
0097 ============= ====== ====== ========= ============
0098 +2.5V 2K 10K 1.2 2083 mV
0099 VccP --- --- 1.0 1400 mV [1]_
0100 +5V 14K 10K 2.4 2083 mV
0101 +12V 47K 10K 5.7 2105 mV
0102 +3.3V (int) 2K 3.4K 1.588 3300 mV [2]_
0103 +3.3V (ext) 6.8K 10K 1.68 1964 mV
0104 ============= ====== ====== ========= ============
0105
0106 .. [1] Depending on the CPU (1.4V is for a VIA C3 Nehemiah).
0107
0108 .. [2] R1 and R2 for 3.3V (int) are internal to the VT1211 chip and the driver
0109 performs the scaling and returns the properly scaled voltage value.
0110
0111 Each measured voltage has an associated low and high limit which triggers an
0112 alarm when crossed.
0113
0114
0115 Temperature Monitoring
0116 ----------------------
0117
0118 Temperatures are reported in millidegree Celsius. Each measured temperature
0119 has a high limit which triggers an alarm if crossed. There is an associated
0120 hysteresis value with each temperature below which the temperature has to drop
0121 before the alarm is cleared (this is only true for interrupt mode 0). The
0122 interrupt mode can be forced to 0 in case the BIOS doesn't do it
0123 automatically. See the 'Module Parameters' section for details.
0124
0125 All temperature channels except temp2 are external. Temp2 is the VT1211
0126 internal thermal diode and the driver does all the scaling for temp2 and
0127 returns the temperature in millidegree Celsius. For the external channels
0128 temp1 and temp3-temp7, scaling depends on the board implementation and needs
0129 to be performed in userspace via sensors.conf.
0130
0131 Temp1 is an Intel-type thermal diode which requires the following formula to
0132 convert between sysfs readings and real temperatures:
0133
0134 compute temp1 (@-Offset)/Gain, (@*Gain)+Offset
0135
0136 According to the VIA VT1211 BIOS porting guide, the following gain and offset
0137 values should be used:
0138
0139 =============== ======== ===========
0140 Diode Type Offset Gain
0141 =============== ======== ===========
0142 Intel CPU 88.638 0.9528
0143 65.000 0.9686 [3]_
0144 VIA C3 Ezra 83.869 0.9528
0145 VIA C3 Ezra-T 73.869 0.9528
0146 =============== ======== ===========
0147
0148 .. [3] This is the formula from the lm_sensors 2.10.0 sensors.conf file. I don't
0149 know where it comes from or how it was derived, it's just listed here for
0150 completeness.
0151
0152 Temp3-temp7 support NTC thermistors. For these channels, the driver returns
0153 the voltages as seen at the individual pins of UCH1-UCH5. The voltage at the
0154 pin (Vpin) is formed by a voltage divider made of the thermistor (Rth) and a
0155 scaling resistor (Rs)::
0156
0157 Vpin = 2200 * Rth / (Rs + Rth) (2200 is the ADC max limit of 2200 mV)
0158
0159 The equation for the thermistor is as follows (google it if you want to know
0160 more about it)::
0161
0162 Rth = Ro * exp(B * (1 / T - 1 / To)) (To is 298.15K (25C) and Ro is the
0163 nominal resistance at 25C)
0164
0165 Mingling the above two equations and assuming Rs = Ro and B = 3435 yields the
0166 following formula for sensors.conf::
0167
0168 compute tempx 1 / (1 / 298.15 - (` (2200 / @ - 1)) / 3435) - 273.15,
0169 2200 / (1 + (^ (3435 / 298.15 - 3435 / (273.15 + @))))
0170
0171
0172 Fan Speed Control
0173 -----------------
0174
0175 The VT1211 provides 2 programmable PWM outputs to control the speeds of 2
0176 fans. Writing a 2 to any of the two pwm[1-2]_enable sysfs nodes will put the
0177 PWM controller in automatic mode. There is only a single controller that
0178 controls both PWM outputs but each PWM output can be individually enabled and
0179 disabled.
0180
0181 Each PWM has 4 associated distinct output duty-cycles: full, high, low and
0182 off. Full and off are internally hard-wired to 255 (100%) and 0 (0%),
0183 respectively. High and low can be programmed via
0184 pwm[1-2]_auto_point[2-3]_pwm. Each PWM output can be associated with a
0185 different thermal input but - and here's the weird part - only one set of
0186 thermal thresholds exist that controls both PWMs output duty-cycles. The
0187 thermal thresholds are accessible via pwm[1-2]_auto_point[1-4]_temp. Note
0188 that even though there are 2 sets of 4 auto points each, they map to the same
0189 registers in the VT1211 and programming one set is sufficient (actually only
0190 the first set pwm1_auto_point[1-4]_temp is writable, the second set is
0191 read-only).
0192
0193 ========================== =========================================
0194 PWM Auto Point PWM Output Duty-Cycle
0195 ========================== =========================================
0196 pwm[1-2]_auto_point4_pwm full speed duty-cycle (hard-wired to 255)
0197 pwm[1-2]_auto_point3_pwm high speed duty-cycle
0198 pwm[1-2]_auto_point2_pwm low speed duty-cycle
0199 pwm[1-2]_auto_point1_pwm off duty-cycle (hard-wired to 0)
0200 ========================== =========================================
0201
0202 ========================== =================
0203 Temp Auto Point Thermal Threshold
0204 ========================== =================
0205 pwm[1-2]_auto_point4_temp full speed temp
0206 pwm[1-2]_auto_point3_temp high speed temp
0207 pwm[1-2]_auto_point2_temp low speed temp
0208 pwm[1-2]_auto_point1_temp off temp
0209 ========================== =================
0210
0211 Long story short, the controller implements the following algorithm to set the
0212 PWM output duty-cycle based on the input temperature:
0213
0214 =================== ======================= ========================
0215 Thermal Threshold Output Duty-Cycle Output Duty-Cycle
0216 (Rising Temp) (Falling Temp)
0217 =================== ======================= ========================
0218 - full speed duty-cycle full speed duty-cycle
0219 full speed temp
0220 - high speed duty-cycle full speed duty-cycle
0221 high speed temp
0222 - low speed duty-cycle high speed duty-cycle
0223 low speed temp
0224 - off duty-cycle low speed duty-cycle
0225 off temp
0226 =================== ======================= ========================