使用0D/6D补丁解决XDCI睡眠唤醒
”sudo pmset sleepnow“
根据 ACPI
规范, _PRW
方法定义了设备的唤醒方法。该函数的返回值是一个包含 $2$ 个或更多字节的数据包。
一些机型内建的子设备 (如 USB
控制器, 内建声卡, 无线网卡等) 的 _PRW
与 macOS
冲突,一旦计算机进入睡眠状态, 就会被这些子设备立即唤醒。编写适当的 ACPI Hotpatch
可以解决这一问题. 一般来说这些 _PRW
数据包的第一个字节为 0D
或 6D
。因此,这种补丁也被称为0D/6D
补丁,也称为二次唤醒补丁.
一般而言, _PRW
数据包的第二个返回字节主要是 03
或 04
。将该字节修改为 0
就完成了 0D/6D
补丁。
然而, 对杯具的 ThinkPad X1 Carbon 6th (20KH)
和 ThinkPad X1 Yoga 3rd (20LE)
而言, 单纯地将 6D-03 / 6D-04
重命名为 6D - 00
并不能解决问题, 有时它们还会在几次成功的睡眠过程之后便由于 内建的 JHL6540 Thunderbolt3 USB-3.1 Controller
持续唤醒, 而再也无法进入睡眠状态. 使用
1
pmset -g log|grep -e " Sleep.*due to" -e " Wake.*due to" -e "DarkWake.*due to"
指令检查睡眠/唤醒原因, 总能看到如下的一行:
1
+0800 Wake DarkWake to FullWake from Standby [CDNVA] : due to XDCI \ HID Activity Using AC
使用 macIASL
检查设备的 ACPI
表, 可见 XDCI
设备定义了一个睡眠唤醒方法: (图中为已被 patch
的 ACPI
表)
通过在 OpenCore
配置中将返回值改为 Zero
, 即可完全橄榄 XDCI
设备的睡眠唤醒方法, 使它从此再也无法影响设备的正常睡眠. (注意截图中的高亮行)