如何以编程方式访问笔记本电脑嵌入式风扇控制器?

20

我想访问我的(Windows)笔记本电脑的嵌入式控制器以控制风扇速度。目前,我正在使用 RW Everything 手动操作-如何访问嵌入式控制器例如使用 C 语言?感谢任何提示!

请注意:我知道可以从命令行使用 RW Everything,但每秒调用一次以读取某些寄存器并不那么好...


5
看看这个网址:https://dev59.com/tHRB5IYBdhLWcg3w3K4J,似乎是一个不错的起点。 - David Pointer
5
谢谢David。遗憾的是在Windows上操作比较复杂,在Linux上就很简单。我猜我应该在我的笔记本电脑上安装Linux :D - stefan.at.kotlin
1
可能是如何在Vista中使用C++控制PC风扇速度?的重复问题。 - Clifford
请问您需要控制风扇的原因是什么? - LastStar007
@SopalajodeArrierez 在谷歌上搜索 "Acer 风扇控制",会有一个叫这个名字的工具,还有一些文档资料。不幸的是我已经没有了,但应该还在网上某处可以找到。 - stefan.at.kotlin
显示剩余3条评论
2个回答

1
以编程为例,您需要创建一个内核模式驱动程序,使用MmMapIoSpace并处理IRP_MJ_CONTROL主函数下的IOCTL,然后调用StartServiceManager、CreateService和StartService,并使用DeviceIoControl发送IOCTL来执行操作,从而操纵底层物理内存/IO空间/MSR。参见:https://dev59.com/rljUa4cB1Zd3GeqPS5qA#40449498。您不能再编程控制风扇。请注意Margaret的回答:

值得注意的是,9年后,笔记本系统中的SuperIO已被替换为EC。EC具有其固件,并使用PECI接口读取CPU的DTS。 EC的PWM硬件仅可从EC访问,如果未设置CPU节流策略,则操作系统无法再控制CPU FAN。

以前可以通过向I/O端口2Eh(索引寄存器)写入07h来选择SuperIO逻辑设备,这会导致南桥生成LPC周期,从而使SIO选择LDN寄存器(在通用空间中的偏移量为07h:偏移量00h-30h),然后将LDN写入端口2Fh(数据寄存器)以生成LPC周期,从而使SIO选择该LDN。这将导致在端口处映射LDN配置空间的偏移量为30h–FFh,然后可以使用索引访问并读/写数据寄存器。 PCH上的LPC桥中的一个位用于选择是公开端口2F/2E还是4F/4E。
使用 EC 后,寄存器分为主机视图和 EC 视图。所有 PWM 和 PECI 寄存器不再是逻辑设备,它们的寄存器仅映射到板载 EC CPU 的 MMIO 空间中,只剩下一些通用寄存器在常规 IO 空间中对主机可见。一些 LDN 在它们自己的空间中暴露 IO 基址寄存器(偏移量在 30h-FFh),允许额外的寄存器映射。EC 固件使用 PECI 总线读取 CPU 的 DTS,并在其 MMIO 空间的已知寄存器偏移处相应地调整风扇速度。

1
如果您正在使用RWEverything来简单地更改物理内存地址上的位,您可以始终使用MmMapIoSpace或任何其他Windows API函数将物理内存映射到进程本地内存空间,从而获得对物理内存的RW访问权限。映射所需访问权限的部分空间后,您可以直接寻址和修改它。
我只在Windows上使用过这种方法来写入并口,但我已经在Linux上的其他项目中使用了类似的解决方案。

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