uGuru 数据手册¶
首先,我所了解的关于 uGuru 的信息并非基于 Abit 提供的任何帮助、提示或数据手册。我所获得的关于 uGuru 的数据是通过我薄弱的“逆向工程”知识组装起来的。并且,只是为了记录,你可能已经注意到 uGuru 不是像 Abit 声称的那样由他们开发的芯片。它实际上只是由 Winbond(华邦)制造的微处理器(uC)(W83L950D)。而且,阅读这个特定 uC 的手册或向 Windbond 发送邮件寻求帮助都不会提供任何关于 uGuru 的有用数据,因为是 uC 内部的程序在响应调用。
Olle Sandberg <ollebull@gmail.com>, 2005-05-25
原始版本由 Olle Sandberg 完成,他完成了最初的逆向工程的艰巨任务。这个版本几乎完全重写以提高清晰度,并扩展了写入支持和更多数据银行的信息,写入支持再次由 Olle 逆向工程完成,额外的数据库由我逆向工程完成。我衷心感谢 Olle,没有他的努力,这份文档和 Linux 驱动程序都无法编写。
注意:由于缺乏规范,这里只描述了 uGuru 的传感器部分,而不是 CPU / RAM / 等电压和频率控制。
Hans de Goede <j.w.r.degoede@hhs.nl>, 28-01-2006
检测¶
据所知,uGuru 总是位于并使用 (ISA) I/O 端口 0xE0 和 0xE4,因此我们不必扫描任何端口范围,只需检查这两个端口为了检测而持有的值。我们将 0xE0 称为 CMD(命令端口),0xE4 称为 DATA,因为 Abit 用这些名称来指代它们。
如果 DATA 持有 0x00 或 0x08,并且 CMD 持有 0x00 或 0xAC,则可能存在 uGuru。我们需要检查数据端口的两个不同的值,因为在重新启动后 uGuru 将在此处持有 0x00,但如果驱动程序被移除并在稍后再次连接,则数据端口将持有 0x08,稍后将详细介绍。
在对 Linux 内核驱动程序进行更广泛的测试后,出现了一些 uGuru 变体,它们在 CMD 端口上将持有 0x00 而不是 0xAC,因此我们也必须测试 CMD 的两个不同的值。在这些 uGuru 上,DATA 最初将持有 0x09,并且只有在先读取 CMD 后才会持有 0x08,因此必须先读取 CMD!
为了真正确定是否存在 uGuru,应该进行一次或多次寄存器集的测试读取。
读取/写入¶
寻址¶
uGuru 具有多个不同的寻址级别。我们将第一个寻址级别称为 bank。一个 bank 保存一个或多个传感器的数据。一个 bank 中一个传感器的数据是一个或多个字节大小。
对于给定的 bank,字节数是固定的,你应该始终读取或写入那么多字节,读取/写入更多将失败,写入少于给定 bank 的字节数的结果是不确定的。
请参阅下面的所有已知 bank 地址、该 bank 中传感器的数量、每个传感器的数据字节数以及这些字节的内容/含义。
尽管此文档和内核驱动程序都保留了 bank 内寻址的传感器术语,但这并非 100% 正确,例如在 bank 0x24 中,bank 内的寻址选择的是 PWM 输出而不是传感器。
请注意,某些 bank 同时具有读取地址和写入地址,这就是 uGuru 确定正在进行读取还是写入 bank 的方式,因此在读取时应始终使用读取地址,在写入时应使用写入地址。写入地址总是比读取地址大一 (1)。
uGuru 就绪¶
在您可以从 uGuru 读取或写入数据之前,您必须首先将 uGuru 置于“就绪”模式。
要将 uGuru 置于就绪模式,首先向 DATA 写入 0x00,然后等待 DATA 持有 0x09,DATA 应在 250 个读取周期内读取 0x09。
接下来必须读取 CMD,并且应该持有 0xAC,通常 CMD 在第一次读取时会持有 0xAC,但有时需要一段时间才能使 CMD 持有 0xAC,因此必须读取多次(最多 50 次)。
读取 CMD 后,DATA 应持有 0x08,这意味着 uGuru 已准备好接收输入。如上所述,DATA 通常在第一次读取时会持有 0x08,但并非总是如此。可以跳过此步骤,但如果 uGuru 尚未在 DATA 上报告 0x08,并且您继续写入 bank 地址,则会发生什么情况是不确定的。
向 uGuru 发送 bank 和传感器地址¶
首先,uGuru 必须处于如上所述的“就绪”模式,DATA 应持有 0x08,表示 uGuru 需要输入,在这种情况下是 bank 地址。
接下来,将 bank 地址写入 DATA。在写入 bank 地址后,等待 DATA 再次持有 0x08,表示它需要/已准备好接收更多输入(最多 250 次读取)。
一旦 DATA 再次持有 0x08,将传感器地址写入 CMD。
读取¶
首先,按照上述说明发送 bank 和传感器地址。然后,对于您要读取的每个数据字节,等待 DATA 持有 0x01,表示 uGuru 已准备好被读取(最多 250 次读取),一旦 DATA 持有 0x01,从 CMD 读取该字节。
一旦所有字节都被读取,数据将持有 0x09,但没有理由对此进行测试。请注意,字节数取决于 bank 地址,请参阅上面和下面。
在完成成功的读取后,建议将 uGuru 放回就绪模式,以便它为下一次读取/写入周期做好准备。这样,如果您的程序/驱动程序被卸载并在稍后重新加载,则上述检测算法仍将有效。
写入¶
首先,按照上述说明发送 bank 和传感器地址。然后,对于您要写入的每个数据字节,等待 DATA 持有 0x00,表示 uGuru 已准备好被写入(最多 250 次读取),一旦 DATA 持有 0x00,将该字节写入 CMD。
一旦所有字节都被写入,等待 DATA 持有 0x01(最多 250 次读取),不要问为什么它是这样工作的。
一旦 DATA 持有 0x01,读取 CMD,它现在应该持有 0xAC。
在完成成功的写入后,建议将 uGuru 放回就绪模式,以便它为下一次读取/写入周期做好准备。这样,如果您的程序/驱动程序被卸载并在稍后重新加载,则上述检测算法仍将有效。
陷阱¶
在对 Linux 内核驱动程序进行更广泛的测试后,出现了一些 uGuru 变体,它们在写入 bank 地址后,不会在 250 次读取内使 DATA 持有 0x08。对于这些版本,这种情况经常发生,使用更大的超时时间没有帮助,它们只会离线 1 到 2 秒,进行一些内部校准或其他操作。您的代码应该准备好处理这种情况,并且在这种特定情况下,如果没有响应,只需休眠一段时间,然后重试。
地址映射¶
Bank 0x20 报警 (R)¶
此 bank 包含 0 个传感器,即忽略传感器地址(但必须写入),只需使用 0 即可。Bank 0x20 包含 3 个字节
- 字节 0
此字节保存传感器 Bank1 的传感器 0-7 的报警标志,其中位 0 对应于传感器 0,1 对应于 1,依此类推。
- 字节 1
此字节保存传感器 Bank1 的传感器 8-15 的报警标志,其中位 0 对应于传感器 8,1 对应于 9,依此类推。
- 字节 2
此字节保存传感器 Bank2 的传感器 0-5 的报警标志,其中位 0 对应于传感器 0,1 对应于 1,依此类推。
Bank 0x21 传感器 Bank1 值/读数 (R)¶
此 bank 包含 16 个传感器,对于每个传感器,它包含 1 个字节。到目前为止,已知所有主板上都可使用以下传感器
传感器 0 CPU 温度
传感器 1 系统温度
传感器 3 CPU 核心电压
传感器 4 DDR 电压
传感器 10 DDR Vtt 电压
传感器 15 PWM 温度
- 字节 0
这个字节保存着来自传感器的读数。 Bank1 中的传感器既可以是电压传感器也可以是温度传感器,这取决于主板的具体设计。不过,uGuru 似乎知道(通过编程得知)连接的是哪种传感器,请参阅传感器 Bank1 设置说明。
电压传感器使用线性刻度,读数 0 对应 0 伏特,读数 255 对应 3494 毫伏。然而,用于更高电压的传感器通过分压电路连接。目前已知使用的分压电路导致的范围是:0-4361mV、0-6248mV 或 0-14510mV。3.3 伏电源使用 0-4361mV 范围,5 伏电源使用 0-6248mV 范围,12 伏电源使用 0-14510mV 范围。
温度传感器也使用线性刻度,读数 0 对应 0 摄氏度,读数 255 对应 255 摄氏度。
Bank 0x22 传感器 Bank1 设置 (R) 和 Bank 0x23 传感器 Bank1 设置 (W)¶
这些 Bank 包含 16 个传感器,每个传感器包含 3 个字节。每组 3 个字节包含 Bank 0x21 中具有相同传感器地址的传感器的设置。
- 字节 0
所选传感器的报警行为。1 表示启用所描述的行为。
- 位 0
如果测量的温度超过警告阈值则发出警报 (读/写) [1]
- 位 1
如果测量的电压超过最大阈值则发出警报 (读/写) [2]
- 位 2
如果测量的电压低于最小阈值则发出警报 (读/写) [2]
- 位 3
如果报警则发出蜂鸣声 (读/写)
- 位 4
如果报警原因是测量的温度超过警告阈值则为 1 (只读)
- 位 5
如果报警原因是测量的电压超过最大阈值则为 1 (只读)
- 位 6
如果报警原因是测量的电压低于最小阈值则为 1 (只读)
- 位 7
电压传感器:如果报警持续超过 4 秒则关机 (读/写)
温度传感器:如果温度超过关机阈值则关机 (读/写)
- 字节 1
温度传感器:警告阈值(刻度与 Bank 0x21 相同)
电压传感器:最小阈值(刻度与 Bank 0x21 相同)
- 字节 2
温度传感器:关机阈值(刻度与 Bank 0x21 相同)
电压传感器:最大阈值(刻度与 Bank 0x21 相同)
Bank 0x24 风扇的 PWM 输出 (R) 和 Bank 0x25 风扇的 PWM 输出 (W)¶
- 这些 Bank 包含 3 个“传感器”,每个传感器包含 5 个字节。
传感器 0 通常控制 CPU 风扇
传感器 1 通常控制 NB(或单芯片的芯片组)风扇
传感器 2 通常控制系统风扇
- 字节 0
标志 0x80 用于启用控制,禁用时风扇以 100% 的速度运行。低半字节(温度)传感器地址位于 Bank 0x21 中,用于控制。
- 字节 1
0-255 = 0-12v(线性),指定当低于低温阈值温度(在字节 3 中指定)时,风扇将旋转的电压。
- 字节 2
0-255 = 0-12v(线性),指定当高于高温阈值温度(在字节 4 中指定)时,风扇将旋转的电压。
- 字节 3
低温阈值温度(刻度与 Bank 0x21 相同)
- 字节 4
高温阈值温度(刻度与 Bank 0x21 相同)
Bank 0x26 传感器 Bank2 值/读数 (R)¶
此 Bank 包含 6 个传感器(据我所知),每个传感器包含 1 个字节。
- 到目前为止,已知所有主板上都提供以下传感器
传感器 0:CPU 风扇转速
传感器 1:NB(或单芯片的芯片组)风扇转速
传感器 2:SYS 风扇转速
- 字节 0
这个字节保存着来自传感器的读数。0-255 = 0-15300(线性)
Bank 0x27 传感器 Bank2 设置 (R) 和 Bank 0x28 传感器 Bank2 设置 (W)¶
这些 Bank 包含 6 个传感器(据我所知),每个传感器包含 2 个字节。
- 字节 0
所选传感器的报警行为。1 表示启用所描述的行为。
- 位 0
如果测量的转速低于最小阈值则发出警报 (读/写)
- 位 3
如果报警则发出蜂鸣声 (读/写)
- 位 7
如果报警持续超过 4 秒则关机 (读/写)
- 字节 1
最小阈值(刻度与 Bank 0x26 相同)
给冒险家的警告¶
提醒那些想尝试并看看是否可以找出电压/时钟编程的人,我尝试使用用于传感器 Bank(0x20-0x28)的读取代码来读取 Bank 0-0x30,结果导致电压的_永久性_重新编程,幸运的是,我配置了传感器部分,使其在任何超出规格的电压下都会关闭我的系统,这可能保护了我的计算机(重新启动后,我设法立即进入 BIOS 并重新加载默认值)。这可能意味着非传感器部分的读/写周期与传感器部分不同。