【问题标题】:how to bind thermal temperature sensor with emc2103 fan如何将热温度传感器与emc2103风扇绑定
【发布时间】:2026-01-24 14:35:01
【问题描述】:

如何在 Linux 中将外部温度传感器与风扇 emc2103 绑定。由于 emc2103 有自己的温度传感器,用于控制风扇速度。但我想根据 CPU 温度控制风扇速度。如何用这个 emc2103 风扇构建这个 CPU 温度传感器

【问题讨论】:

  • @askingquestions:如果您发现之前的一些问题缺少一些细节,那么将这些细节添加到previous question(通过编辑)。不要创建关于相同问题的新问题帖子。
  • 这是不同的问题。如果你看到 emc2103 代码,它不使用热框架。所以我的问题是如何将这个 emc2103 风扇与我的温度传感器绑定

标签: linux-kernel linux-device-driver lm-sensors


【解决方案1】:

这完全取决于BIOS如何配置emc2103芯片。

查看 emc2103 内核模块source code,应该可以通过在/sys/class/hwmon/hwmonX 中写入文件fan1_target 来修改风扇速度,其中X 是分配给模块的数字。它是i2c(在我的示例中为hwmon2)的符号链接。

ll /sys/class/hwmon/
total 0
lrwxrwxrwx 1 root root 0 Apr  5 16:20 hwmon0 -> ../../devices/virtual/thermal/thermal_zone0/hwmon0
lrwxrwxrwx 1 root root 0 Apr  5 16:20 hwmon1 -> ../../devices/pci0000:00/0000:00:13.0/0000:01:00.0/hwmon/hwmon1
lrwxrwxrwx 1 root root 0 Apr  5 16:20 hwmon2 -> ../../devices/pci0000:00/0000:00:1f.1/i2c-1/1-002e/hwmon/hwmon2
lrwxrwxrwx 1 root root 0 Apr  5 16:20 hwmon3 -> ../../devices/pci0000

但至少在我的 Odroid H2 机器上,emc2103 芯片由 BIOS 控制,写入fan1_target 文件没有任何效果。如果我在 BIOS 中禁用风扇控制,它可能会切断风扇的电源,因为我无法使其运行。

但由于 emc2103 芯片是 i2c 设备,它可以通过i2cgeti2cset 命令手动配置(Debian 中的i2c-tools 包)。首先你需要加载i2c_dev内核模块,然后确定芯片所在的i2c总线(你可以使用i2cdetect命令)。 emc2103 芯片位于地址 0x2E。在 Odroid H2 的情况下,它与 DRAM SPD 内存芯片 (dmesg|grep SPD) 在同一总线上,但是在每次启动时,它被分配不同的总线号。

您可以查看 emc2103 datasheet(和内核模块源代码)来查看要读取和写入的寄存器。

同样,对于 Odroid H2,禁用由 BIOS 启用的查找表就足够了,然后我可以通过写入 fan1_target 来控制风扇速度。要禁用它,您需要使用命令将值 0x00 写入寄存器 0x​​50:

i2cset -y bus 0x2E 0x50 0x00

其中 bus 是设备所在的 i2c 总线号。这将在加载 emc2103 内核模块时失败。所以要么卸载它,要么添加-f参数强制它。

在我的情况下,我希望风扇根据 HDD 温度运行,因此我将尝试使用 LUT 表作为 BIOS 设置,但为 Temp3 添加阈值,我将其设置为“Pushed Temperature”,这可以使用 i2c 设置。这样我就可以自动评估电路板温度(由芯片本身测量)和硬盘温度值。

另一种可能性是使用hddfancontrolfan2go 之类的东西来使用hwmon /sys 文件控制风扇速度。

【讨论】: