Помогите мне расшифровать этот код исходного языка ACPI?

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

Затем, запустив Microsoft Компилятор ASL на этом, я могу получить этот Исходный язык 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 ​​и -Мин-скорость соответственно. Я думаю, что C2K - это функция преобразования в Кельвина. Помимо этого, я просто предполагаю, основываясь на предположениях.

Изменить: при дальнейшем рассмотрении, _PSL - это пассивный список (согласно спецификации ACPI), который возвращает список устройств пассивного контроля температуры. Если вентиляторы считаются «активным» контролем температуры, примером «пассивного» управления температурой может быть снижение напряжения или скорости процессора. Так что я не уверен, что эта секция вообще контролирует вентилятор. Он может быть предназначен исключительно для пассивного контроля температуры.


Я пытаюсь изменить скорость вращения вентилятора ноутбука, которая используется для различных температур. В некоторых DSDT сопоставление между температурой и скоростью вращения вентилятора находится в аккуратной маленькой таблице, и изменение сопоставления сводится лишь к изменению нескольких чисел. Не похоже, что в этом ASL-файле есть такая таблица, поэтому я думаю, что должна быть какая-то программная логика, выполняющая сопоставление.

Кто-нибудь может помочь мне его расшифровать?


Я действительно пытаюсь заставить вентилятор расслабиться на ноутбуке HP G60-244dx. Он работает слишком громко, даже когда процессор простаивает, и ... если он похож на мой предыдущий ноутбук HP nc8430, скорость вращения вентилятора установлена ​​излишне высокой. Можно снизить скорость вращения вентилятора, сохранив при этом температуру процессора.

Я думаю, чтобы изменить скорость вращения вентилятора, мне нужно исправить DSDT, и поэтому я хочу расшифровать вышесказанное.

Большое спасибо.


, возможно, связано:
Установка поля ACPI в Linux

6
задан Community 23 May 2017 в 12:04
поделиться