内核驱动 w83781d

支持的芯片

作者

模块参数

  • init int

    (默认 1)

    使用 ‘init=0’ 以跳过芯片初始化。如果在加载模块时计算机崩溃,请尝试此操作。

  • reset int

    (默认 0) 驱动程序以前会在加载时重置芯片,但现在不再这样做了。使用 ‘reset=1’ 恢复旧行为。如果您需要这样做,请报告。

force_subclients=bus,caddr,saddr,saddr

这用于强制特定芯片子客户端的 i2c 地址。典型用法是 force_subclients=0,0x2d,0x4a,0x4b,将总线 0 上芯片 0x2d 的子客户端强制设置为 i2c 地址 0x4a 和 0x4b。此参数对某些泰安主板很有用。

描述

本驱动程序支持华邦 W83781D、W83782D、W83783S 芯片以及华硕 AS99127F 芯片。我们统称它们为 W8378* 芯片。

这些芯片之间存在相当大的差异,但它们足够相似,因此将它们整合到一个驱动程序中是合理的。华硕芯片类似于仅支持 I2C 的 W83782D。

芯片

#vin

#fanin

#pwm

#temp

wchipid

vendid

i2c

ISA

as99127f

7

3

0

3

0x31

0x12c3

as99127f rev.2 (type_name = as99127f)

0x31

0x5ca3

w83781d

7

3

0

3

0x10-1

0x5ca3

w83782d

9

3

2-4

3

0x30

0x5ca3

w83783s

5-6

3

2

1-2

0x40

0x5ca3

有时这些芯片的检测可能会失败,因为它们可能处于不允许干净访问的内部状态。如果您知道芯片的地址,请使用“force”参数;这会首先将它们置于更良好的状态。

W8378* 芯片实现了温度传感器(W83781D 和 W83782D 上有三个,W83783S 上有两个)、三个风扇转速传感器、电压传感器(W83781D 上有七个,W83782D 上有九个,W83783S 上有六个)、VID 线、带蜂鸣警告的报警以及一些杂项功能。

温度以摄氏度测量。始终有一个主温度传感器,以及一个(W83783S)或两个(W83781D 和 W83782D)其他传感器。当超过过温关机限制时,主传感器会触发一次报警;一旦低于滞后值,它会再次触发。通过将滞后值设置为 +127 摄氏度,可以获得更实用的行为;在这种情况下,当实际温度高于过温关机值时,会一直发出报警。驱动程序在初始化时将 temp1 的滞后值设置为 127。

对于其他温度传感器,当温度高于过温关机值时会触发报警;报警会持续直到温度低于滞后值。但在 W83781D 上,只有一个报警功能适用于另外两个传感器!温度保证在 -55 到 +125 度之间。主温度传感器的分辨率为 1 度;其他传感器的分辨率为 0.5 度。

风扇转速以 RPM(每分钟转数)报告。如果转速低于可编程限制,则会触发报警。风扇读数可以通过可编程分频器(W83781D 为 1, 2, 4 或 8;其他芯片为 1, 2, 4, 8, 16, 32, 64 或 128)进行除法,以提供更大的读数范围或更高的精度。并非所有 RPM 值都能准确表示,因此会进行一些舍入。当分频器为 2 时,最低可表示值约为 2600 RPM。

电压传感器(也称为 IN 传感器)以伏特报告其值。如果电压超出可编程的最小或最大限制,则会触发报警。请注意,在这种情况下,最小值始终意味着“最接近零”;这对于负电压测量很重要。所有电压输入都可以测量 0 到 4.08 伏特之间的电压,分辨率为 0.016 伏特。

VID 线编码核心电压值:即处理器应工作的电压水平。这由主板和/或处理器本身硬编码。这是一个以伏特为单位的值。当它未连接时,您通常会在此处发现 3.50 V 的值。

W83782D 和 W83783S 温度转换机制支持多种类型的温度探头。您可以在传感器文件中编程所谓的 beta 值。“1”是 PII/Celeron 二极管,“2”是 TN3904 晶体管,而 3435 是默认热敏电阻值。其他值(尚)不受支持。

除了上述报警外,芯片上还有一个 CHAS 报警,当您的计算机机箱打开时会触发。

当报警触发时,您的计算机扬声器会发出蜂鸣声进行警告。可以全局启用所有蜂鸣声,或仅启用某些报警的蜂鸣声。

单个报警和蜂鸣位

0x000001

in0

0x000002

in1

0x000004

in2

0x000008

in3

0x000010

temp1

0x000020

temp2 (W83781D 上为 +temp3)

0x000040

fan1

0x000080

fan2

0x000100

in4

0x000200

in5

0x000400

in6

0x000800

fan3

0x001000

机箱

0x002000

temp3 (仅 W83782D)

0x010000

in7 (仅 W83782D)

0x020000

in8 (仅 W83782D)

如果报警触发,它将保持触发状态,直到硬件寄存器至少被读取一次。这意味着报警的原因可能已经消失!请注意,在当前实现中,只要读取任何数据(除非距离上次更新不到 1.5 秒),所有硬件寄存器都会被读取。这意味着您很容易错过仅触发一次的报警。

芯片每 1.5 秒更新一次值;更频繁地读取它们不会造成损害,但会返回“旧”值。

AS99127F 问题

AS99127F 的支持是在没有数据手册的情况下开发的。在大多数情况下,它被视为 w83781d(尽管 AS99127F 的修订版 2 更像是 w83782d)。此支持在数据手册发布之前将处于 BETA 状态。一位用户报告风扇偶尔停止的问题。

请注意,AS99127F 的独立蜂鸣位与其他芯片是反向的。驱动程序现在已处理了这个问题,因此用户空间应用程序无需了解此差异。

已知问题
  • 二极管/热敏电阻设置问题(是否支持?)

  • 一位用户报告在服务器高负载下风扇停止。

  • 修订版 2 似乎有 2 个 PWM 寄存器,但我们不知道如何处理它们。更多详细信息如下。

除非我们获得数据手册,否则这些问题将无法修复。如果您遇到问题,请游说华硕发布数据手册。不幸的是,其他人也曾尝试但未成功。请不要给我们发邮件要求更好的 as99127f 支持。在没有数据手册的情况下,我们已尽力而为。请不要向作者或传感器组发邮件索取数据手册或询问如何说服华硕的建议。我们无能为力。

注意事项

783s 没有 in1,因此 in[2-6] 与 781d/782d 兼容。

783s 引脚可编程用于 -5V 或 temp1;默认为 -5V,驱动程序中没有控制,因此 temp1 不起作用。

782d 和 783s 的数据手册在 pwm1 和 pwm2 的定义上存在差异。我们选择遵循 782d。

782d 和 783s 引脚可编程用于风扇 3 输入或 pwm2 输出;默认为风扇 3 输入。如果启用 pwm2(通过 echo 255 1 > pwm2),则风扇 3 将报告 0。

782d 对 ISA 有 pwm1-2,对 i2c 有 pwm1-4。(pwm3-4 与 ISA 引脚共享)

数据手册更新

  • PWM 时钟寄存器
    • 000: 主时钟 / 512

    • 001: 主时钟 / 1024

    • 010: 主时钟 / 2048

    • 011: 主时钟 / 4096

    • 100: 主时钟 / 8192

华邦技术支持的回复

>
> 1) In the W83781D data sheet section 7.2 last paragraph, it talks about
>    reprogramming the R-T table if the Beta of the thermistor is not
>    3435K. The R-T table is described briefly in section 8.20.
>    What formulas do I use to program a new R-T table for a given Beta?
>

We are sorry that the calculation for R-T table value is
confidential. If you have another Beta value of thermistor, we can help
to calculate the R-T table for you. But you should give us real R-T
Table which can be gotten by thermistor vendor. Therefore we will calculate
them and obtain 32-byte data, and you can fill the 32-byte data to the
register in Bank0.CR51 of W83781D.


> 2) In the W83782D data sheet, it mentions that pins 38, 39, and 40 are
>    programmable to be either thermistor or Pentium II diode inputs.
>    How do I program them for diode inputs? I can't find any register
>    to program these to be diode inputs.

You may program Bank0 CR[5Dh] and CR[59h] registers.

=============================== =============== ============== ============
      CR[5Dh]                 bit 1(VTIN1)    bit 2(VTIN2)   bit 3(VTIN3)

              thermistor                0              0              0
      diode                     1              1              1


(error) CR[59h]               bit 4(VTIN1)    bit 2(VTIN2)   bit 3(VTIN3)
(right) CR[59h]               bit 4(VTIN1)    bit 5(VTIN2)   bit 6(VTIN3)

      PII thermal diode         1              1              1
      2N3904  diode             0              0              0
=============================== =============== ============== ============

华硕克隆芯片

我们没有华硕克隆芯片(AS99127F 和 ASB100 Bach)的数据手册。以下是 Alex Van Kaam 提供的一些关于如何检测这些芯片以及如何读取其值的非常有用的信息。他还提供了关于另一个华硕芯片组 Mozart-2(我们尚未支持)的建议。感谢 Alex!

我重新措辞了部分内容并添加了个人评论。

检测

AS99127F rev.1, AS99127F rev.2 和 ASB100:- I2C 地址范围:0x29 - 0x2F - 如果寄存器 0x58 的值为 0x31,则我们有一个华硕芯片(ASB100 或 AS99127F)- 具体是哪一个取决于寄存器 0x4F(制造商 ID)

  • 0x06 或 0x94:ASB100

  • 0x12 或 0xC3:AS99127F rev.1

  • 0x5C 或 0xA3:AS99127F rev.2

请注意,0x5CA3 是华邦的 ID (WEC),这让我们认为华硕直接从华邦获取 AS99127F rev.2。其他代码分别代表 ATT 和 DVC。ATT 可能代表 Asustek 某个东西(尽管恕我直言,这是一个非常糟糕的选择),我不知道 DVC 代表什么。也许这些代码根本就不是那样解码的。

Mozart-2:- I2C 地址:0x77 - 如果寄存器 0x58 的值为 0x56 或 0x10,则我们有一个 Mozart-2 - Mozart 有 3 种类型

  • 0x58=0x56, 0x4E=0x94, 0x4F=0x36: 华硕 ASM58 Mozart-2

  • 0x58=0x56, 0x4E=0x94, 0x4F=0x06: 华硕 AS2K129R Mozart-2

  • 0x58=0x10, 0x4E=0x5C, 0x4F=0xA3: 华硕 ??? Mozart-2

您可以完全相同的方式处理这 3 种类型 :)

温度传感器

ASB100
  • 传感器 1:寄存器 0x27

  • 传感器 2 和 3 是 SMBus 上的 2 个 LM75

  • 传感器 4:寄存器 0x17

备注

我注意到在 Intel 主板上,传感器 2 用于 CPU,而传感器 4 被忽略/卡住;在 AMD 主板上,传感器 4 是 CPU,而传感器 2 要么被忽略,要么是插槽温度。

AS99127F (修订版 1 和 2 均如此)
  • 传感器 1:寄存器 0x27

  • 传感器 2 和 3 是 SMBus 上的 2 个 LM75

备注

寄存器 0x5b 被怀疑是温度类型选择器。位 1 控制 temp1,位 3 控制 temp2,位 5 控制 temp3。

Mozart-2
  • 传感器 1:寄存器 0x27

  • 传感器 2:寄存器 0x13

风扇传感器

ASB100, AS99127F (修订版 1 和 2 均如此)
  • 3 个风扇,与 W83781D 相同

Mozart-2
  • 仅 2 个风扇,1350000/RPM/div

  • 风扇 1:寄存器 0x28,分频器在寄存器 0xA1 (位 4-5)

  • 风扇 2:寄存器 0x29,分频器在寄存器 0xA1 (位 6-7)

电压

这是 AS99127F 修订版 1 和 2 之间存在差异的地方。

备注

这种差异类似于 W83781D 和 W83782D 之间的差异。

ASB100
  • in0=r(0x20)*0.016

  • in1=r(0x21)*0.016

  • in2=r(0x22)*0.016

  • in3=r(0x23)*0.016*1.68

  • in4=r(0x24)*0.016*3.8

  • in5=r(0x25)*(-0.016)*3.97

  • in6=r(0x26)*(-0.016)*1.666

AS99127F 修订版 1
  • in0=r(0x20)*0.016

  • in1=r(0x21)*0.016

  • in2=r(0x22)*0.016

  • in3=r(0x23)*0.016*1.68

  • in4=r(0x24)*0.016*3.8

  • in5=r(0x25)*(-0.016)*3.97

  • in6=r(0x26)*(-0.016)*1.503

AS99127F 修订版 2
  • in0=r(0x20)*0.016

  • in1=r(0x21)*0.016

  • in2=r(0x22)*0.016

  • in3=r(0x23)*0.016*1.68

  • in4=r(0x24)*0.016*3.8

  • in5=(r(0x25)*0.016-3.6)*5.14+3.6

  • in6=(r(0x26)*0.016-3.6)*3.14+3.6

Mozart-2
  • in0=r(0x20)*0.016

  • in1=255

  • in2=r(0x22)*0.016

  • in3=r(0x23)*0.016*1.68

  • in4=r(0x24)*0.016*4

  • in5=255

  • in6=255

PWM

  • Jean Delvare 于 2004-04-09 提供的关于 AS99127F PWM 的额外信息(可能也适用于其他华硕芯片)

AS99127F 修订版 2 似乎在 0x59 和 0x5A 有两个 PWM 寄存器,并在 0x5B 有一个温度传感器类型选择器(这基本上意味着与华邦芯片相比,它们交换了 0x59 和 0x5B 寄存器)。该芯片的修订版 1 也在 0x5B 有温度传感器类型选择器,但 PWM 寄存器没有效果。

我们不清楚温度传感器类型选择器确切的工作方式。看起来位 1-0 用于 temp1,位 3-2 用于 temp2,位 5-4 用于 temp3,尽管每次可能只有最高有效位起作用。到目前为止,除了 0 以外的值总是导致读数错误。

PWM 寄存器似乎分为两部分:位 7 是模式选择器,而其他位似乎定义了一个值或阈值。

当位 7 清零时,位 6-0 似乎保存着一个阈值。如果值低于给定限制,风扇以低速运行。如果值高于限制,风扇以全速运行。我们不清楚这个限制代表什么。请注意,这种模式似乎存在一些惯性,速度变化可能需要一些时间才能触发。此外,还怀疑存在滞后机制,因为递增然后递减地遍历所有值会导致略微不同的限制。

当位 7 设置时,位 3-0 似乎保存着一个阈值,而位 6-4 则不重要。如果值低于给定限制,风扇以全速运行;如果高于限制,则以低速运行(所以在某种程度上与另一种模式相反)。同样,我们不清楚这个限制应该代表什么。

一个值得注意的现象是,风扇似乎只有两到三种不同的速度(过渡状态除外),而不是通常 PWM 所提供的整个范围。

总而言之,您可以向 PWM 寄存器写入 0x00 或 0x8F 使风扇低速运行,写入 0x7F 或 0x80 使其全速运行。

如果您能弄清楚它应该如何工作,请联系我们。只要我们不知道更多,w83781d 驱动程序就根本不处理 AS99127F 芯片上的 PWM。

  • Hector Martin 提供的关于 AS99127F rev.1 PWM 的额外信息

我一直在摆弄(臭名昭著的)0x59 寄存器,发现以下值可以作为一种粗略的 PWM 形式工作:

0x80
  • 似乎在一段时间(1-2 分钟)后关闭风扇… 可能是某种基于温度的自动风扇控制?嗯(Qfan?这块主板是旧华硕,并未宣传为 Qfan。也许是 Qfan 的某个测试版预尝试,后来在 BIOS 中被放弃了)

0x81
  • 关闭

0x82
  • 比关闭稍微“开启”一点,但我的风扇不动。我能听到电机在 PWM 过低时发出的高频 PWM 声音。

0x83
  • 现在它们会转动了。估计速度约为 70% 左右。

0x84-0x8f
  • 全速开启

改变高位半字节似乎没有多大作用,除了必须设置高位(0x80)才能使 PWM 工作,否则当前的 PWM 似乎不会改变。

我的主板是华硕 A7V266-E。这种行为与我在 Windows 下使用 speedfan 得到的结果类似,其中 0-15% 是关闭,15-2x%(不记得确切值)是 70%,更高则是全速开启。

  • 来自 lm-sensors 工单 #2350 的关于 AS99127F rev.1 PWM 的额外信息

我在带有 AS99127F (版本 1) 的华硕 P3B-F 主板上进行了一些实验。

我确认在此主板上,0x59 寄存器控制 CPU_Fan 接头,0x5a 寄存器控制 PWR_Fan。

为了减少对特定风扇的依赖,我使用数字示波器在未连接风扇的情况下进行了测量。我发现 P3B-F 实际上在风扇接头中心引脚输出可变直流电压,看起来此主板上的 PWM 经过了滤波。

以下是一些测量结果

0x80

20 mV

0x81

20 mV

0x82

232 mV

0x83

1.2 V

0x84

2.31 V

0x85

3.44 V

0x86

4.62 V

0x87

5.81 V

0x88

7.01 V

9x89

8.22 V

0x8a

9.42 V

0x8b

10.6 V

0x8c

11.9 V

0x8d

12.4 V

0x8e

12.4 V

0x8f

12.4 V