我一直在尝试控制我的 Lenovo Yoga 910-13IKB 笔记本电脑(Windows 10)的风扇以避免热节流(我已经降低了 CPU 和 GPU 的电压)。为此,我需要找到一种方法来修改控制笔记本电脑嵌入式控制器上的风扇的特定寄存器。
使用 env1 = Environment(VAR='foo')
def changeVal(env, newval):
env['VAL'] = newval
env1.AddMethod(changeVal, 'ChangeVal')
env2 = env1.Clone(VAR='bar')
env3 = env2.Clone()
env3['VAR'] = 'baz'
env4 = env3.Clone()
env4.ChangeVal('qux')
print(env1['VAR'], env2['VAR'], env3['VAR'], env4['VAR'])
我打开了我计算机上的所有 ACPI 表,在提取 DSDT 表后,我发现除了 1 个似乎与风扇有关的寄存器,“CFAN”它是 1 位长,更改它不会'没有任何影响。默认情况下似乎是关闭的。
在此之后,我开始调查并进入其中一个 SSDT,在那里我发现了这一点:
def changeVal(env, newval):
env['VAR'] = newval
#. ^^^--- You have VAL here, but check for VAR later.
在我发现这个之后还有几行:
RWEverything
如您所见,风扇占空比似乎是寄存器 Name(OSD1, Package(21)
{
0x04, "CPU Fan Duty Cycle", "RAW", 0x04, "CPU Fan #1 Speed", "RPM",
0x03, "Skin Temp 0", "RAW", 0x03, "Thermistor 1 ", "RAW", 0x03, "Thermistor 2 ",
"RAW", 0x03, "Thermistor 3 ", "RAW", 0x03, "Thermistor 4 ", "RAW"
})
Name(OSD2, Package(24)
{
0x04, "CPU Fan Duty Cycle", "RAW", 0x04, "CPU Fan #1 Speed", "RPM",
0x03, "Skin Temp 0", "RAW", 0x03, "Thermistor 1 ", "RAW", 0x03, "Thermistor 2 ",
"RAW", 0x03, "Thermistor 3 ", "RAW", 0x03, "Thermistor 4 ", "RAW",
0x03, "Thermistor 5 ", "RAW"
})
,风扇速度是 Method(OSDD, 0, Serialized)
{
If(LEqual(\_SB.PCI0.LPCB.H_EC.ECAV, One))
{
If(LEqual(TSDB, One))
{
Name(OSD2, Package(8)
{
0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000,
0x80000000, 0x80000000
})
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.PENV)), Index(OSD2, Zero))
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.CFSP)), Index(OSD2, One))
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TSR3)), Index(OSD2, 0x02))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER1)), 0x02), Index(OSD2, 0x03))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER2)), 0x02), Index(OSD2, 0x04))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER3)), 0x02), Index(OSD2, 0x05))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER4)), 0x02), Index(OSD2, 0x06))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER5)), 0x02), Index(OSD2, 0x07))
Return(OSD2)
}
Name(OSD1, Package(7)
{
0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000,
0x80000000
})
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.PENV)), Index(OSD1, Zero))
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.CFSP)), Index(OSD1, One))
Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TSR3)), Index(OSD1, 0x02))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER1)), 0x02), Index(OSD1, 0x03))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER2)), 0x02), Index(OSD1, 0x04))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER3)), 0x02), Index(OSD1, 0x05))
Store(ShiftLeft(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.TER4)), 0x02), Index(OSD1, 0x06))
Return(OSD1)
}
Return(Package(0){})
}
。但是,我在每个表中查找了“PENV”和“CFSP”这两个词,但找不到数字地址。 (任何地方都没有定义)
因此,使用 \_SB.PCI0.LPCB.H_EC.PENV
我能够识别出几个与风扇同步变化的寄存器。
(尝试发布收银机的图片但没有足够的声誉)
我尝试修改所有这些寄存器,但没有成功。
也许有另一种方法可以通过 ACPI 或 Microsoft ACPI-Compliant Embedded Controller 的第三方驱动程序来修改 \_SB.PCI0.LPCB.H_EC.CFSP
和 RWEverything
?
请随时提出任何问题,我们将不胜感激。