内核驱动 vt1211¶
支持的芯片
VIA VT1211
前缀:'vt1211'
扫描地址:无,从 Super-I/O 配置空间读取地址
数据表:由 VIA 应要求提供,并受保密协议约束
作者:Juerg Haefliger <juergh@gmail.com>
此驱动程序基于 Mark D. Studebaker 为内核 2.4 编写的驱动程序及其 Lars Ekman 为内核 2.6 移植的版本。
感谢 VIA 的 Joseph Chan 和 Fiona Gatt 提供文档和技术支持。
模块参数¶
- uch_config: int
覆盖通道 1-5 的 BIOS 默认通用通道 (UCH) 配置。合法值范围为 0-31。位 0 映射到 UCH1,位 1 映射到 UCH2,依此类推。将某个位设置为 1 将启用该特定 UCH 的热输入,将某个位设置为 0 将启用电压输入。
- int_mode: int
覆盖 BIOS 默认温度中断模式。唯一可能的值为 0,它强制中断模式为 0。在此模式下,读取状态寄存器时会清除任何挂起的中断,但只要温度保持在滞后限制之上,就会重新生成中断。
请注意,覆盖 BIOS 默认值可能会导致一些不必要的副作用!
描述¶
VIA VT1211 Super-I/O 芯片包括完整的硬件监控功能。它可以监控 2 个专用的温度传感器输入(temp1 和 temp2)、1 个专用电压 (in5) 和 2 个风扇。此外,该芯片还实现了 5 个通用输入通道 (UCH1-5),这些通道可以单独编程为监控电压或温度。
该芯片还提供风扇速度的手动和自动控制(根据数据表)。该驱动程序仅支持自动控制,因为手动模式似乎无法按照数据表中的描述工作。实际上,我根本无法让手动模式工作!请注意,自动模式尚未经过很好的测试(由于我的 EPIA M10000 没有将风扇连接到 VT1211 的 PWM 输出 :-()。
下表显示了 vt1211 输入和 sysfs 节点之间的关系。
传感器 |
电压模式 |
温度模式 |
默认用途(来自数据表) |
---|---|---|---|
读数 1 |
temp1 |
英特尔热二极管 |
|
读数 3 |
temp2 |
内部热二极管 |
|
UCH1/读数 2 |
in0 |
temp3 |
NTC 型热敏电阻 |
UCH2 |
in1 |
temp4 |
+2.5V |
UCH3 |
in2 |
temp5 |
VccP(处理器核心) |
UCH4 |
in3 |
temp6 |
+5V |
UCH5 |
in4 |
temp7 |
+12V |
+3.3V |
in5 |
内部 VCC (+3.3V) |
电压监控¶
电压由 8 位 ADC 采样,LSB 为 ~10mV。因此,支持的输入范围为 0 到 2.60V。超出此范围的电压值需要外部缩放电阻。这种外部缩放需要通过 sensors.conf 中的计算行进行补偿,例如
计算 inx @*(1+R1/R2), @/(1+R1/R2)
根据 VIA 的建议,板级缩放电阻如下。当然,这完全取决于实际的板级实现 :-) 您必须找到自己主板的文档并相应地编辑 sensors.conf。
电压 |
R1 |
R2 |
分压 |
原始值 |
---|---|---|---|---|
+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 (内部) |
2K |
3.4K |
1.588 |
3300 mV [2] |
+3.3V (外部) |
6.8K |
10K |
1.68 |
1964 mV |
每个测量的电压都有一个相关的低限和高限,当越过这些限制时会触发警报。
温度监控¶
温度以毫摄氏度为单位报告。每个测量的温度都有一个高限,如果越过该限值,则会触发警报。每个温度都有一个相关的滞后值,温度必须降到该值以下,警报才会清除(这仅适用于中断模式 0)。如果 BIOS 没有自动执行此操作,则可以强制中断模式为 0。有关详细信息,请参阅“模块参数”部分。
除 temp2 外,所有温度通道都是外部的。Temp2 是 VT1211 内部热二极管,驱动程序对 temp2 进行所有缩放,并以毫摄氏度为单位返回温度。对于外部通道 temp1 和 temp3-temp7,缩放取决于板级实现,需要通过 sensors.conf 在用户空间中执行。
Temp1 是英特尔型热二极管,需要以下公式在 sysfs 读数和实际温度之间进行转换
计算 temp1 (@-偏移量)/增益, (@*增益)+偏移量
根据 VIA VT1211 BIOS 移植指南,应使用以下增益和偏移值
二极管类型 |
偏移量 |
增益 |
---|---|---|
英特尔 CPU |
88.638 65.000 |
0.9528 0.9686 [3] |
VIA C3 Ezra |
83.869 |
0.9528 |
VIA C3 Ezra-T |
73.869 |
0.9528 |
这是来自 lm_sensors 2.10.0 sensors.conf 文件的公式。我不知道它来自哪里或如何推导出来的,这里只是为了完整起见列出它。
Temp3-temp7 支持 NTC 热敏电阻。对于这些通道,驱动程序返回在 UCH1-UCH5 各个引脚处看到的电压。引脚处的电压 (Vpin) 由热敏电阻 (Rth) 和缩放电阻 (Rs) 组成的分压器形成
Vpin = 2200 * Rth / (Rs + Rth) (2200 is the ADC max limit of 2200 mV)
热敏电阻的方程如下(如果您想了解更多信息,请在 Google 上搜索)
Rth = Ro * exp(B * (1 / T - 1 / To)) (To is 298.15K (25C) and Ro is the
nominal resistance at 25C)
将以上两个方程混合,并假设 Rs = Ro 且 B = 3435,则得出 sensors.conf 的以下公式
compute tempx 1 / (1 / 298.15 - (` (2200 / @ - 1)) / 3435) - 273.15,
2200 / (1 + (^ (3435 / 298.15 - 3435 / (273.15 + @))))
风扇速度控制¶
VT1211 提供 2 个可编程的 PWM 输出,用于控制 2 个风扇的速度。向任意两个 pwm[1-2]_enable sysfs 节点写入 2 会将 PWM 控制器置于自动模式。只有一个控制器控制两个 PWM 输出,但可以单独启用和禁用每个 PWM 输出。
每个 PWM 都有 4 个相关的不同输出占空比:全速、高速、低速和关闭。全速和关闭在内部硬连线到 255 (100%) 和 0 (0%)。可以通过 pwm[1-2]_auto_point[2-3]_pwm 对高速和低速进行编程。每个 PWM 输出都可以与不同的热输入相关联,但是 - 这里有点奇怪 - 只有一组热阈值控制两个 PWM 输出的占空比。可以通过 pwm[1-2]_auto_point[1-4]_temp 访问热阈值。请注意,即使有 2 组,每组 4 个自动点,它们也会映射到 VT1211 中的同一寄存器,并且对一组进行编程就足够了(实际上,只有第一组 pwm1_auto_point[1-4]_temp 可写,第二组是只读的)。
PWM 自动点 |
PWM 输出占空比 |
---|---|
pwm[1-2]_auto_point4_pwm |
全速占空比(硬连线到 255) |
pwm[1-2]_auto_point3_pwm |
高速占空比 |
pwm[1-2]_auto_point2_pwm |
低速占空比 |
pwm[1-2]_auto_point1_pwm |
关闭占空比(硬连线到 0) |
温度自动点 |
热阈值 |
---|---|
pwm[1-2]_auto_point4_temp |
全速温度 |
pwm[1-2]_auto_point3_temp |
高速温度 |
pwm[1-2]_auto_point2_temp |
低速温度 |
pwm[1-2]_auto_point1_temp |
关闭温度 |
长话短说,控制器实现以下算法,以根据输入温度设置 PWM 输出占空比
热阈值 |
输出占空比(温度升高) |
输出占空比(温度下降) |
---|---|---|
全速占空比 |
全速占空比 |
|
全速温度 |
||
高速占空比 |
全速占空比 |
|
高速温度 |
||
低速占空比 |
高速占空比 |
|
低速温度 |
||
关闭占空比 |
低速占空比 |
|
关闭温度 |