主板温度、电压、风扇转速不来自任何驱动,而来自 CPU 之外的一颗 Super I/O。这篇文章给出它怎么被认出来、三条运行期通路,以及四族芯片的寄存器表与换算口径。
这颗芯片并不知道自己引脚上接的是什么。它只提供编号:温度通道 T1 到 T7、电压通道 VIN0 到 VIN14、风扇通道 FAN1 到 FAN6,每个编号对应一组固定的寄存器。
接什么,是主板布线决定的。同一颗 NCT6798D,在一张主板上 T1 可以接 CPU 附近的测温点,在另一张板上可以接供电区;同一路 VIN4,在这张板是 +12V,在另一张板是内存供电。所以“T1 是什么”这个问题,单看芯片型号回答不了,必须连同主板型号一起查。
这也解释了界面上一类名字的由来:当软件认出了芯片、但不知道板型时,只能退回芯片的默认通道名——SYSTIN、AUXTIN、System 2。看到这类名字,说明软件在这一步没有板型数据,不代表它读错了值。
Super I/O 挂在主板的低针脚数总线(LPC)上,没有设备名,也不出现在设备管理器里。想认出它,程序只能去敲几个固定的 I/O 口,问“这里有没有芯片、是哪一颗”。
问题在于怎么开口问,各家厂商的规矩不一样。同样的两个 I/O 口,Nuvoton 用一套字节序列进入“配置模式”,ITE 用另一套,SMSC 又是另一套。序列用错时,口上读回来的值是 0xFF——而 0xFF 恰好也是“这个口上什么都没有”的表现。
于是出现一类很难查的假象:机器上明明有芯片,软件却报“未检测到主板传感器”。它不是把型号认错了,而是根本没进到能问型号的状态,结果和有芯片、没芯片长得一模一样。这类软件通常只认自己那一套序列所属的厂商,换个牌子就读不到。
型号很多,但按“通道表是不是同一套”来分,只有四五个家族值得记住:
| 家族 | 常见型号 | 出现在哪 |
|---|---|---|
| NCT679x 系 | NCT6779D / 6791D / 6792D / 6793D / 6795D / 6796D / 6798D / 6797D / 6799D | 近十年的 Intel / AMD 消费级主板,最常见 |
| NCT610x 系 | NCT6102D / 6104D / 6106D | 入门主板、部分一体机 |
| NCT668x 系 | NCT6683D / 6686D / 6687D | 不少品牌整机主板 |
| IT87xx 系 | IT8613E / IT8620E / IT8688E / IT8792E 等 | 技嘉、华硕等品牌主板 |
| 其他 | Winbond W83627、Fintek F718xx、NCT6771F 等 | 老主板,多只认到型号 |
认出型号之后,还要拿到它的运行期窗口——一组能读温度、电压、风扇的地址。窗口的起点由芯片自己报告,不同主板上可以不一样。这个窗口是有边界的:程序只能在这个范围内取数,越过边界就会读回 0。这也是为什么某些工具在个别主板上会整组读数全空。
认出型号之后,还要找到它的运行期窗口在哪。同一颗芯片在不同主板上,这个窗口的位置可以不同;程序只能通过芯片自己报告的信息去定位它,不能写死。
芯片认出来只是第一步。真正读值要在“运行期窗口”里做,而这个窗口的协议分三套,长得像但不一样:
| 通路 | 特点 | 典型芯片 |
|---|---|---|
| banked(分页) | 寄存器编号被分成若干“页”,读之前要先切页,同一个编号在不同页下含义不同 | NCT677x / NCT679x / NCT610x |
| EC 空间 | 多一级“页选择”,且窗口有归属权,同一时刻只能有一个使用者 | NCT6683D / 6686D / 6687D |
| 平坦 | 没有分页,编号直接对应地址,最直白的一种 | ITE IT87xx 全系 |
banked 与 EC 空间在外形上只差一个页寄存器,但两者内部对“哪个位置是温度、哪个是电压”的划分完全不同。拿一套表去读另一条通路,每个字节都来自一个真实存在的寄存器,只是含义全错——这正是“数字看着正常、其实不对”最典型的来源。
EC 空间这条还有一个容易漏的点:这个窗口有归属权,同一时刻只能有一个使用者。如果厂商自己的服务正占着,程序要等、并在超时后夺回,用完再交还。没做这一步的工具,偶尔会读到别人读了一半的数据——表现出来就是“刷新一下数值就变了”。
这一族(NCT6779D 到 NCT6799D)共用同一套布局,是最常见的一族,也是很多资料里“主板监控”的默认印象。它的三个量各有一个容易被忽略的换算环节。
这一族的温度不是简单把一个字节当成度数。主寄存器只给出整数部分,而且需要先左移一位对齐;小数那半度藏在相邻另一个寄存器的一位里,要拼进来。少做这一步,结果就是两倍——40 度显示成 80 度。
这类错误特别难发现,因为 40 度和 80 度都在“合理范围”内。看到主板温度高得离谱又非常稳定,先怀疑换算口径,不要先怀疑主板。
这一族有 15 路电压采样,每一路读到的是一个很小的原始值,乘一个固定系数才得到引脚电压。关键在于:引脚上的 12V 轨实际只有 1V 左右,要靠主板上的分压电阻还原,而分压比例由主板设计决定,芯片手册里没有。所以同一颗芯片在不同板子上,同一路的换算系数可以是 ×2、×5、×12。
这就是“同一款软件在两台机器上显示 12.1V 和 9.9V”的真正原因:不是软件坏了,是它套了另一张板子的分压表。拿不到板型数据时,老实显示引脚电压并标注出来,比编一个“看着像 12V”的数字更负责。
电池电压那一路还有个使能开关:监测被关掉、或者机器上根本没装电池时,读到的就是 0。跳过这一步,界面会多出一行“0 V”的假数据。
风扇通道读到的是一个计数值,不是多少转。换算关系是转速 = 1 350 000 ÷ 计数——计数越小转得越快,所以它和温度、电压的方向是反的。
两个边界必须认:计数取到满量程表示这一路没有信号(风扇没插、或该通道未使能),不是“转速极低”;计数小到一定程度,算出来的转速已经超出可测范围,应当按无效处理。把这两个边界搞反,就会出现“风扇明明在转却显示 0”或者“显示几万转”。
NCT6102D / 6104D / 6106D 走的是同一条分页通路,读法上与上一族没有区别。正因为读法一样,这里最容易出事:顺手把上一节的表套过来,程序不会报错,只会给出错值。
| 项目 | NCT679x | NCT610x |
|---|---|---|
| 电压路数 | 15 路 | 9 路 |
| 温度对齐 | 主值要左移一位再拼半度位 | 主值不左移,另加半度位 |
| 风扇 | 计数,要除以 1 350 000 | 数值直接就是转速 |
| 电池电压使能 | 有独立一位 | 有,但在另一处 |
两处最容易踩的:
电压这边还有一个分压的陷阱。NCT610x 的 9 路里,有一半是片内分压——芯片内部已经做了二分压,读数要乘 2 才能还原真实电压;另一半是外部引脚,分压电阻在板上、手册不定义,只能按板型查,查不到就老实显示引脚电压并标注出来。拿别的板型的分压表硬套,会得出 9.9V 的 +12V——数字本身“像”,但已经不在 ATX 规格的 ±5% 之内,看到这种值先怀疑系数,不要先怀疑电源。
NCT6683D / 6686D / 6687D 在不少品牌整机主板上出现。它走 EC 空间通路,特点是有个使能前提:硬件监控本身、以及每一路电压通道,都得先被打开,否则读回来的温度与电压基本是一片 0。
这也解释了同一颗芯片为什么在不同软件上表现不同:有的工具把“先使能”当成初始化的一部分,一次做完;有的直接读,拿回来一片 0 就当成“该通道无数据”。HwDetect 的传感器页把这类前提放在接管芯片之前做完,任何一步不成就整组留空,而不是把 0 当成读到的温度摆出来。
不做这一步不是“读数偏低”,而是一片 0。而 0 恰好是“看起来正常”的值:风扇 0 转、电压 0 V、温度 0 度,很多界面会直接把它们隐藏掉,于是用户看到的是“这个软件不支持我的主板”——实际上芯片好好的,只是没人叫醒它。
它内部的分段方式也和其他族不同:温度、电压、风扇各占一大段,温度每两路之间还夹着一个存半度位的字节。同一套编号在这种布局下换个位置就是另一个量,套错表的结果依旧是“数字都挺合理”。
ITE 的芯片在消费级主板上很常见,但它和 Nuvoton 不是一套规矩。最典型的一条:进入配置模式的序列不同——Nuvoton 是两个字节,ITE 要多几步,换个 I/O 口进时收尾字节还得跟着换。用错口或用错序列都不会报错,只会读到 0xFF。
这个差异会造成一个很难查的假象:一台机器上明明有 ITE 的 Super I/O(别的工具能报出型号),但用 Nuvoton 的序列去问,两个配置口读回来的都是 0xFF——而 0xFF 正是“这个口上没有芯片”的表现。于是“有芯片但没认出来”和“压根没有芯片”在结果上完全一样,看上去就像这台机器没有 Super I/O。
顺带说明为什么这里的 0xFF 值得信:权限不足时驱动返回的是 0,不是 0xFF。读到 0xFF 说明端口确实被访问到了,只是没进配置模式,读的是总线空闲时的状态。
认出之后还要把芯片“激活”,否则读到的基本都是 0。另一条容易忽略的限制是窗口边界:驱动一般只放行芯片申报的那段地址,程序如果把偏移直接加在端口号上越出边界,读回的同样是 0——看起来像“这条通道没接传感器”,其实是自己的地址算错了。
还有一类芯片要特别小心:IT8792E / IT8795E / IT87952E / IT8790E 这几颗,Linux 内核驱动明确标注“不要进出配置模式”——这么做可能导致 LPC 访问出错,严重时死机。给这些型号做监测,宁可什么都不读,也不要冒险去敲门。
至于“IT8613E 到底有几路风扇”,不能只看芯片型号:风扇通道是否存在,取决于那几根引脚有没有被主板拿去当通用 IO 用。某几路测速引脚被复用成别的功能后,对应的风扇通道就不存在了。所以同一个型号在不同主板上,风扇通道数可以不同。
把上面几节合起来看,能读出错值的地方至少有四处:型号认错、通路选错、通道表拿错、分压系数拿错。它们的共同点是结果都很像真的——温度 60 度、电压 12.1V、风扇 1200 转,全都在合理范围内。
所以判断一个监测工具靠不靠谱,可以看它怎么处理“不确定”:
hwmon 驱动,以及 LibreHardwareMonitor(MPL-2.0)的公开实现;文中只写口径与判据,不复制任何代码。至于主板型号到通道含义的映射,不在这里——这也是为什么同一颗芯片的 T1 在不同主板上含义不同。
相关阅读:CPU 温度是怎么读出来的:DTS 偏移与 TjMax · 怎么看内存 SPD、时序和 XMP · 硬盘健康度怎么看:SMART 字段含义
温度、电压、风扇均为本地读取,需要管理员权限访问 I/O 端口。笔记本由 EC 接管的机型,能否读到取决于该机型的固件。