自从买了华硕灵耀 X13 (aka Asus Zenbook S 13 OLED) 这台破笔记本之后,我一直被它的休眠问题所折磨,包括但不仅限于:

  1. 插着电会自动重启,而且是 Reset 那种,Windows 日志里也看不到是怎么挂的;
  2. 休眠后睡不醒,只能强制重启;
  3. 关掉休眠功能之后,CPU 跑满,风扇狂转榨干电池。

忍受了大半年之后,我才意识到一切的罪魁祸首都是啥笔微软在推的 S0 Sleep (Modern Standby)。但是这台笔记本的 BIOS 里并没有设置回到 S3 Sleep 的选项,要如何实现呢?

UMAF (Universal AMD Form Browser)

如果你搜索和锐龙的 S3 睡眠相关问题,多半会搜索到让你用 UMAF 这个工具的。这个工具的原理是修改 UEFI Variable 中 AMD_PBS_SETUP,来打开 S3,同样原理的还有 RU.EFI(http://ruexe.blogspot.com/)。

但是这种方法在这台笔记本上并不可用,修改完了之后重启,Windows 会无法启动,蓝屏报错 ACPI_TABLE_ERROR,我推测是 UMAF 所用的结构体不能和 6000 系完全兼容,或者单纯不能和这台笔记本兼容,导致修改的位置有错。不过我也不敢用 RU.EFI 一个个去试,所以还是算了吧。

覆写 DSDT Table

尽管 UMAF 这条路走不通,但不代表我们无路可走。影响 Windows 休眠设置的主要是 ACPI Table 的 DSDT 部分,如果我们直接覆写这一部分呢?

虽然 Windows 没有这样的功能,但是玩黑果对这个倒是很熟,黑果的 Bootloader: Clover (虽然现在都是用什么 OpenCore 了) 就提供了这样的功能。

关闭 S0 睡眠

在管理员权限的 CMD 中输入

reg add HKLM\System\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD /d 0

重启电脑之后,输入

powercfg /a

可以看到 S0 的睡眠状态是不可用的。

提取 DSDT

首先下载这个 iASL Compiler and Windows ACPI tools,解压之后进入这个文件夹,打开 cmd 或者 powershell。

.\acpidump.exe -b -n DSDT -z
.\iasl.exe -d .\dsdt.dat

提出出来文件 dsdt.dat,并反编译成 dsdt.dsl

虽然我看别人的文章里说的要在 Clover 里提取 DSDT,否则会出现无法识别电池的问题,但是我自己都试了一遍,发现提取出来的是一样的。

修改 DSDT

用 notepad 或者其他文本编辑器打开 dsdt.dsl,只需要修改两处

DefinitionBlock ("", "DSDT", 2, "_ASUS_", "Notebook", 0x0107200A)

这一行最后的数字,要设置的大一点,比如 0x01072010,这样 Windows 才会加载新的 dsdt。

    Name (XS3, Package (0x04)
    {
        0x03, 
        Zero, 
        Zero, 
        Zero
    })

把 XS3 改成 _S3。保存文件并重新编译

iasl.exe dsdt.dsl

编译出来文件 dsdt.aml

安装 Clover

首先要挂载 EFI 分区

diskpart

sel disk 0
sel part 1
ass letter=X

这里的 disk 0part 1 要视情况而定,请用 list disklist part 确定你电脑上具体哪个是 EFI 分区。

这里 下载 Clover 的最新版本。

mkdir X:\EFI\CLOVER\ACPI\Windows
copy CLOVERX64.efi X:\EFI\CLOVER
copy dsdt.aml X:\EFI\CLOVER\Windows\
notepad X:\EFI\CLOVER\config.plist

在 config.plist 文件中输入

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Boot</key>
    <dict>
        <key>Timeout</key>
        <integer>-1</integer>
        <key>Fast</key>
        <false/>        
    </dict>
    <key>GUI</key>
    <dict>
        <key>Scan</key>
        <dict>
            <key>Entries</key>
            <true/>
            <key>Legacy</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

重启电脑并进入 BIOS

关闭安全启动与设置启动项

关闭安全启动这个自己看 BIOS 选项,不过要说的一点是,关闭安全启动之后,BitLocker 加密的硬盘将无法自动解密,有使用 BitLocker 的建议提前关闭。

设置启动项即将 CLOVERX64.EFI 添加到启动项中并设置默认启动。

保存设置,重启电脑。重启之后再查看 powercfg /a,可以发现 S3 睡眠已经是可用的状态了。

一些问题

休眠恢复时蓝屏

AMD 有一个设备,AMD Audio CoProcessor,看字面意思是音频协处理器,它没有什么用处,但是会导致睡醒的时候蓝屏,所以在设备管理器里禁用这个就好。

无法使用USB键鼠唤醒

是有这个问题,但是没有看到解决方案,就当是小小的遗憾吧,总比电脑天天随机重启好。

引用

  1. S3 sleep on Windows for ASUS ROG Flow
  2. Turn on S3 Sleep using UMAF