我想访问我的(Windows)笔记本电脑的嵌入式控制器来控制风扇速度。目前我正在使用RW Everything手动执行此操作- 我如何访问嵌入式控制器,例如使用 C?感谢您的任何提示!
请注意:我知道可以从命令行使用 RW Everything,但是每秒调用它来读取一些寄存器并不是那么好......
我想访问我的(Windows)笔记本电脑的嵌入式控制器来控制风扇速度。目前我正在使用RW Everything手动执行此操作- 我如何访问嵌入式控制器,例如使用 C?感谢您的任何提示!
请注意:我知道可以从命令行使用 RW Everything,但是每秒调用它来读取一些寄存器并不是那么好......
如果您使用 RWEverything 来简单地更改物理内存地址的位,您始终可以使用 MmMapIoSpace 或任何其他允许您对物理内存进行 RW 访问的 Windows api 函数将物理内存映射到处理本地内存空间。在映射您需要访问的空间部分后,您可以直接对其进行寻址和更改。
我只使用这种方法写入 Windows 上的并行端口,但我在 linux 中的其他项目中使用了类似的解决方案。
以编程方式,您需要创建一个使用 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 硬件只能从 EC 访问,如果不通过设置 CPU 节流策略,操作系统将不再控制 CPU 风扇。
您过去可以通过将 07h 写入 I/O 端口 2Eh(索引寄存器)来选择 SuperIO 逻辑设备,这会导致南桥生成 LPC 周期,从而导致 SIO 选择 LDN 寄存器(在通用空间中的偏移量 07h 处:偏移 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空间。