背景
我的 Thunderobot 911ME 笔记本在 Linux 下风扇转速太低,散热效果不理想。本文记录了我研究并解决这个问题的完整过程。
环境信息
- 笔记本型号: THUNDEROBOT 911ME
- 主板型号: NH58DXQ-H (Clevo OEM)
- 系统: Debian 13 (Trixie)
- 内核: 6.12.74+deb13+1-amd64
初步尝试:fancontrol
首先尝试了 Linux 下常用的风扇控制工具 fancontrol。
安装 lm-sensors
sudo apt install lm-sensors fancontrol
运行传感器检测
sudo sensors-detect
检测结果:
- 检测到 Intel digital thermal sensor (coretemp 驱动)
- 未检测到风扇控制芯片
- 没有 PWM 接口暴露给用户空间
问题
运行 sensors 可以看到温度数据,但 /sys/class/hwmon/ 下没有任何 pwm* 或 fan*_input 接口。这说明:
- 主板的风扇控制由嵌入式控制器 (EC) 管理
- Linux 无法通过标准的 PWM 接口控制风扇
fancontrol无法使用
尝试 NBFC (NoteBook FanControl)
NBFC 是专门为笔记本设计的风扇控制工具,支持通过 EC 寄存器控制风扇。
安装 NBFC
# 下载 Debian 包
wget https://github.com/nbfc-linux/nbfc-linux/releases/download/0.4.1/debian-trixie-nbfc-linux_0.4.1_amd64.deb
# 安装
sudo apt install ./debian-trixie-nbfc-linux_0.4.1_amd64.deb
更新配置
sudo nbfc update
问题
运行配置推荐:
sudo nbfc config --recommend
结果:没有找到适合的配置文件。
NBFC 的配置库中没有 Thunderobot 或 NH58DXQ-H 的配置,需要自己研究。
深入研究:分析 ACPI DSDT
既然没有现成的配置,那就自己分析固件。
导出 DSDT
sudo nbfc acpi-dump dsl > dsdt.dsl
分析 EC 寄存器
sudo nbfc acpi-dump ec-registers
发现的寄存器:
FCMD(0xF8) - 功能命令寄存器FDAT(0xF9) - 功能数据寄存器FBUF(0xFA) - 功能缓冲寄存器
搜索风扇相关代码
在 DSDT 中搜索关键词:
grep -i "fan\|fctl" dsdt.dsl
发现关键信息:
FANQ寄存器 - 可能是风扇状态FCMD = 0xD7- 执行风扇控制命令
分析 FCMD 命令
查看 DSDT 中 0xD7 命令的使用:
If ((Local2 == Zero))
{
^^PCI0.LPCB.EC.FDAT = 0x02
^^PCI0.LPCB.EC.FCMD = 0xD7
}
If ((Local2 == One))
{
^^PCI0.LPCB.EC.FDAT = 0x10
^^PCI0.LPCB.EC.FCMD = 0xD7
}
If ((Local2 == 0x02))
{
^^PCI0.LPCB.EC.FDAT = 0x08
^^PCI0.LPCB.EC.FCMD = 0xD7
}
这揭示了风扇控制的机制:
- 向
FDAT(0xF9) 写入模式值 - 向
FCMD(0xF8) 写入0xD7执行命令
FDAT 值含义
根据 DSDT 分析:
0x02- 静音/低速模式0x08- 平衡模式0x10- 高性能模式
实现风扇控制
使用 ec_probe 工具
# 设置高性能模式
sudo ec_probe -e dev_port write 0xF9 0x10
sudo ec_probe -e dev_port write 0xF8 0xD7
# 设置平衡模式
sudo ec_probe -e dev_port write 0xF9 0x08
sudo ec_probe -e dev_port write 0xF8 0xD7
# 设置静音模式
sudo ec_probe -e dev_port write 0xF9 0x02
sudo ec_probe -e dev_port write 0xF8 0xD7
注意 :需要使用 -e dev_port 参数,默认的 ec_sys 接口写入会失败。
创建控制脚本
为了方便使用,创建了一个简单的控制脚本:
#!/bin/bash
# Thunderobot 911ME 风扇控制脚本
usage() {
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " -l, --low 静音模式 (FDAT=0x02)"
echo " -b, --balanced 平衡模式 (FDAT=0x08)"
echo " -p, --perf 高性能模式 (FDAT=0x10)"
echo " -s, --set VAL 自定义 FDAT 值 (1-255)"
echo " -h, --help 显示帮助信息"
}
set_fan() {
local fdat=$1
ec_probe -e dev_port write 0xF9 "$fdat"
ec_probe -e dev_port write 0xF8 0xD7
echo "风扇模式已设置: FDAT=$fdat"
}
case "$1" in
-l|--low) set_fan 0x02 ;;
-b|--balanced) set_fan 0x08 ;;
-p|--perf) set_fan 0x10 ;;
-s|--set) set_fan "$2" ;;
-h|--help|"") usage ;;
esac
安装脚本
sudo cp fun.sh /usr/local/bin/fun
使用示例
# 查看帮助
fun -h
# 设置高性能模式
fun -p
# 设置平衡模式
fun -b
# 设置静音模式
fun -l
开机自动设置
如果需要开机自动设置风扇模式,可以创建 systemd 服务:
sudo tee /etc/systemd/system/fan-control.service << 'EOF'
[Unit]
Description=Fan Control Service
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/fun -p
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable fan-control.service
总结
研究过程
- 尝试标准方案 - fancontrol 失败,因为没有 PWM 接口
- 尝试 NBFC - 没有现成配置,需要自己研究
- 分析 DSDT - 找到 EC 控制风扇的方法
- 实现控制 - 通过 ec_probe 写入 EC 寄存器
关键发现
- Thunderobot 911ME (Clevo NH58DXQ-H) 的风扇由 EC 控制
- 控制寄存器:
FDAT (0xF9)+FCMD (0xD7) - 三种预设模式:静音 (0x02)、平衡 (0x08)、高性能 (0x10)
经验教训
- 笔记本风扇控制往往需要访问 EC,不能依赖标准 PWM 接口
- DSDT 分析是了解硬件控制方法的重要手段
- NBFC 是很好的工具,但可能需要自己创建配置
- 使用
ec_probe -e dev_port而非默认的ec_sys