# 键盘唤醒问题

因此,英特尔的100系列及更新的芯片组有一个奇怪的bug,即有时macOS需要第二次按键盘或其他唤醒事件来启动显示器,有些需要按键+电源按钮才能唤醒。要解决这个问题,我们需要:

你可以在这里找到关于整个情况和修复的伟大的文章:USB修复 (opens new window).

这是一本优秀的读物,强烈推荐你去真正理解到底发生了什么,而且这篇指南似乎还没有让你读够

# 方法1 -添加唤醒类型属性(推荐)

因此,理想的方法是将XHCI控制器(这是我们的USB控制器)声明为ACPI唤醒设备,因为我们没有macOS的兼容ec来处理正确的唤醒调用。以上翻译结果来自有道神经网络翻译(YNMT)· 通用领域

首先,我们需要获取USB控制器的PciRoot(我们将使用gfxutil (opens new window),通常名称是XHC, XHC1和XHCI)

现在使用PciRoot,打开您的config.plist,并在DeviceProperties -> add下添加一个新条目,并添加您的PciRoot。然后创建一个具有以下属性的子节点:

acpi-wake-type | Data | <01>

# 方法2 -创建一个假ACPI设备

这个方法创建一个与GPE关联的假ACPI设备,然后用USBWakeFixup.kext添加ACPI-wake-type属性。

它实际上很容易设置,你将需要以下内容:

要为特定的系统创建SSDT-USBW,需要USB控制器的ACPI路径。如果我们回顾上面的gfxutil示例,我们可以看到它还列出了我们的ACPI路径:

  • /PC00@0/XHCI@14 -> \_SB.PC00.XHCI

现在我们可以把它塞进我们的SSDT:

现在,您可以编译并将其添加到您的EFI和config.plist中。有关编译ssdt的更多信息,请参见ACPI入门 (opens new window)

# 方法3 -配置darkwake

在我们深入配置darkwake之前,最好解释一下什么是darkwake。霍利菲尔德的一篇深度文章可以在这里找到:DarkWake on macOS Catalina (opens new window)

在其最简单的形式中,您可以将darkwake视为“部分唤醒”,在这种情况下,只有硬件的某些部分为维护任务而亮起,而其他部分则处于睡眠状态(例如:显示)。我们关心这一点的原因可能是,darkwake可以在唤醒过程中添加额外的步骤,如按键盘,但直接禁用它会使我们的黑苹果唤醒随机。所以理想情况下,我们会通过下表找到一个理想值。

现在让我们看一下IOPMrootDomain的源代码 (opens new window):

// gDarkWakeFlags
enum {
    kDarkWakeFlagHIDTickleEarly      = 0x01, // hid tickle before gfx suppression
    kDarkWakeFlagHIDTickleLate       = 0x02, // hid tickle after gfx suppression
    kDarkWakeFlagHIDTickleNone       = 0x03, // hid tickle is not posted
    kDarkWakeFlagHIDTickleMask       = 0x03,
    kDarkWakeFlagAlarmIsDark         = 0x0100,
    kDarkWakeFlagGraphicsPowerState1 = 0x0200,
    kDarkWakeFlagAudioNotSuppressed  = 0x0400
};

现在让我们逐一检查每一位:

Bit Name Comment
0 N/A 据说会使darkwake失效
1 HID Tickle Early 帮助从盖子唤醒,另外可能需要电源按钮按下唤醒
2 HID Tickle Late 帮助单按键唤醒,但禁用自动休眠
3 HID Tickle None 如果设置为none,则默认darkwake值
3 HID Tickle Mask 配对:与其他配对
256 Alarm Is Dark 有待探索
512 Graphics Power State 1 使wranglerTickled完全从休眠和RTC唤醒
1024 Audio Not Suppressed 据说有助于消除醒来后的声音消失
  • 注意HID =人机界面设备(键盘、鼠标、指针设备等)

要将上述表格应用于您的系统,就像获取计算器一样简单,将所需的darkwake值相加,然后将最终值应用于您的启动参数。但是,我们建议每次尝试一个,而不是一次合并所有,除非你知道你在做什么(尽管你可能不会阅读这篇指南)。

对于这个例子,让我们尝试组合kdarkwakeflaghidtickklelatekDarkWakeFlagGraphicsPowerState1:

  • 2= kDarkWakeFlagHIDTickleLate
  • 512= kDarkWakeFlagAudioNotSuppressed

所以我们的最终值是darkwake=514,我们可以把它放到引导参数中:

NVRAM
|---Add
  |---7C436110-AB2A-4BBB-A880-FE41995C9F82
    |---boot-args | Sting | darkwake=514

下面更多是为了澄清已经使用darkwake或正在研究它的用户,特别是澄清哪些值不再工作: