内核驱动 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 伏的值。

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 版本。一位用户报告了风扇偶尔停止的问题。

请注意,单独的蜂鸣位与其他芯片是反转的。驱动程序现在会处理此问题,因此用户空间应用程序不必知道它。

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

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

  • 修订版 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

来自 Winbond 技术支持的回复

>
> 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 是 Winbond 的 ID(WEC),这让我们认为华硕直接从 Winbond 获取了他们的 AS99127F rev.2。其他代码分别表示 ATT 和 DVC。ATT 可能代表华硕科技(Asustek something,尽管我认为这选择很糟糕),我不知道 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(rev.1 和 2 相同)
  • 传感器 1:寄存器 0x27

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

备注

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

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

  • 传感器 2:寄存器 0x13

风扇传感器

ASB100、AS99127F(rev.1 和 2 相同)
  • 3 个风扇,与 W83781D 相同

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

  • 风扇 1:寄存器 0x28,除数在寄存器 0xA1 上(位 4-5)

  • 风扇 2:寄存器 0x29,除数在寄存器 0xA1 上(位 6-7)

电压

这是 AS99127F rev.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 rev.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 rev.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

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

AS99127F revision 2 似乎在 0x59 和 0x5A 处有两个 PWM 寄存器,在 0x5B 处有一个温度传感器类型选择器(这基本上意味着当您与 Winbond 芯片进行比较时,它们交换了寄存器 0x59 和 0x5B)。该芯片的 Revision 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。

  • 关于 AS99127F rev.1 上 PWM 的其他信息,由 Hector Martin 提供

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

0x80
  • 似乎会在一段时间后(1-2 分钟)关闭风扇...可能是某种基于温度的自动风扇控制?嗯(Qfan?这个主板是老华硕的,它没有被宣传为 Qfan。也许是 BIOS 中放弃的 Qfan 的一些早期尝试)

0x81
  • 关闭

0x82
  • 比关闭稍微“开启”,但我的风扇没有移动。我可以听到电机在 pwm 过低时发出的高音调 PWM 声音。

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

0x84-0x8f
  • 全速

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

我的主板是华硕 A7V266-E。此行为类似于我在 Windows 下使用 speedfan 时的情况,其中 0-15% 会关闭,15-2x%(不记得确切的值)会达到 70%,而更高的值会达到全速。

  • 关于 AS99127F rev.1 上 PWM 的其他信息,来自 lm-sensors 票证 #2350

我对带有 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