-
ACPI 规范
PNP0C0E
— Sleep Button DevicePNP0C0D
— Lid Device有关
PNP0C0E
和PNP0C0D
详细内容请查阅 ACPI 规范。 -
PNP0C0E
睡眠条件- 执行
Notify(***.SLPB, 0x80)
。SLPB
是PNP0C0E
设备名称。
- 执行
-
PNP0C0D
睡眠条件_LID
返回Zero
。_LID
是PNP0C0D
设备当前状态。- 执行
Notify(***.LID0, 0x80)
。LID0
是PNP0C0D
设备名称。
部分机器提供了睡眠按键(小月亮按键),如:部分 ThinkPad 的 Fn+F4,Dell 的 Fn+Insert 等。当按下这个按键后,系统执行了 PNP0C0E
睡眠。可是,ACPI 错误地向系统传递了关机参数而非睡眠参数,从而导致系统崩溃。即使能够睡眠也能正常唤醒,系统工作状态也被破坏。
下列方法之一可以修复这个问题:
- 截取ACPI 传递的参数并纠正它。
- 将
PNP0C0E
睡眠转换为PNP0C0D
睡眠。
-
SSDT-PTSWAK :定义变量
FNOK
和MODE
,捕捉FNOK
的变化。见《PTSWAK综合扩展补丁》。FNOK
表示按键状态FNOK
=1:按下睡眠按键FNOK
=0:再次按下睡眠按键或者机器被唤醒后
MODE
设定睡眠模式MODE
=1:PNP0C0E
睡眠MODE
=0:PNP0C0D
睡眠
注意:根据自己的需要设置
MODE
,但不可以更改FNOK
。 -
SSDT-LIDpatch :捕捉
FNOK
变化- 如果
FNOK
=1,盖子设备当前状态返回Zero
- 如果
FNOK
=0,盖子设备当前状态返回原始值
注意:
PNP0C0D
设备名称、路径要和ACPI一致。 - 如果
-
睡眠按键补丁 :按键按下后,令
FNOK
=1
,并根据不同的睡眠模式执行相应的操作注意:
PNP0C0D
设备名称、路径要和ACPI一致。
MODE
=1模式:当按下睡眠按键时, 睡眠按键补丁 令FNOK=1
。 SSDT-PTSWAK 捕捉到FNOK
为1
,强制令Arg0=3
(否则Arg0=5
)。待唤醒后恢复FNOK=0
。一次完整的PNP0C0E
睡眠和唤醒过程结束。MODE
=0模式:当按下睡眠按键时,除了完成上述过程外, SSDT-LIDpatch 同时扑捉到FNOK=1
,使_LID
返回Zero
并执行PNP0C0D
睡眠。待唤醒后恢复FNOK=0
。一次完整的PNP0C0D
睡眠和唤醒过程结束。
以下是 SSDT-LIDpatch 主要内容:
Method (_LID, 0, NotSerialized)
{
if(\_SB.PCI9.FNOK==1)
{
Return (0) /* 返回 Zero, 满足 PNP0C0D 睡眠条件之一 */
}
Else
{
Return (\_SB.LID0.XLID()) /* 返回原始值 */
}
}
以下是 睡眠按键补丁 主要内容:
If (\_SB.PCI9.MODE == 1) /* PNP0C0E 睡眠 */
{
\_SB.PCI9.FNOK =1 /* 按下睡眠按键 */
\_SB.PCI0.LPCB.EC.XQ13() /* 原始睡眠按键位置,示例是 TP 机器 */
}
Else /* PNP0C0D 睡眠 */
{
If (\_SB.PCI9.FNOK!=1)
{
\_SB.PCI9.FNOK =1 /* 按下睡眠按键 */
}
Else
{
\_SB.PCI9.FNOK =0 /* 再次按下睡眠按键 */
}
Notify (\_SB.LID, 0x80) /* 执行 PNP0C0D 睡眠 */
}
-
Dell Latitude 5480
PTSWAK更名:
_PTS
toZPTS
、_WAK
toZWAK
。盖子状态更名:
_LID
toXLID
按键更名:
BTNV
toXTNV
(Dell-Fn+Insert)补丁组合:
- SSDT-PTSWAK:综合补丁。根据自己的需要设置
MODE
。 - SSDT-LIDpatch:盖子状态补丁。
- SSDT-FnInsert_BTNV-dell:睡眠按键补丁。
- SSDT-PTSWAK:综合补丁。根据自己的需要设置
-
ThinkPad X1C5th
PTSWAK更名:
_PTS
toZPTS
、_WAK
toZWAK
。盖子状态更名:
_LID
toXLID
按键更名:
_Q13 to XQ13
(TP-Fn+F4)补丁组合:
- SSDT-PTSWAK:综合补丁。根据自己的需要设置
MODE
。 - SSDT-LIDpatch:盖子状态补丁。修改补丁内
LID0
为LID
。 - SSDT-FnF4_Q13-X1C5th:睡眠按键补丁。
注意1:X1C5th 的睡眠按键是 Fn+4,有的TP的睡眠按键是 Fn+F4。
注意2:TP 机器
LPC
控制器名称可能是LPC
、也可能是LPCB
。 - SSDT-PTSWAK:综合补丁。根据自己的需要设置
-
使用补丁: SSDT-PTSWAK ;更名:
_PTS
toZPTS
、_WAK
toZWAK
。见《PTSWAK综合扩展补丁》。根据自己的需要修改
MODE
。 -
使用补丁: SSDT-LIDpatch ;更名:
_LID
toXLID
。注意:
PNP0C0D
设备名称、路径要和ACPI一致。 -
查找睡眠按键位置、制作 睡眠按键补丁
- 一般情况下,睡眠按键是
EC
下的_Qxx
,这个_Qxx
里包涵Notify(***.SLPB,0x80)
指令。如果查找不到,DSDT 全文搜索Notify(***.SLPB,0x80)
,找到其所在位置,逐步向上查找最初位置。 - 参考示例制作睡眠按键补丁以及必要的更名。
注意1:SLPB是
PNP0C0E
设备名称。如果确认没有PNP0C0E
设备,添加补丁:SSDT-SLPB(位于《添加缺失的部件》)。注意2:
PNP0C0D
设备名称、路径要和ACPI一致。 - 一般情况下,睡眠按键是
- 睡眠过程稍快。
- 睡眠过程无法被终止。
-
睡眠过程中,再次按下睡眠按键立即终止睡眠。
-
接入外显时,按下睡眠按键后,工作屏幕为外显(内屏灭);再次按下睡眠按键,内屏、外显正常。
PNP0C0E
和PNP0C0D
设备名称、路径要和ACPI一致。