1 |
3 |
xianfeng |
Kernel driver vt1211
|
2 |
|
|
====================
|
3 |
|
|
|
4 |
|
|
Supported chips:
|
5 |
|
|
* VIA VT1211
|
6 |
|
|
Prefix: 'vt1211'
|
7 |
|
|
Addresses scanned: none, address read from Super-I/O config space
|
8 |
|
|
Datasheet: Provided by VIA upon request and under NDA
|
9 |
|
|
|
10 |
|
|
Authors: Juerg Haefliger
|
11 |
|
|
|
12 |
|
|
This driver is based on the driver for kernel 2.4 by Mark D. Studebaker and
|
13 |
|
|
its port to kernel 2.6 by Lars Ekman.
|
14 |
|
|
|
15 |
|
|
Thanks to Joseph Chan and Fiona Gatt from VIA for providing documentation and
|
16 |
|
|
technical support.
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
Module Parameters
|
20 |
|
|
-----------------
|
21 |
|
|
|
22 |
|
|
* uch_config: int Override the BIOS default universal channel (UCH)
|
23 |
|
|
configuration for channels 1-5.
|
24 |
|
|
Legal values are in the range of 0-31. Bit 0 maps to
|
25 |
|
|
UCH1, bit 1 maps to UCH2 and so on. Setting a bit to 1
|
26 |
|
|
enables the thermal input of that particular UCH and
|
27 |
|
|
setting a bit to 0 enables the voltage input.
|
28 |
|
|
|
29 |
|
|
* int_mode: int Override the BIOS default temperature interrupt mode.
|
30 |
|
|
The only possible value is 0 which forces interrupt
|
31 |
|
|
mode 0. In this mode, any pending interrupt is cleared
|
32 |
|
|
when the status register is read but is regenerated as
|
33 |
|
|
long as the temperature stays above the hysteresis
|
34 |
|
|
limit.
|
35 |
|
|
|
36 |
|
|
Be aware that overriding BIOS defaults might cause some unwanted side effects!
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
Description
|
40 |
|
|
-----------
|
41 |
|
|
|
42 |
|
|
The VIA VT1211 Super-I/O chip includes complete hardware monitoring
|
43 |
|
|
capabilities. It monitors 2 dedicated temperature sensor inputs (temp1 and
|
44 |
|
|
temp2), 1 dedicated voltage (in5) and 2 fans. Additionally, the chip
|
45 |
|
|
implements 5 universal input channels (UCH1-5) that can be individually
|
46 |
|
|
programmed to either monitor a voltage or a temperature.
|
47 |
|
|
|
48 |
|
|
This chip also provides manual and automatic control of fan speeds (according
|
49 |
|
|
to the datasheet). The driver only supports automatic control since the manual
|
50 |
|
|
mode doesn't seem to work as advertised in the datasheet. In fact I couldn't
|
51 |
|
|
get manual mode to work at all! Be aware that automatic mode hasn't been
|
52 |
|
|
tested very well (due to the fact that my EPIA M10000 doesn't have the fans
|
53 |
|
|
connected to the PWM outputs of the VT1211 :-().
|
54 |
|
|
|
55 |
|
|
The following table shows the relationship between the vt1211 inputs and the
|
56 |
|
|
sysfs nodes.
|
57 |
|
|
|
58 |
|
|
Sensor Voltage Mode Temp Mode Default Use (from the datasheet)
|
59 |
|
|
------ ------------ --------- --------------------------------
|
60 |
|
|
Reading 1 temp1 Intel thermal diode
|
61 |
|
|
Reading 3 temp2 Internal thermal diode
|
62 |
|
|
UCH1/Reading2 in0 temp3 NTC type thermistor
|
63 |
|
|
UCH2 in1 temp4 +2.5V
|
64 |
|
|
UCH3 in2 temp5 VccP (processor core)
|
65 |
|
|
UCH4 in3 temp6 +5V
|
66 |
|
|
UCH5 in4 temp7 +12V
|
67 |
|
|
+3.3V in5 Internal VCC (+3.3V)
|
68 |
|
|
|
69 |
|
|
|
70 |
|
|
Voltage Monitoring
|
71 |
|
|
------------------
|
72 |
|
|
|
73 |
|
|
Voltages are sampled by an 8-bit ADC with a LSB of ~10mV. The supported input
|
74 |
|
|
range is thus from 0 to 2.60V. Voltage values outside of this range need
|
75 |
|
|
external scaling resistors. This external scaling needs to be compensated for
|
76 |
|
|
via compute lines in sensors.conf, like:
|
77 |
|
|
|
78 |
|
|
compute inx @*(1+R1/R2), @/(1+R1/R2)
|
79 |
|
|
|
80 |
|
|
The board level scaling resistors according to VIA's recommendation are as
|
81 |
|
|
follows. And this is of course totally dependent on the actual board
|
82 |
|
|
implementation :-) You will have to find documentation for your own
|
83 |
|
|
motherboard and edit sensors.conf accordingly.
|
84 |
|
|
|
85 |
|
|
Expected
|
86 |
|
|
Voltage R1 R2 Divider Raw Value
|
87 |
|
|
-----------------------------------------------
|
88 |
|
|
+2.5V 2K 10K 1.2 2083 mV
|
89 |
|
|
VccP --- --- 1.0 1400 mV (1)
|
90 |
|
|
+5V 14K 10K 2.4 2083 mV
|
91 |
|
|
+12V 47K 10K 5.7 2105 mV
|
92 |
|
|
+3.3V (int) 2K 3.4K 1.588 3300 mV (2)
|
93 |
|
|
+3.3V (ext) 6.8K 10K 1.68 1964 mV
|
94 |
|
|
|
95 |
|
|
(1) Depending on the CPU (1.4V is for a VIA C3 Nehemiah).
|
96 |
|
|
(2) R1 and R2 for 3.3V (int) are internal to the VT1211 chip and the driver
|
97 |
|
|
performs the scaling and returns the properly scaled voltage value.
|
98 |
|
|
|
99 |
|
|
Each measured voltage has an associated low and high limit which triggers an
|
100 |
|
|
alarm when crossed.
|
101 |
|
|
|
102 |
|
|
|
103 |
|
|
Temperature Monitoring
|
104 |
|
|
----------------------
|
105 |
|
|
|
106 |
|
|
Temperatures are reported in millidegree Celsius. Each measured temperature
|
107 |
|
|
has a high limit which triggers an alarm if crossed. There is an associated
|
108 |
|
|
hysteresis value with each temperature below which the temperature has to drop
|
109 |
|
|
before the alarm is cleared (this is only true for interrupt mode 0). The
|
110 |
|
|
interrupt mode can be forced to 0 in case the BIOS doesn't do it
|
111 |
|
|
automatically. See the 'Module Parameters' section for details.
|
112 |
|
|
|
113 |
|
|
All temperature channels except temp2 are external. Temp2 is the VT1211
|
114 |
|
|
internal thermal diode and the driver does all the scaling for temp2 and
|
115 |
|
|
returns the temperature in millidegree Celsius. For the external channels
|
116 |
|
|
temp1 and temp3-temp7, scaling depends on the board implementation and needs
|
117 |
|
|
to be performed in userspace via sensors.conf.
|
118 |
|
|
|
119 |
|
|
Temp1 is an Intel-type thermal diode which requires the following formula to
|
120 |
|
|
convert between sysfs readings and real temperatures:
|
121 |
|
|
|
122 |
|
|
compute temp1 (@-Offset)/Gain, (@*Gain)+Offset
|
123 |
|
|
|
124 |
|
|
According to the VIA VT1211 BIOS porting guide, the following gain and offset
|
125 |
|
|
values should be used:
|
126 |
|
|
|
127 |
|
|
Diode Type Offset Gain
|
128 |
|
|
---------- ------ ----
|
129 |
|
|
Intel CPU 88.638 0.9528
|
130 |
|
|
65.000 0.9686 *)
|
131 |
|
|
VIA C3 Ezra 83.869 0.9528
|
132 |
|
|
VIA C3 Ezra-T 73.869 0.9528
|
133 |
|
|
|
134 |
|
|
*) This is the formula from the lm_sensors 2.10.0 sensors.conf file. I don't
|
135 |
|
|
know where it comes from or how it was derived, it's just listed here for
|
136 |
|
|
completeness.
|
137 |
|
|
|
138 |
|
|
Temp3-temp7 support NTC thermistors. For these channels, the driver returns
|
139 |
|
|
the voltages as seen at the individual pins of UCH1-UCH5. The voltage at the
|
140 |
|
|
pin (Vpin) is formed by a voltage divider made of the thermistor (Rth) and a
|
141 |
|
|
scaling resistor (Rs):
|
142 |
|
|
|
143 |
|
|
Vpin = 2200 * Rth / (Rs + Rth) (2200 is the ADC max limit of 2200 mV)
|
144 |
|
|
|
145 |
|
|
The equation for the thermistor is as follows (google it if you want to know
|
146 |
|
|
more about it):
|
147 |
|
|
|
148 |
|
|
Rth = Ro * exp(B * (1 / T - 1 / To)) (To is 298.15K (25C) and Ro is the
|
149 |
|
|
nominal resistance at 25C)
|
150 |
|
|
|
151 |
|
|
Mingling the above two equations and assuming Rs = Ro and B = 3435 yields the
|
152 |
|
|
following formula for sensors.conf:
|
153 |
|
|
|
154 |
|
|
compute tempx 1 / (1 / 298.15 - (` (2200 / @ - 1)) / 3435) - 273.15,
|
155 |
|
|
2200 / (1 + (^ (3435 / 298.15 - 3435 / (273.15 + @))))
|
156 |
|
|
|
157 |
|
|
|
158 |
|
|
Fan Speed Control
|
159 |
|
|
-----------------
|
160 |
|
|
|
161 |
|
|
The VT1211 provides 2 programmable PWM outputs to control the speeds of 2
|
162 |
|
|
fans. Writing a 2 to any of the two pwm[1-2]_enable sysfs nodes will put the
|
163 |
|
|
PWM controller in automatic mode. There is only a single controller that
|
164 |
|
|
controls both PWM outputs but each PWM output can be individually enabled and
|
165 |
|
|
disabled.
|
166 |
|
|
|
167 |
|
|
Each PWM has 4 associated distinct output duty-cycles: full, high, low and
|
168 |
|
|
off. Full and off are internally hard-wired to 255 (100%) and 0 (0%),
|
169 |
|
|
respectively. High and low can be programmed via
|
170 |
|
|
pwm[1-2]_auto_point[2-3]_pwm. Each PWM output can be associated with a
|
171 |
|
|
different thermal input but - and here's the weird part - only one set of
|
172 |
|
|
thermal thresholds exist that controls both PWMs output duty-cycles. The
|
173 |
|
|
thermal thresholds are accessible via pwm[1-2]_auto_point[1-4]_temp. Note
|
174 |
|
|
that even though there are 2 sets of 4 auto points each, they map to the same
|
175 |
|
|
registers in the VT1211 and programming one set is sufficient (actually only
|
176 |
|
|
the first set pwm1_auto_point[1-4]_temp is writable, the second set is
|
177 |
|
|
read-only).
|
178 |
|
|
|
179 |
|
|
PWM Auto Point PWM Output Duty-Cycle
|
180 |
|
|
------------------------------------------------
|
181 |
|
|
pwm[1-2]_auto_point4_pwm full speed duty-cycle (hard-wired to 255)
|
182 |
|
|
pwm[1-2]_auto_point3_pwm high speed duty-cycle
|
183 |
|
|
pwm[1-2]_auto_point2_pwm low speed duty-cycle
|
184 |
|
|
pwm[1-2]_auto_point1_pwm off duty-cycle (hard-wired to 0)
|
185 |
|
|
|
186 |
|
|
Temp Auto Point Thermal Threshold
|
187 |
|
|
---------------------------------------------
|
188 |
|
|
pwm[1-2]_auto_point4_temp full speed temp
|
189 |
|
|
pwm[1-2]_auto_point3_temp high speed temp
|
190 |
|
|
pwm[1-2]_auto_point2_temp low speed temp
|
191 |
|
|
pwm[1-2]_auto_point1_temp off temp
|
192 |
|
|
|
193 |
|
|
Long story short, the controller implements the following algorithm to set the
|
194 |
|
|
PWM output duty-cycle based on the input temperature:
|
195 |
|
|
|
196 |
|
|
Thermal Threshold Output Duty-Cycle
|
197 |
|
|
(Rising Temp) (Falling Temp)
|
198 |
|
|
----------------------------------------------------------
|
199 |
|
|
full speed duty-cycle full speed duty-cycle
|
200 |
|
|
full speed temp
|
201 |
|
|
high speed duty-cycle full speed duty-cycle
|
202 |
|
|
high speed temp
|
203 |
|
|
low speed duty-cycle high speed duty-cycle
|
204 |
|
|
low speed temp
|
205 |
|
|
off duty-cycle low speed duty-cycle
|
206 |
|
|
off temp
|