Помогите мне расшифровать этот код исходного кода ACPI?
Я использовал эту программу.NET, чтобы сделать двоичный дамп реестра Windows в HKLM/Hardware/ACPI/DSDT
,
Затем, запустив Microsoft ASL Compiler, я могу получить этот исходный язык ACPI:
Scope(\_TZ_)
{
Name(TBSE, 0xaac)
Name(CRT0, 0x0)
Name(PSV0, 0x0)
ThermalZone(TZS0)
{
Method(_TMP, 0x0, NotSerialized)
{
If(\ECON)
{
Store(\_SB_.PCI0.LPC0.EC0_.THS0, Local0)
Store(\_SB_.PCI0.LPC0.EC0_.KCSS, Local1)
Store(\_SB_.PCI0.LPC0.EC0_.KOSD, Local2)
}
Else
{
Store(RBEC(0x92), Local0)
And(Local0, 0x1, Local1)
And(Local0, 0x8, Local2)
Store(RBEC(0xa8), Local0)
}
If(Local1)
{
Add(PSV0, 0x1, Local0)
}
If(Local2)
{
If(LNot(LGreater(Local0, CRT0)))
{
Add(CRT0, 0x2, Local0)
}
}
Return(C2K_(Local0))
}
Method(_HOT, 0x0, NotSerialized)
{
If(LEqual(OSYS, 0x7d6))
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd1), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x78, Local0)
}
Store(Local0, CRT0)
Return(C2K_(Local0))
}
Else
{
Return(C2K_(0x78))
}
}
Method(_CRT, 0x0, NotSerialized)
{
If(LNot(LEqual(OSYS, 0x7d6)))
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSC0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd1), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x78, Local0)
}
Store(Local0, CRT0)
Return(C2K_(Local0))
}
Else
{
Return(C2K_(0x78))
}
}
Name(_PSL, Package(0x1)
{
\_PR_.CPU0
})
Method(_PSV, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x20, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0)
}
Else
{
WBEC(0x1, 0x20)
Store(RBEC(0xd0), Local0)
}
If(LOr(LNot(LLess(Local0, 0x80)), LLess(Local0, 0x1e)))
{
Store(0x5a, Local0)
}
Store(Local0, PSV0)
Return(C2K_(Local0))
}
Name(_TC1, 0x4)
Name(_TC2, 0x3)
Name(_TSP, 0x96)
Method(FMAX, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP3, Local0)
}
Else
{
WBEC(0x1, 0x40)
Store(RBEC(0xd6), Local0)
}
Return(FSTL(Local0))
}
Method(FMIN, 0x0, NotSerialized)
{
If(\ECON)
{
Store(0x40, \_SB_.PCI0.LPC0.EC0_.TIID)
Store(\_SB_.PCI0.LPC0.EC0_.TSP0, Local0)
}
Else
{
WBEC(0x1, 0x40)
Store(RBEC(0xd0), Local0)
}
Return(FSTL(Local0))
}
Method(FRSP, 0x0, NotSerialized)
{
If(\ECON)
{
Store(\_SB_.PCI0.LPC0.EC0_.FSR1, Local0)
}
Else
{
Store(RBEC(0x95), Local0)
}
Return(FSTL(Local0))
}
Method(FSSP, 0x1, NotSerialized)
{
If(LEqual(Arg0, 0x0))
{
If(\ECON)
{
Store(0x1, \_SB_.PCI0.LPC0.EC0_.FSHC)
Sleep(0x64)
Store(0xff, \_SB_.PCI0.LPC0.EC0_.FSW1)
}
Else
{
Store(RBEC(0x93), Local0)
Or(Local0, 0x10, Local0)
WBEC(0x93, Local0)
Sleep(0x64)
WBEC(0x94, 0xff)
}
}
Else
{
If(\ECON)
{
Store(0x0, \_SB_.PCI0.LPC0.EC0_.FSHC)
}
Else
{
WBEC(0x93, 0x0)
}
}
}
Method(FSTL, 0x1, NotSerialized)
{
If(LOr(LEqual(Arg0, 0x0), LEqual(Arg0, 0xff)))
{
Store(Zero, Local1)
}
Else
{
Divide(0x78000, Arg0, Local0, Local1)
}
Return(Local1)
}
}
....
Я понимаю только кусочки. TZ относится к области, посвященной тепловым зонам (я думаю).
Из чтения спецификации ACPI я вижу, что _HOT и _CRT являются объектами OSPM, относящимися к температурным порогам.
Объект _HOT объявляет критическую температуру, при которой OSPM может выбрать переход системы в спящее состояние S4, если это поддерживается; Объект _CRT объявляет критическую температуру, при которой OSPM должен выполнить критическое отключение.
Итак, я полагаю, что отрывок DSDT как-то связан с манипулированием скоростью вращения вентилятора ноутбука в зависимости от измеренной температуры в тепловой зоне 0. Исходя из этого, я предполагаю, что FSTL
в вышесказанном есть Fan-Set-Level или что-то подобное, и FMAX
а также FMIN
Fan-Max-Speed и -Min-Speed, соответственно. Я думаю C2K
является функцией преобразования в Кельвины Кроме того, я просто догадываюсь на основе догадок.
Изменить: при дальнейшем рассмотрении, _PSL
это пассивный список (в соответствии со спецификацией ACPI), который возвращает список устройств пассивного контроля температуры. В тех случаях, когда вентиляторы считаются "активным" контролем температуры, примером "пассивного" временного контроля может быть снижение напряжения или скорости на процессоре. Так что я не уверен, что этот раздел вообще контролирует вентилятор. Он может быть посвящен исключительно пассивному временному контролю.
То, что я пытаюсь сделать, это изменить скорость вращения вентилятора ноутбука, которая используется для различных температур. В некоторых DSDT отображение между температурой и скоростью вращения вентилятора находится в аккуратной маленькой таблице, и изменение отображения - это просто вопрос изменения нескольких чисел. Не похоже, что в этом ASL-файле есть такая таблица, так что я думаю, что должна быть некоторая программная логика, выполняющая сопоставление.
Кто-нибудь может помочь расшифровать это для меня?
Что я действительно пытаюсь сделать, так это заставить вентилятор расслабиться на ноутбуке HP G60-244dx. Он работает слишком громко, даже когда процессор простаивает, и... если он похож на мой предыдущий ноутбук HP nc8430, скорость вентилятора установлена излишне высокой. Можно снизить скорость вращения вентилятора, но сохранить температуру процессора на прежнем уровне.
Я думаю, что для того, чтобы изменить скорость вращения вентилятора, мне нужно пропатчить DSDT, и поэтому я хочу расшифровать вышесказанное.
Большое спасибо.
возможно связано:
Установка поля ACPI в Linux
1 ответ
Наткнулся на это при попытке такого же процесса на моем HP dm1-3100ev. Прямой настройки скорости вентилятора нет, она должна быть рассчитана в коде. Ближайшая находка - это что-то вроде настроек FMIN и FMAX, настроенных на 20 и 56 соответственно (не похоже ли это на предельные значения температуры для минимальной и максимальной скоростей вращения вентиляторов?) Однако изменение этих параметров не сработало (возможно, HP Coolsense имеет приоритетное значение).
Я дам вам знать, если мне удастся что-нибудь найти!
Изменить: я был не прав, FMIN и FMAX указать минимальную и максимальную скорости вентилятора: 2000 и 5600, соответственно. К сожалению, их изменение не работает.