【问题标题】:How to decipher this ACPI Source Language code?如何破译此 ACPI 源语言代码?
【发布时间】:2011-05-17 21:31:24
【问题描述】:

我使用this .NET programHKLM/Hardware/ACPI/DSDT 处的Windows 注册表进行二进制转储。

然后,在上面运行微软的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 或类似的东西,FMAXFMIN 分别是 Fan-Max-Speed 和 -Min-Speed。我认为C2K 是一个转换为开尔文的函数。除此之外,我只是根据猜测进行猜测。

编辑:经过进一步审查,_PSL 是被动列表(根据 ACPI 规范),它返回被动温度控制设备的列表。在风扇被认为是“主动”温度控制的情况下,“被动”温度控制的一个例子是降低 CPU 的电压或速度。所以我不确定这部分是否控制风扇。它可以专门用于被动温度控制。


我要做的是修改笔记本电脑风扇的速度,以适应各种温度。在某些 DSDT 中,温度和风扇速度之间的映射在一个整洁的小表格中,修改映射只是更改几个数字的问题。在这个 ASL 文件中似乎没有这样的表,所以我认为必须有一些程序逻辑在做映射。

谁能帮我破译一下?


我真正想做的是让风扇在 HP G60-244dx 笔记本电脑上放松一下。即使在 CPU 空闲时它运行的声音也太大,而且……如果它像我以前的 HP nc8430 笔记本电脑一样,风扇速度设置得不必要地高。可以降低风扇速度,但保持 CPU 温度不变。

我认为为了修改风扇速度我需要修补 DSDT,这就是我想破译上述内容的原因。

非常感谢。


可能相关:
Setting an ACPI field in Linux

【问题讨论】:

  • SpeedFan为你做会不会更简单?
  • 是的!如果 SpeedFan 确实适用于这种类型的 PC。我运行它,它告诉我临时工,但不让我改变任何东西。

标签: windows acpi dsdt


【解决方案1】:

在我的 HP dm1-3100ev 上尝试相同的过程时遇到了这个问题。没有直接的风扇速度设置,必须在代码中计算。最接近的发现是 FMIN 和 FMAX 设置,分别设置为 20 和 56(这些看起来不像是最小和最大风扇速度的温度限制吗?)但是更改这些没有用(也许 HP Coolsense 正在压倒一切)。

如果我能找到任何东西,我会告诉你的!

编辑:我错了,FMIN 和 FMAX 分别指定了最小和最大风扇速度:2000 和 5600。不幸的是,改变这些仍然不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多