【问题标题】:Access Laptop Embedded Fan Controller programmatically?以编程方式访问笔记本电脑嵌入式风扇控制器?
【发布时间】:2012-02-21 21:12:31
【问题描述】:

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

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

【问题讨论】:

标签: c windows acpi


【解决方案1】:

如果您使用 RWEverything 来简单地更改物理内存地址的位,您始终可以使用 MmMapIoSpace 或任何其他允许您对物理内存进行 RW 访问的 Windows api 函数映射物理内存以处理本地内存空间。在映射您需要访问的空间部分后,您可以直接对其进行寻址和更改。

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

【讨论】:

    【解决方案2】:

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

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

    您过去可以通过将 07h 写入 I/O 端口 2Eh(索引寄存器)来选择 SuperIO 逻辑设备,这会导致南桥产生 LPC 周期,从而导致 SIO 选择 LDN 寄存器(在通用空间:偏移 00h–30h),然后将 LDN 写入端口 2Fh(数据寄存器)以生成 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 空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2015-01-14
      • 2020-12-18
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多