Помогите мне расшифровать этот код языка ACPI? - PullRequest
6 голосов
/ 30 ноября 2010

Я использовал эту программу .NET , чтобы сделать двоичный дамп реестра Windows на HKLM/Hardware/ACPI/DSDT.

Затем, запустив Microsoft ASL Compiler , я могу получить ACPI Source Language :

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 Spec я вижу, что _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 Ответ

0 голосов
/ 17 апреля 2011

наткнулся на это при попытке такого же процесса на моем HP dm1-3100ev.Прямой настройки скорости вентилятора нет, она должна быть рассчитана в коде.Ближайшая находка - это что-то вроде настроек FMIN и FMAX, настроенных на 20 и 56 соответственно (не похоже ли это на предельные значения температуры для минимальной и максимальной скоростей вращения вентилятора?) Однако изменение этих параметров не сработало (возможно, HP Coolsense имеет приоритет).

Я дам вам знать, если мне удастся что-нибудь найти!

Редактировать: я ошибся, FMIN и FMAX указывают минимальную и максимальную скорости вентилятора: 2000 и 5600 соответственно.К сожалению, изменить их по-прежнему не получается.

...