Управление вентилятором ноутбука через встроенный контроллер или ACPI
Я пытался управлять вентилятором моего ноутбука Lenovo Yoga 910-13IKB (Windows 10), чтобы избежать перегрева (я уже понизил напряжение процессора и графического процессора). Для этого мне нужно найти способ изменить определенные регистры, которые управляют вентилятором на встроенном контроллере моего ноутбука.
С помощью я открыл все таблицы ACPI на своем компьютере, после извлечения таблицы DSDT я не нашел ничего, кроме 1 регистра, который, казалось, был связан с вентилятором, «CFAN» имеет длину 1 бит, и его изменение не имеет никакого эффекта. Вроде выключено по умолчанию.
После этого я начал расследование и попал в один из SSDT, где нашел это:
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», но не смог найти числовой адрес. (нигде нет определения)
Итак, используя
RWEverything
Мне удалось идентифицировать пару регистров, которые менялись синхронно с вентилятором.
(Пытался опубликовать изображение регистров, но репутации не хватило)
Я безуспешно пытался изменить все эти регистры.
Может быть, есть другой способ изменить
\_SB.PCI0.LPCB.H_EC.PENV
а также
\_SB.PCI0.LPCB.H_EC.CFSP
через ACPI или сторонний драйвер для Microsoft ACPI-совместимого встроенного контроллера?
Не стесняйтесь задавать любые вопросы, и любая помощь будет принята с благодарностью.