以编程方式访问笔记本电脑上的CPU风扇? (视窗)

时间:2009-01-27 21:49:20

标签: c++ windows acpi

是否有一种Windows标准方法可以从C / C ++中执行“启动风扇”,“降低速度”等操作?

我怀疑它可能是ACPI,但我是一个虚弱的凡人,无法阅读那种文件。

编辑:例如Windows 7允许您选择电源计划选项,例如“被动冷却”(仅当事情变热?)与“主动冷却”(保持CPU主动冷却?)。操作系统似乎确实有一种控制风扇的方法。

5 个答案:

答案 0 :(得分:22)

我目前正致力于一个项目,除其他外,控制电脑迷。基本上,风扇由计算机的superIO芯片控制。我们使用端口映射IO直接访问芯片,从那里我们可以访问逻辑风扇设备。使用端口映射IO需要代码在内核模式下运行,但是Windows不提供通用端口IO的任何驱动程序(有充分的理由,因为它是一个非常强大的工具),所以我们编写了自己的驱动程序,并使用它。

如果你想沿着这条路走下去,你基本上需要两个领域的知识:驱动程序开发以及如何访问和解释superIO芯片信息。当我们开始这个项目时,我们对这两个方面都没有任何了解,所以它一直在通过浏览,阅读和最终的方式进行学习。为了获得知识,我们通过查看这些链接得到了特别的帮助:

  1. WDK,即Windows驱动程序工具包。你需要这个来编译你为windows编写的任何驱动程序,它带来了很多示例驱动程序的源代码,包括一般端口映射​​IO的驱动程序,称为portio。
  2. WinIO包含C中驱动程序的源代码,C中的dll以编程方式安装和加载该驱动程序,以及一些用于GUI的C#代码,用于加载DLL并读取/写入端口。该驱动程序与portio中的驱动程序非常相似。
  3. lm-sensors是一个Linux项目,除其他外,它会检测你的superIO芯片。 / prog / detect / sensors-detect是执行检测的perl程序,我们花了一些时间浏览代码,看看如何与superIO芯片接口。
  4. 当我们浏览lm-sensors代码时,拥有像RapidDriverRW-everything这样的工具非常好,因为它们允许我们模拟一系列传感器检测。后者功能更强大,在显示IO空间方面非常有用,而前者可以更方便地访问某些操作,这些操作可以更好地映射到传感器中的操作 - 检测(读/写字节到端口)
  5. 最后,您需要找到superIO芯片的数据表。从我看到的示例中,每个芯片的环境控制器提供类似的功能(r / w风扇速度,读取温度,读取芯片电压),但是为了获得此功能,您必须写入哪些寄存器。 。 This地方已经拥有了所有数据表,到目前为止我们需要这些数据表。

答案 1 :(得分:3)

如果你想要一些真正快速降低风扇的地方,你知道事情不会过热,那就是speedfan计划。弄清楚如何在早期版本中配置它以在计算机启动时自动将风扇降低到50%是非常痛苦的,我的第一种方法是简单地对其进行字节修补以启动我以较低速度运行的唯一的超级管理风扇。较新的版本仍然有点困难,但它是可行的 - 有一个图形滑块系统看起来像音频均衡器,除了x轴是临时和y是风扇速度。你将它们一个一个地拖下来。在您弄清楚如何获得所需风扇的手动控制之后,这是下一步。

有一个用C#监控硬件(如风扇)的项目: http://code.google.com/p/open-hardware-monitor/

我没有广泛地看过它,但源代码和WinRing0.sys atleast的使用给人的印象是,如果你知道你有什么风扇控制器并有数据表,它应该是可修改的,也可以设置值而不是只是得到他们。我不知道什么工具适合(除了内核调试器)来查看Speedfan所做的事情,如果你更喜欢窥探并模仿speedfan而不是查看数据表并尝试解决问题。

答案 2 :(得分:2)

是的,这将是ACPI,据我所知,Windows并没有对用户空间提供太多/任何控制。因此,您必须开始使用驱动程序,这在Windows上几乎是不可能的。

那就是说,google reveals对于特定的硬件,有一些开源的Windows库...所以根据你的硬件,你可以找到一些东西。

答案 3 :(得分:0)

ACPI可能允许也可能不允许您调整风扇设置。某些BIOS实现可能不允许该控制 - 它们可能会强制控制,具体取决于BIOS / CMOS设置。对于良好的用例,BIOS监控(甚至是自定义)不够用,可能会很难。我遇到过BIOS控制确实不足的情况,但不适用于所有可能的主板平台。

答案 4 :(得分:0)

WIndows Management Instrumentation库(WMI)确实提供了Win32_Fan Class甚至是SetSpeed方法。唉,文档说这没有实现,所以我想这不是很有帮助。但是你可以通过设置电源状态来控制事物。