内核驱动 vt1211

支持的芯片

  • VIA VT1211

    前缀:‘vt1211’

    扫描地址:无,地址从 Super-I/O 配置空间读取

    数据手册:由 VIA 应要求提供,并受 NDA 约束

作者: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

Intel 热二极管

读数 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 中的计算行来补偿此外部缩放,例如

compute 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 (int)

2K

3.4K

1.588

3300 mV [2]

+3.3V (ext)

6.8K

10K

1.68

1964 mV

每个测量的电压都有一个相关的低限和高限,当交叉时会触发警报。

温度监控

温度以千分之一摄氏度报告。每个测量的温度都有一个高限,如果交叉会触发警报。每个温度都有一个相关的迟滞值,温度必须降到该值以下才能清除警报(这仅适用于中断模式 0)。如果 BIOS 没有自动执行,则可以强制中断模式为 0。有关详细信息,请参阅“模块参数”部分。

除了 temp2 之外的所有温度通道都是外部的。Temp2 是 VT1211 内部热二极管,驱动程序执行 temp2 的所有缩放并以千分之一摄氏度为单位返回温度。对于外部通道 temp1 和 temp3-temp7,缩放取决于板实现,需要在用户空间中通过 sensors.conf 执行。

Temp1 是一种 Intel 型热二极管,需要以下公式来转换 sysfs 读数和实际温度

compute temp1 (@-Offset)/Gain, (@*Gain)+Offset

根据 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

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 个风扇的速度。将 2 写入任何两个 pwm[1-2]_enable sysfs 节点会将 PWM 控制器置于自动模式。只有一个控制器可以控制两个 PWM 输出,但每个 PWM 输出都可以单独启用和禁用。

每个 PWM 都有 4 个相关的不同输出占空比:full、high、low 和 off。Full 和 off 在内部硬连线到 255 (100%) 和 0 (0%)。High 和 low 可以通过 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 输出占空比

热阈值

输出占空比(温度升高)

输出占空比(温度下降)

全速占空比

全速占空比

全速温度

高速占空比

全速占空比

高速温度

低速占空比

高速占空比

低速温度

关闭占空比

低速占空比

关闭温度