| 
									
										
										
										
											2006-09-24 20:54:46 +02:00
										 |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-24 20:55:34 +02:00
										 |  |  | 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! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-24 20:54:46 +02:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2006-09-24 20:55:34 +02:00
										 |  |  | automatically. See the 'Module Parameters' section for details. | 
					
						
							| 
									
										
										
										
											2006-09-24 20:54:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 |