この .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または同様のものであると推測しています、 およびはFMAX
、FMIN
それぞれ Fan-Max-Speed および -Min-Speed です。C2K
ケルビン変換機能だと思います。それ以上は、推測に基づいて推測しているだけです。
編集:さらに検討すると、_PSL
パッシブリスト(ACPI仕様による)であり、パッシブ温度制御デバイスのリストを返します。ファンが「アクティブ」温度制御と見なされる場合、「パッシブ」温度制御の例は、CPU の電圧または速度を下げることです。したがって、このセクションがファンをまったく制御するかどうかはわかりません。受動的な温度制御専用にすることもできます。
私がやろうとしているのは、さまざまな温度に使用されるラップトップのファン速度を変更することです。一部の DSDT では、温度とファン速度の間のマッピングがきちんとした小さなテーブルにあり、マッピングを変更するには、いくつかの数値を変更するだけです。この ASL ファイルにはそのようなテーブルがあるようには見えないので、マッピングを行う何らかのプログラム ロジックがあるに違いないと思います。
誰かが私のためにそれを解読するのを助けることができますか?
私が実際にやろうとしているのは、HP G60-244dx ラップトップでファンをリラックスさせることです。CPU がアイドル状態のときでも動作音が大きすぎます。以前の HP nc8430 ラップトップのように、ファンの速度が不必要に高く設定されています。ファンの速度を下げても、CPU の温度を同じに保つことができます。
ファンの速度を変更するには、DSDT にパッチを適用する必要があると思います。そのため、上記を解読したいと考えています。
どうもありがとう。
関連する可能性があります:
Linux で ACPI フィールドを設定する