Commit | Line | Data |
---|---|---|
61d0b533 JH |
1 | 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 <juergh@gmail.com> | |
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 | ||
a1fdcb96 JH |
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 | ||
61d0b533 JH |
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 | |
a1fdcb96 | 111 | automatically. See the 'Module Parameters' section for details. |
61d0b533 JH |
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 |