_PRW
定义了一个部件的唤醒方法。其Return
2 个或者 2 个以上字节组成的数据包。有关_PRW
详细的内容参见 ACPI 规范。- 有这么一些部件,由于他们的
_PRW
和 macOS 发生了冲突从而导致机器刚刚睡眠成功就被立即唤醒。为了解决问题,必须对这些部件实施补丁。这些部件_PRW
数据包的第 1 个字节是0D
或者6D
。因此,这种补丁被称为0D/6D补丁
,也叫秒醒补丁
,也叫睡了即醒补丁
。为了描述方便,以下统一称之为0D/6D补丁
。 _PRW
数据包的第 2 个字节多为03
或者04
,将这个字节修正为0
即完成了0D/6D补丁
。- 不同的机器对
_PRW
定义的方法可能不同,其数据包的内容、形式也可能多样化。实际的0D/6D补丁
应视具体情况而定。见后文的描述。 - 我们期待 OpenCore 后续版本能够解决
0D/6D
问题。
-
USB 类设备
ADR
地址:0x001D0000
, 部件名称:EHC1
。ADR
地址:0x001A0000
, 部件名称:EHC2
。ADR
地址:0x00140000
, 部件名称:XHC
,XHCI
,XHC1
等。ADR
地址:0x00140001
, 部件名称:XDCI
。ADR
地址:0x00140003
, 部件名称:CNVW
。
-
以太网
- 6 代以前,
ADR
地址:0x00190000
, 部件名称:GLAN
,IGBE
等。 - 6 代及 6 代以后,
ADR
地址:0x001F0006
, 部件名称:GLAN
,IGBE
等。
- 6 代以前,
-
声卡
- 6 代以前,
ADR
地址:0x001B0000
, 部件名称:HDEF
,AZAL
等。 - 6 代及 6 代以后,
ADR
地址:0x001F0003
, 部件名称:HDAS
,AZAL
等。
注意1:通过查找名称确认上述部件的方法并不可靠。可靠的方法是搜索
ADR 地址
,_PRW
。注意2:新发布的机器可能会有新的部件需要
0D/6D补丁
。 - 6 代以前,
-
Name 类型
Name (_PRW, Package (0x02) { 0x0D, /* 可能是0x6D */ 0x03,/* 可能是0x04 */ ... })
这种类型的
0D/6D补丁
适合用二进制更名方法修正0x03
(或0x04
)为0x00
。文件包提供了:- Name-0D 更名 .plist
Name0D-03
to00
Name0D-04
to00
- Name-6D 更名 .plist
Name6D-03
to00
Name6D-04
to00
- Name-0D 更名 .plist
-
Method 类型
之一:GPRW(UPRW)
Method (_PRW, 0, NotSerialized) { Return (GPRW (0x6D, 0x04)) /* 或者Return (UPRW (0x6D, 0x04)) */ }
较新的机器大多数属于这种情况。按常规方法(更名-补丁)即可。文件包提供了:
- SSDT-GPRW(补丁文件内有二进制更名数据)
- SSDT-UPRW(补丁文件内有二进制更名数据)
-
Method 类型
之二:Scope
Scope (_SB.PCI0.XHC) { Method (_PRW, 0, NotSerialized) { ... If ((Local0 == 0x03)) { Return (Package (0x02) { 0x6D, 0x03 }) } If ((Local0 == One)) { Return (Package (0x02) { 0x6D, One }) } Return (Package (0x02) { 0x6D, Zero }) } }
这种情况并不常见。对于示例的情况,使用二进制更名 Name6D-03 to 00 即可。其他形式内容自行尝试。
-
Name 类型
,Method 类型
混合方式对于多数 TP 机器,涉及
0D/6D补丁
的部件既有Name 类型
,也有Method 类型
。采用各自类型的补丁即可。需要注意的是二进制更名补丁不可滥用,有些不需要0D/6D补丁
的部件_PRW
也可能是0D
或6D
。为防止这种错误,应提取System DSDT
文件加以验证、核实。
- 本文描述的方法适用于Hotpatch。
- 凡是用到了二进制更名,应提取
System DSDT
文件加以验证。