6

この .NET プログラムを使用して、 にある Windows レジストリのバイナリ ダンプを作成しましたHKLM/Hardware/ACPI/DSDT

次に、その上で Microsoft のASL コンパイラを実行すると、次の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または同様のものであると推測しています、 およびはFMAXFMINそれぞれ Fan-Max-Speed および -Min-Speed です。C2K ケルビン変換機能だと思います。それ以上は、推測に基づいて推測しているだけです。

編集:さらに検討すると、_PSLパッシブリスト(ACPI仕様による)であり、パッシブ温度制御デバイスのリストを返します。ファンが「アクティブ」温度制御と見なされる場合、「パッシブ」温度制御の例は、CPU の電圧または速度を下げることです。したがって、このセクションがファンをまったく制御するかどうかはわかりません。受動的な温度制御専用にすることもできます。


私がやろうとしているのは、さまざまな温度に使用されるラップトップのファン速度を変更することです。一部の DSDT では、温度とファン速度の間のマッピングがきちんとした小さなテーブルにあり、マッピングを変更するには、いくつかの数値を変更するだけです。この ASL ファイルにはそのようなテーブルがあるようには見えないので、マッピングを行う何らかのプログラム ロジックがあるに違いないと思います。

誰かが私のためにそれを解読するのを助けることができますか?


私が実際にやろうとしているのは、HP G60-244dx ラップトップでファンをリラックスさせることです。CPU がアイドル状態のときでも動作音が大きすぎます。以前の HP nc8430 ラップトップのように、ファンの速度が不必要に高く設定されています。ファンの速度を下げても、CPU の温度を同じに保つことができます。

ファンの速度を変更するには、DSDT にパッチを適用する必要があると思います。そのため、上記を解読したいと考えています。

どうもありがとう。


関連する可能性があります:
Linux で ACPI フィールドを設定する

4

1 に答える 1

0

私のHPdm1-3100evで同じプロセスを試みているときに、これに遭遇しました。直接のファン速度設定はありません。コードで計算する必要があります。最も近い検索結果は、それぞれ20と56に設定されたFMINとFMAXの設定のようなものです(これらは最小および最大ファン速度の温度制限のように見えませんか?)ただし、これらを変更しても機能しませんでした(HPCoolsenseがオーバーライドしている可能性があります) )。

なんとか見つけたらお知らせします!

編集:私は間違っていました、FMINとFMAXは最小と最大のファン速度を指定します:それぞれ2000と5600。残念ながら、それらを変更しても機能しません。

于 2011-04-17T07:27:35.177 に答える