以编程方式访问Laptop Embedded Fan Controller?

时间:2012-02-21 21:12:32

标签: c windows acpi

我想访问我的(windows)笔记本电脑的嵌入式控制器来控制风扇速度。目前我正在使用RW Everything手动执行此操作 - 如何访问嵌入式控制器,例如用C?谢谢你的提示!

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

2 个答案:

答案 0 :(得分:1)

如果您使用RWEverything来简单地更改物理内存地址的位,您可以使用MmMapIoSpace或任何其他Windows api函数来映射物理内存以处理本地内存空间,这些函数可以让您访问物理内存。映射您需要访问的空间部分后,您可以直接寻址和更改它。

我只使用过这种方法写入windows上的并行端口,但是我已经在linux中为其他项目使用了类似的解决方案。

答案 1 :(得分:1)

以编程方式,您需要创建一个内核模式驱动程序,该驱动程序使用MmMapIoSpace并处理IRP_MJ_CONTROL主要功能上的IOCTL,然后在其上调用StartServiceManager,CreateService和StartService,然后使用DeviceIoControl发送IOCTL以执行操作操作基础物理内存的任务/ IO空间/ MSR。请参阅:https://stackoverflow.com/a/40449498/7194773。您无法再对风扇进行编程。注意玛格丽特的答案:

值得注意的是,9 y之后,SuperIO在笔记本电脑系统中消失了,由EC取代了。 EC具有其固件,并使用PECI接口读取CPU的DTS。 EC的PWM硬件只能从EC进行访问,如果不能通过设置CPU节流策略来控制操作系统,CPU将不再控制CPU风扇。

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