前言
黑苹果进入十代酷睿搭 400 系主板时代后,某些机型上(部分 Z390 和 B460)的 macOS 可能会遇到一个奇怪的问题,就是关机时,电脑可能会变成自动重启,或卡在壁纸界面(开了 -v 跑码的卡在跑码界面)。
这是因为 ACPI 中缺少 S5 调用而导致控制器无法断电。当然,Windows 和 Linux 都有各自的黑科技来解决这个问题,但 macOS 没有内置此类修复(不是因为苹果傲娇,而是它的自家产品没有这个问题)。这个现象在 Clover 中并不常见,因为 Clover 内置了很多隐藏的自动应用的热补丁,再加上非常方便的各类 ACPI 开关,修复也比较方便。
但是 OpenCore 并没有内置这些东西,所以我们需要做一些本来应该是主板厂家工程师的工作,修复他们留在 ACPI 里的 Bug 导致的问题。
「注意」因为 SSDT 编辑有门槛,需要一定的编程基础知识和 ACPI 知识,本文只做思路分享,不做新手式教学。
需要的软件
- DPCIManager.app
- MaciASL.app
- OpenCore Configurator:用于修改 OC 的配置文件,不喜欢 OCC 的话下面几个也可以
- OCAuxiliaryTools
- ProperTree
- Visual Studio Code
查找设备并添加到 SSDT
使用 DPCIManager 提取你的 DSDT.aml 文件,然后使用 MaciASL 打开,搜索其中 _PRW 相关内容,因为这个方法(Method)是 Power Resources for Wake 的关系,可能有非常多的结果。查看其中有没有提到 XHC、XHCI 和 XHC1 之类的设备,例如 SB.PCI0.XHC 。
然后,打开 MaciASL,新建文件,添加以下代码:
DefinitionBlock ("", "SSDT", 2, "HeiPG", "ZPTS", 0x00000000)
{External (_SB_.PCI0.XHC_.PMEE, FieldUnitObj)External (ZPTS, MethodObj) // 1 ArgumentsMethod (_PTS, 1, NotSerialized) // _PTS: Prepare To Sleep{ZPTS (Arg0)If ((0x05 == Arg0)){\_SB.PCI0.XHC.PMEE = Zero}}
}
解释:基本意思就是当 ZPTS 的 Arg0 被赋值为 0x05 时(S5 状态),让 SB.PCI0.XHC 这个设备变成 0(就是没有了)。其中 SB.PCI0.XHC 是设备位置,这个需要根据你自己的情况自行确定。完成后,用 MaciASL 导出编译后的 aml 文件,添加到 EFI 目录和 config 文件中,并启用。
更进一步,再添加一个系统判断以及操作范围,就更加稳妥了。
DefinitionBlock ("", "SSDT", 2, "hack", "SHUT", 0x00000000)
{External (_SB_.PCI0.XHC_.PMEE, FieldUnitObj)External (ZPTS, MethodObj) // 1 ArgumentsMethod (_PTS, 1, NotSerialized) // _PTS: Prepare To Sleep{ZPTS (Arg0)If (_OSI ("Darwin")){If ((0x05 == Arg0)){If (CondRefOf (\_SB.PCI0.XHC.PMEE)){\_SB.PCI0.XHC.PMEE = Zero}OperationRegion (PMRS, SystemIO, 0x1830, One)Field (PMRS, ByteAcc, NoLock, Preserve){, 4, SLPE, 1}SLPE = ZeroSleep (0x10)}}Else{}}
}
「注意」这个补丁还需要搭配 ACPI 重命名,将方法 _PTS 重命名为 ZPTS,否则无效(因为原本没有 ZPTS)。
重命名补丁可以通过 OCC 等编辑工具快捷添加到 OpenCore 的 config 中,记得把 Enabled 勾上。
代码如下:
Find: 5F505453 01
Replace: 5A505453 01
Comment: Change _PTS to ZPTS
尾声
不想自己弄的懒人,可以直接下载下面整理好的文件包,其中 .dsl 是源文件,.aml 是 OpenCore 可以直接使用的,已经写好了各类常见的 XHC 名称,但 ACPI 重命名补丁还是要自己加的。不保证一定可以解决你的问题,因为每台电脑的 DSDT 都是不一样的。