207 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Kernel driver vt1211
 | 
						|
====================
 | 
						|
 | 
						|
Supported chips:
 | 
						|
  * VIA VT1211
 | 
						|
    Prefix: 'vt1211'
 | 
						|
    Addresses scanned: none, address read from Super-I/O config space
 | 
						|
    Datasheet: Provided by VIA upon request and under NDA
 | 
						|
 | 
						|
Authors: Juerg Haefliger <juergh@gmail.com>
 | 
						|
 | 
						|
This driver is based on the driver for kernel 2.4 by Mark D. Studebaker and
 | 
						|
its port to kernel 2.6 by Lars Ekman.
 | 
						|
 | 
						|
Thanks to Joseph Chan and Fiona Gatt from VIA for providing documentation and
 | 
						|
technical support.
 | 
						|
 | 
						|
 | 
						|
Module Parameters
 | 
						|
-----------------
 | 
						|
 | 
						|
* uch_config: int	Override the BIOS default universal channel (UCH)
 | 
						|
			configuration for channels 1-5.
 | 
						|
			Legal values are in the range of 0-31. Bit 0 maps to
 | 
						|
			UCH1, bit 1 maps to UCH2 and so on. Setting a bit to 1
 | 
						|
			enables the thermal input of that particular UCH and
 | 
						|
			setting a bit to 0 enables the voltage input.
 | 
						|
 | 
						|
* int_mode: int		Override the BIOS default temperature interrupt mode.
 | 
						|
			The only possible value is 0 which forces interrupt
 | 
						|
			mode 0. In this mode, any pending interrupt is cleared
 | 
						|
			when the status register is read but is regenerated as
 | 
						|
			long as the temperature stays above the hysteresis
 | 
						|
			limit.
 | 
						|
 | 
						|
Be aware that overriding BIOS defaults might cause some unwanted side effects!
 | 
						|
 | 
						|
 | 
						|
Description
 | 
						|
-----------
 | 
						|
 | 
						|
The VIA VT1211 Super-I/O chip includes complete hardware monitoring
 | 
						|
capabilities. It monitors 2 dedicated temperature sensor inputs (temp1 and
 | 
						|
temp2), 1 dedicated voltage (in5) and 2 fans. Additionally, the chip
 | 
						|
implements 5 universal input channels (UCH1-5) that can be individually
 | 
						|
programmed to either monitor a voltage or a temperature.
 | 
						|
 | 
						|
This chip also provides manual and automatic control of fan speeds (according
 | 
						|
to the datasheet). The driver only supports automatic control since the manual
 | 
						|
mode doesn't seem to work as advertised in the datasheet. In fact I couldn't
 | 
						|
get manual mode to work at all! Be aware that automatic mode hasn't been
 | 
						|
tested very well (due to the fact that my EPIA M10000 doesn't have the fans
 | 
						|
connected to the PWM outputs of the VT1211 :-().
 | 
						|
 | 
						|
The following table shows the relationship between the vt1211 inputs and the
 | 
						|
sysfs nodes.
 | 
						|
 | 
						|
Sensor          Voltage Mode   Temp Mode   Default Use (from the datasheet)
 | 
						|
------          ------------   ---------   --------------------------------
 | 
						|
Reading 1                      temp1       Intel thermal diode
 | 
						|
Reading 3                      temp2       Internal thermal diode
 | 
						|
UCH1/Reading2   in0            temp3       NTC type thermistor
 | 
						|
UCH2            in1            temp4       +2.5V
 | 
						|
UCH3            in2            temp5       VccP (processor core)
 | 
						|
UCH4            in3            temp6       +5V
 | 
						|
UCH5            in4            temp7       +12V
 | 
						|
+3.3V           in5                        Internal VCC (+3.3V)
 | 
						|
 | 
						|
 | 
						|
Voltage Monitoring
 | 
						|
------------------
 | 
						|
 | 
						|
Voltages are sampled by an 8-bit ADC with a LSB of ~10mV. The supported input
 | 
						|
range is thus from 0 to 2.60V. Voltage values outside of this range need
 | 
						|
external scaling resistors. This external scaling needs to be compensated for
 | 
						|
via compute lines in sensors.conf, like:
 | 
						|
 | 
						|
compute inx @*(1+R1/R2), @/(1+R1/R2)
 | 
						|
 | 
						|
The board level scaling resistors according to VIA's recommendation are as
 | 
						|
follows. And this is of course totally dependent on the actual board
 | 
						|
implementation :-) You will have to find documentation for your own
 | 
						|
motherboard and edit sensors.conf accordingly.
 | 
						|
 | 
						|
                                      Expected
 | 
						|
Voltage       R1     R2     Divider   Raw Value
 | 
						|
-----------------------------------------------
 | 
						|
+2.5V         2K     10K    1.2       2083 mV
 | 
						|
VccP          ---    ---    1.0       1400 mV (1)
 | 
						|
+5V           14K    10K    2.4       2083 mV
 | 
						|
+12V          47K    10K    5.7       2105 mV
 | 
						|
+3.3V (int)   2K     3.4K   1.588     3300 mV (2)
 | 
						|
+3.3V (ext)   6.8K   10K    1.68      1964 mV
 | 
						|
 | 
						|
(1) Depending on the CPU (1.4V is for a VIA C3 Nehemiah).
 | 
						|
(2) R1 and R2 for 3.3V (int) are internal to the VT1211 chip and the driver
 | 
						|
    performs the scaling and returns the properly scaled voltage value.
 | 
						|
 | 
						|
Each measured voltage has an associated low and high limit which triggers an
 | 
						|
alarm when crossed.
 | 
						|
 | 
						|
 | 
						|
Temperature Monitoring
 | 
						|
----------------------
 | 
						|
 | 
						|
Temperatures are reported in millidegree Celsius. Each measured temperature
 | 
						|
has a high limit which triggers an alarm if crossed. There is an associated
 | 
						|
hysteresis value with each temperature below which the temperature has to drop
 | 
						|
before the alarm is cleared (this is only true for interrupt mode 0). The
 | 
						|
interrupt mode can be forced to 0 in case the BIOS doesn't do it
 | 
						|
automatically. See the 'Module Parameters' section for details.
 | 
						|
 | 
						|
All temperature channels except temp2 are external. Temp2 is the VT1211
 | 
						|
internal thermal diode and the driver does all the scaling for temp2 and
 | 
						|
returns the temperature in millidegree Celsius. For the external channels
 | 
						|
temp1 and temp3-temp7, scaling depends on the board implementation and needs
 | 
						|
to be performed in userspace via sensors.conf.
 | 
						|
 | 
						|
Temp1 is an Intel-type thermal diode which requires the following formula to
 | 
						|
convert between sysfs readings and real temperatures:
 | 
						|
 | 
						|
compute temp1 (@-Offset)/Gain, (@*Gain)+Offset
 | 
						|
 | 
						|
According to the VIA VT1211 BIOS porting guide, the following gain and offset
 | 
						|
values should be used:
 | 
						|
 | 
						|
Diode Type      Offset   Gain
 | 
						|
----------      ------   ----
 | 
						|
Intel CPU       88.638   0.9528
 | 
						|
                65.000   0.9686   *)
 | 
						|
VIA C3 Ezra     83.869   0.9528
 | 
						|
VIA C3 Ezra-T   73.869   0.9528
 | 
						|
 | 
						|
*) This is the formula from the lm_sensors 2.10.0 sensors.conf file. I don't
 | 
						|
know where it comes from or how it was derived, it's just listed here for
 | 
						|
completeness.
 | 
						|
 | 
						|
Temp3-temp7 support NTC thermistors. For these channels, the driver returns
 | 
						|
the voltages as seen at the individual pins of UCH1-UCH5. The voltage at the
 | 
						|
pin (Vpin) is formed by a voltage divider made of the thermistor (Rth) and a
 | 
						|
scaling resistor (Rs):
 | 
						|
 | 
						|
Vpin = 2200 * Rth / (Rs + Rth)   (2200 is the ADC max limit of 2200 mV)
 | 
						|
 | 
						|
The equation for the thermistor is as follows (google it if you want to know
 | 
						|
more about it):
 | 
						|
 | 
						|
Rth = Ro * exp(B * (1 / T - 1 / To))   (To is 298.15K (25C) and Ro is the
 | 
						|
                                        nominal resistance at 25C)
 | 
						|
 | 
						|
Mingling the above two equations and assuming Rs = Ro and B = 3435 yields the
 | 
						|
following formula for sensors.conf:
 | 
						|
 | 
						|
compute tempx 1 / (1 / 298.15 - (` (2200 / @ - 1)) / 3435) - 273.15,
 | 
						|
              2200 / (1 + (^ (3435 / 298.15 - 3435 / (273.15 + @))))
 | 
						|
 | 
						|
 | 
						|
Fan Speed Control
 | 
						|
-----------------
 | 
						|
 | 
						|
The VT1211 provides 2 programmable PWM outputs to control the speeds of 2
 | 
						|
fans. Writing a 2 to any of the two pwm[1-2]_enable sysfs nodes will put the
 | 
						|
PWM controller in automatic mode. There is only a single controller that
 | 
						|
controls both PWM outputs but each PWM output can be individually enabled and
 | 
						|
disabled.
 | 
						|
 | 
						|
Each PWM has 4 associated distinct output duty-cycles: full, high, low and
 | 
						|
off. Full and off are internally hard-wired to 255 (100%) and 0 (0%),
 | 
						|
respectively. High and low can be programmed via
 | 
						|
pwm[1-2]_auto_point[2-3]_pwm. Each PWM output can be associated with a
 | 
						|
different thermal input but - and here's the weird part - only one set of
 | 
						|
thermal thresholds exist that controls both PWMs output duty-cycles. The
 | 
						|
thermal thresholds are accessible via pwm[1-2]_auto_point[1-4]_temp. Note
 | 
						|
that even though there are 2 sets of 4 auto points each, they map to the same
 | 
						|
registers in the VT1211 and programming one set is sufficient (actually only
 | 
						|
the first set pwm1_auto_point[1-4]_temp is writable, the second set is
 | 
						|
read-only).
 | 
						|
 | 
						|
PWM Auto Point             PWM Output Duty-Cycle
 | 
						|
------------------------------------------------
 | 
						|
pwm[1-2]_auto_point4_pwm   full speed duty-cycle (hard-wired to 255)
 | 
						|
pwm[1-2]_auto_point3_pwm   high speed duty-cycle
 | 
						|
pwm[1-2]_auto_point2_pwm   low speed duty-cycle
 | 
						|
pwm[1-2]_auto_point1_pwm   off duty-cycle (hard-wired to 0)
 | 
						|
 | 
						|
Temp Auto Point             Thermal Threshold
 | 
						|
---------------------------------------------
 | 
						|
pwm[1-2]_auto_point4_temp   full speed temp
 | 
						|
pwm[1-2]_auto_point3_temp   high speed temp
 | 
						|
pwm[1-2]_auto_point2_temp   low speed temp
 | 
						|
pwm[1-2]_auto_point1_temp   off temp
 | 
						|
 | 
						|
Long story short, the controller implements the following algorithm to set the
 | 
						|
PWM output duty-cycle based on the input temperature:
 | 
						|
 | 
						|
Thermal Threshold             Output Duty-Cycle
 | 
						|
                    (Rising Temp)           (Falling Temp)
 | 
						|
----------------------------------------------------------
 | 
						|
                    full speed duty-cycle   full speed duty-cycle
 | 
						|
full speed temp
 | 
						|
                    high speed duty-cycle   full speed duty-cycle
 | 
						|
high speed temp
 | 
						|
                    low speed duty-cycle    high speed duty-cycle
 | 
						|
low speed temp
 | 
						|
                    off duty-cycle          low speed duty-cycle
 | 
						|
off temp
 |