奇技淫巧 使用0D-6D补丁解决XDCI睡眠唤醒

你妈的 给爷睡

Posted by R1NG on November 6, 2020 Viewed Times

使用0D/6D补丁解决XDCI睡眠唤醒

”sudo pmset sleepnow“

根据 ACPI 规范, _PRW 方法定义了设备的唤醒方法。该函数的返回值是一个包含 $2$ 个或更多字节的数据包。

一些机型内建的子设备 (如 USB 控制器, 内建声卡, 无线网卡等) 的 _PRWmacOS 冲突,一旦计算机进入睡眠状态, 就会被这些子设备立即唤醒。编写适当的 ACPI Hotpatch 可以解决这一问题. 一般来说这些 _PRW 数据包的第一个字节为 0D6D 。因此,这种补丁也被称为0D/6D 补丁,也称为二次唤醒补丁.

一般而言, _PRW 数据包的第二个返回字节主要是 0304 。将该字节修改为 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 设备定义了一个睡眠唤醒方法: (图中为已被 patchACPI 表) sleep

通过在 OpenCore 配置中将返回值改为 Zero, 即可完全橄榄 XDCI 设备的睡眠唤醒方法, 使它从此再也无法影响设备的正常睡眠. (注意截图中的高亮行)

20201106132053