在笔记本电脑上编程访问CPU风扇?(Windows)

21

是否有Windows标准的方法,可以使用C/C++进行"启动风扇"、"降低速度"等操作?

我怀疑这可能是ACPI,但我是个脆弱的凡人,无法阅读那种文档。

编辑:例如,在Windows 7中,您可以在电源计划选项中选择“被动冷却”(只有在温度升高时?)与“主动冷却”(保持CPU主动制冷)。似乎操作系统确实有一种通用的方式来控制风扇。

5个回答

27

我目前在从事一个项目,其中之一是控制计算机风扇。基本上,风扇由计算机的超级IO芯片控制。我们使用端口映射IO直接访问该芯片,然后可以访问逻辑风扇设备。使用端口映射IO需要在内核模式下运行代码,但Windows没有提供通用端口IO的驱动程序(这是有很好的理由的,因为它是一个非常强大的工具),所以我们编写了自己的驱动程序,并使用它。

如果您想走这条路线,您基本上需要两个方面的知识:驱动程序开发以及如何访问和解释超级IO芯片信息。当我们开始这个项目时,在这两个领域中我们什么都不知道,所以通过浏览、阅读和最终实践来学习。为了获取这些知识,我们特别受益于查看以下链接:

  1. WDK,即Windows驱动程序开发工具包。你需要它来编译任何你为Windows编写的驱动程序,它带有许多示例驱动程序源代码,包括一个用于通用端口映射IO的驱动程序,称为portio。
  2. WinIO具有C语言驱动程序的源代码,一个用于编程安装和加载该驱动程序的dll,以及一些用于GUI的C#代码,用于加载dll并读取/写入端口。这个驱动程序与portio中的驱动程序非常相似。
  3. lm-sensors是一个Linux项目,其中包括检测超级IO芯片的功能。/prog/detect/sensors-detect是这个perl程序,用于检测,我们花了一些时间浏览代码,以了解如何与超级IO芯片进行接口。
  • 当我们阅读lm-sensors代码时,使用像RapidDriverRW-everything这样的工具非常有帮助,因为它们允许我们模拟运行sensors-detect。后者更加强大,在可视化IO空间方面非常有帮助,而前者则提供了更容易访问与sensors-detect中操作映射更好的一些操作(向端口读写字节)。
  • 最后,您需要找到超级IO芯片的数据手册。从我看到的示例来看,每个芯片的环境控制器都提供类似的功能(读写风扇速度,读取温度,读取芯片电压),但在要写入以获得此功能的寄存器方面略有不同。这个地方迄今为止提供了我们所需的所有数据手册。

  • 1
    ACPI 在这里起什么作用?理论上,可以修补 DSDT,使用 ASL 编译器进行编译,加载修补后的表格,然后风扇速度将由该修补逻辑控制。另一个选择是使用 nhc.exe,它具有一种插件模型,允许开发人员编写代码来控制 ACPI 管理的对象。 - Cheeso
    3
    ACPI有IO操作列表,用于执行热管理的基本组成部分:读取温度、设置风扇速度。Boris的回答很普遍,超级IO硬件不是即插即用的,必须向操作系统提供必要的信息,这就是ACPI的作用。值得一提的是,9年后笔记本电脑系统中的超级IO已经消失了,被嵌入式控制器(EC)所取代。EC具有自己的固件,并使用PECI接口读取CPU的DTS。EC的PWM硬件只能由EC访问,如果不通过设置CPU节流策略,操作系统将不再控制CPU风扇。 - Margaret Bloom

    4
    如果您想快速降低风扇转速,以确保不会过热,可以使用SpeedFan程序。在早期版本中,配置自动将风扇降至50%以便在计算机启动时执行是非常痛苦的,我的第一种方法是通过字节补丁来启动我所拥有的唯一超级IO管理的风扇以较低的速度。新版本仍然有些棘手,但是可以做到-有一个图形滑块系统,看起来像音频均衡器,除了x轴是温度,y是风扇速度。您可以逐个拖动它们向下。在弄清楚要控制哪个风扇的手动控制后,这是下一步。
    有一个使用C#监视硬件(如风扇)的项目: http://code.google.com/p/open-hardware-monitor/

    我没有进行深入的研究,但源代码和WinRing0.sys的使用至少给人留下了这样的印象:如果您知道自己的风扇控制器,并拥有数据表,它应该是可修改的,可以设置值而不仅仅获取它们。我不知道有哪些工具(除了内核调试器)适合查看Speedfan所做的事情,如果您更喜欢窥探并模仿Speedfan,而不是查看数据表并尝试各种方法。


    2
    是的,这可能涉及到ACPI,据我所知,Windows不会在用户空间中提供太多或任何对此的控制。因此,你需要开始修改驱动程序,在Windows上几乎是不可能的。
    话虽如此,根据你的硬件设备,谷歌搜索结果显示有一些针对特定硬件的开源Windows库... 因此,你可能可以找到相关内容。

    0

    ACPI 可能允许您调整风扇设置,但某些 BIOS 实现可能不允许该控制,因为它们可能会根据 BIOS/CMOS 设置强制控制。在一个好的使用案例中,BIOS 控制(即使是定制的)也可能不足够。我曾经遇到过 BIOS 控制确实不足够的情况,但并非所有可能的主板平台都是如此。


    0

    Windows Management Instrumentation库(WMI)提供了Win32_Fan Class,甚至还有一个SetSpeed方法。然而,文档中说这个方法没有被实现,所以我猜它并没有什么帮助。但是你可以通过设置电源状态来控制风扇。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接