内核驱动 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

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 输出占空比

热阈值

输出占空比(温度升高)

输出占空比(温度下降)

全速占空比

全速占空比

全速温度

高速占空比

全速占空比

高速温度

低速占空比

高速占空比

低速温度

关闭占空比

低速占空比

关闭温度