联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC


说明

我本身对硬件和系统底层一窍不通,这个本来很简单的功能折腾了整整两天。所以想到要写日志记下来。日志写的比较杂,但是我发现B站的拯救者官方账号有150w的粉丝,所以挂在博客上,希望对大家有帮助。

本文涉及到对BIOS的修改,由于硬件环境不同,可能会导致无法开机,并且无法保修。注意:At Your Own Risk


一、我的电脑

拯救者R720-15ikbn,6-7年前的电脑了。618打算购置显示器,所以笔记本打算盖上,然后用一个立式支架撑起来。但是屏幕盖上后,电源开关就被遮住了,这个时候就需要通过外部的手段开机。可以是Wake on AC或者Wake on Lan。我刚好有一个天猫精灵的公牛插座。所以一开始打算用通电开机的办法,但是由于BIOS上一直找不到相关的参数,无奈这两天都在研究Wake on Lan了。结果很郁闷,研究的时候无意中发现了通电自启的选项,Wake on Lan反而搞不定…

二、详细过程

1.BIOS选项

首先不管是Wake on AC还是Wake on Lan,都要开启对应的BIOS参数。查了资料,一般和电源相关的设置,按理说应该放在Power相关的项目里。联想的拯救者,还有神州、雷神的一部分型号使用的BIOS是InsydeH20 Setup Utility。按F2进入BIOS只会显示InformationConfigurationSecurityBootExit几个选项卡。当我发现别人的BIOS有非常多多参数,自己的只有这么一点,我意识到这些参数应该被隐藏了。然后就要解锁这些隐藏的菜单,进入对BIOS的修改过程

2.查阅改BIOS的资料

刚开始我在B站找到了两个视频(感谢万能的B站):
BIOS高级菜单解锁(雷神zero)
神舟 华硕 联想各个品牌bios通用解锁教程 解锁功耗墙 延长鸡血时间 内存超频 解放电脑性能

在Windows上直接修改BIOS,要安装一个叫做Intel® Management Engine Interface的驱动,这个在联想官方的驱动页面上可以下载到。有了这个接口,我们根据这个接口的版本,可以在第三方找到对应版本的修改工具,下面是B站UP提供的网盘地址:
第3方汇集 Intel CSME System Tools

下载了压缩包以后,只需要解压Flash Programming Tool/WIN64下的FPTW64和两个dll文件。FPTW64可以在命令行下用于备份BIOS镜像和刷写BIOS镜像。备份了BIOS镜像后,我们要使用从镜像中提取和菜单相关的SetupUtility文件,对其反编译。反编译的文件中,会有Grayoutif和Suppressif这样的关键字,参考Step to UEFI (146)Grayoutif ,Suppressif和Setup联动的探索

Grayoutif和Suppressif是比较常用的控制命令。Grayoutif的作用是设定某一个 item 跟随另一个 item 的变化而被设置为灰色无法修改【参考1】。Suppressif的作用是设定某一个 item 跟随另一个 item 的变化而被自动隐藏【参考2】。

B站的UP通过简单调整和这两个关键字相关的布尔值实现对BIOS的解锁。

大家感兴趣可以看下上面两个视频,顺便把评论区翻一翻

3.修改BIOS失败

因为只是简单地调整逻辑表达式,而没有对变量做实际的修改,所以视频介绍的方法不太可能对BIOS功能本身造成影响。
照着视频操作了一波,重启按F2,没效果。
考虑到可能是BIOS的版本太旧。我的版本是4KCN23WW,所以到官网上找最新的驱动。无奈我的电脑好像已经被联想淘汰掉了,找不到我的R720的驱动页面,只能下载Y520的4KCN45WW安装。安装完重新照着视频的方法进行操作,可是在对提取出的SetupUtility进行反编译时,直接死循环了。。。无奈只能通过上面提到的FPTW64工具把我刚开始备份的4KCN23WW驱动刷回去,结果刷的时候提示Writing Protection,大概是这个版本的BIOS有特殊的保护机制
然后我又去驱动页面找了历史的BIOS驱动版本4KCN28WW回来重新安装,安装前在BIOS上打开了一个叫做BIOS BACK FLASH的参数,好像是版本回退相关的参数,不懂但是打开以防万一
然后,只能再想其它办法了。。。

4.换个思路:不修改BIOS?

在上面反编译出的SetupUtility文件中,可以直接搜索BIOS的菜单条目。所以重点关注下Power选项卡下的条目。无奈我在这个文件中没有发现和AC还有Power关键字相关的任何和通电自启的条目。但是在Power下有一个Wake on PMEWake on Modem RingModem Ring好像和电话线相关的,应该是通过打电话开启电脑?另外的一个PME Event Wake Up:Short for Power Management Event(电源管理事件),就是通过操作鼠标、键盘等设备进行开机,而Wake on Lan也是其中一种。
结合文章Step to UEFI (146)Grayoutif ,Suppressif和Setup联动的探索中提到的:

这两个选项都不会影响被设置的Item的设定值,比如,选项隐藏之前是 Enabled 的,那么虽然隐藏掉了, 实际取值还是 Enabled。上面的结论可以通过设置之后进入 Shell 使用 dmpstore 命令查看对应的变量来验证。

虽然BIOS条目被隐藏了,但是实际上变量都是有值的。而在反编译出的文件中,刚好Wake on PME条目的默认值是Enabled。

0xB7854 			Setting: Wake on PME, Variable: 0x86 {05 91 16 15 17 15 02 04 34 12 86 00 04 10 00 01 00}
0xB7865 				Option: Disabled, Value: 0x0 {09 07 0B 03 00 00 00}
0xB786C 				Option: Enabled, Value: 0x1 (default) {09 07 0C 03 10 00 01}
0xB7873 			End of Options {29 02}

没有Wake on AC,而Wake on PME。所以我的解决方案就变成了,不修改BIOS,通过天猫精灵这样的智能家居平台联动Wake on Lan开机。我找到了下面两篇文章:
使用天猫精灵实现计算机WOL网络唤醒
小爱同学网络唤醒(Wake on Lan,WOL)启动电脑

借用第一篇文章里的方案图:
在这里插入图片描述
这里需要家里要有一个软路由或者小型服务器,而我平常没有玩软路由。但是在第二篇文章,提到了他的网件路由器里面刷了梅林?我刚好有一个很垃圾网件路由器躺着吃灰。所以我才发现网件是可以刷软路由的。。。而且在Openwrt官网上找到了对应型号的固件。那就开始着手Wake on Lan

5.Wake on Lan原理

关于Wake on Lan,这里有篇文章写得很全面(有个要点:睡眠模式下的网络唤醒是操作系统负责处理的,而关机后,系统没有运行了嘛,所以网络唤醒交由主板处理):
WOL 网络唤醒避坑指南:常见问题的分析与内容补充
Wake on Lan缩写WOL,大概是关机后,主板仍对网卡保持微弱的供电,在外面看的时候就是关机后网卡灯还亮着,网卡会监听4343。然后我们可以发送一个特定格式的UDP包,一般叫做魔术包,包的格式是用6个FF开头(6个字节),后面跟上网卡的MAC地址重复16遍。网卡的Mac地址也是6个字节。所以加起来就是6+16*6=102个字节。当对应网卡收到这个包的时候,就会开机。
上面提到的智能家居的联动,需要一个家庭路由器/服务器,就是需要我们在上面跑一个API,当智能家居平台调用这个API时,就会触发向内网中发送一个魔术包。具体实现的话,这个API其实就是跑一个服务器,然后暴露一个接口,接口的具体功能就是发送魔术包。上面的文章用的是python脚本写,然而用java、python都是可以写的,很简单。
这里需要注意的一点是,平常我们的路由器使用DHCP服务器,所以网卡的IP地址可能会变。导致我们的魔术包发送不到准确的ip上。有些教程提到可以在路由上绑定网卡的ip和mac地址。以前我有这么试过,但可能是交换机的问题,直接把包发送给对应的ip,有时候不生效。
所以还有另外一个办法,就是向局域网中发送广播包。例如要给192.168.1.1发送魔术包,但是我们不指定这个ip地址,而是发给192.168.1.255,这样在这个局域网192.168.1.0/24内所有的在线的ip都会收到这个包,当然只有mac地址匹配了,对应的机器才会开机。至于局域网内有哪些设备是在线的?直接登录路由器后台就可以看到了

6.尝试Wake on Lan失败

Wake on Lan在Windows下的配置,就是在设备管理器下,选择有线网卡,编辑里面和WOL相关的几个参数,并且勾选Allow this device to wake the computer。我有一个小工具叫做WakeOnLanMonitor,可以监听4343的UDP端口。可以打开这个小工具,然后在安卓端下载WakeOnLan的App,向局域网广播魔术包。这时WakeOnLanMonitor就可以收到魔术包并显示出来。这个工具可以用来检查我们发送的魔术包是否正确。
当设置好网卡后,可以让系统进入Sleep(睡眠),然后测试在Windows系统睡眠的情况下是否能通过网络唤醒。这一步我可以成功。系统进入睡眠后,发送魔术包,键盘灯马上就能亮起。但是关机后,则无法唤醒。这个时候通过登录路由器后台,可以发现,当电脑完成关机后,会马上从路由器后台的在线设备上下掉。说明关机后,主板并没有向网卡供电。
查阅资料后,尝试了以下的办法:

  • 在电源管理中,将"快速启动"取消勾选
  • 在电源管理中,修改高级电源设置,将Link State Power ManagementSettingOff修改为Moderate power saving
    在这里插入图片描述
  • 网卡的属性>高级选项卡中,Green EthernetEnergy-Efficient EthernetPower Saving Mode这些关于节能的选项统统设为Disabled
    无奈尝试了诸多方法,反复开关机后,都无法解决关机后网卡断电的问题,无奈只能回到BIOS的思路上来。因为问题最有可能出在BIOS上

7.修改BIOS成功

我在B站又找到了这个视频:
联想拯救者R9000P 解锁BIOS高级选项 升级内存
视频下方提供了一个国外大神只做的工具:
[TOOL] Lenovo (H20) Bios Unlocker and Locker
视频里和帖子里的拯救者都是最近的较新的型号,用的是最新的图形化BIOS。但是我在帖子里看到,有位老铁的Y700 15-ISK用这个工具解锁成功。这个型号和我的电脑差不多是同一个时间点推出的。抱着试一试的心态,不行的话要么买编程器回来,要么RNM618直接换新了。。。
下载了exe工具下来,以管理员身份运行,运行完后提示The system could not find the environment option that was entere。但是帖子里有提到这一点。所以直接重启按F2,欧了

8.查找唤醒相关的BIOS参数

解锁菜单后,由于BIOS中的条目是在纷繁复杂,由于在SetupUtility的反编译文件同样为我们提供了关于菜单相关的条目,所以从这个文件中找线索。
在这里插入图片描述
搜索Power,最后是直接搜索Wake,发现了这堆内容,厚礼蟹~

0x9FB88 		Suppress If: {0A 82}
0x9FB8A 			Variable 0xAD8 equals 0x20 {12 06 D8 0A 20 00}
0x9FB90 			Setting: DeepSx Power Policies, Variable: 0x4 {05 91 72 0A 73 0A F6 02 05 00 04 00 10 10 00 06 00}
0x9FBA1 				Option: Disabled, Value: 0x0 {09 07 04 00 30 00 00}
0x9FBA8 				Suppress If: {0A 82}
0x9FBAA 					Variable 0xAE3 equals 0x2 {12 86 E3 0A 02 00}
0x9FBB0 						Variable 0xAE3 equals 0x4 {12 06 E3 0A 04 00}
0x9FBB6 						Or {16 02}
0x9FBB8 						Variable 0xAE3 equals 0x3 {12 06 E3 0A 03 00}
0x9FBBE 						Or {16 02}
0x9FBC0 					End {29 02}
0x9FBC2 					Option: Enabled in S4-S5/Battery, Value: 0x3 {09 07 74 0A 00 00 03}
0x9FBC9 					Option: Enabled in S3-S4-S5/Battery, Value: 0x5 {09 07 76 0A 00 00 05}
0x9FBD0 					Option: Enabled in S3-S4-S5, Value: 0x6 {09 07 77 0A 00 00 06}
0x9FBD7 				End If {29 02}
0x9FBD9 				Option: Enabled in S4-S5, Value: 0x4 {09 07 75 0A 00 00 04}
0x9FBE0 			End of Options {29 02}
0x9FBE2 		End If {29 02}
0x9FBE4 		Setting: LAN Wake From DeepSx, Variable: 0x5 {05 91 78 0A 79 0A F7 02 05 00 05 00 10 10 00 01 00}
0x9FBF5 			Option: Enabled, Value: 0x1 {09 07 03 00 00 00 01}
0x9FBFC 			Option: Disabled, Value: 0x0 {09 07 04 00 30 00 00}
0x9FC03 		End of Options {29 02}
0x9FC05 		Suppress If: {0A 82}
0x9FC07 			Variable 0x2F4 equals 0x0 {12 06 F4 02 00 00}
0x9FC0D 			Setting: Wake on LAN Enable, Variable: 0xC {05 91 E9 04 EA 04 F8 02 05 00 0C 00 10 10 00 01 00}
0x9FC1E 				Option: Enabled, Value: 0x1 {09 07 03 00 30 00 01}
0x9FC25 				Option: Disabled, Value: 0x0 {09 07 04 00 00 00 00}
0x9FC2C 			End of Options {29 02}
0x9FC2E 			Setting: SLP_LAN# Low on DC Power, Variable: 0xD {05 91 ED 04 EE 04 F9 02 05 00 0D 00 10 10 00 01 00}
0x9FC3F 				Option: Enabled, Value: 0x1 {09 07 03 00 30 00 01}
0x9FC46 				Option: Disabled, Value: 0x0 {09 07 04 00 00 00 00}
0x9FC4D 			End of Options {29 02}
0x9FC4F 			Setting: K1 off, Variable: 0xE {05 91 EB 04 EC 04 FA 02 05 00 0E 00 10 10 00 01 00}
0x9FC60 				Default: Other {5B 85 00 00 08}
0x9FC65 					Value {5A 82}
0x9FC67 						Variable 0xAD8 equals value in list (0x73, 0x74) {14 8A D8 0A 02 00 73 00 74 00}
0x9FC71 							64 Bit Unsigned Int: 0x1 {45 0A 01 00 00 00 00 00 00 00}
0x9FC7B 							64 Bit Unsigned Int: 0x0 {45 0A 00 00 00 00 00 00 00 00}
0x9FC85 							Conditional {50 02}
0x9FC87 						End {29 02}
0x9FC89 					End {29 02}
0x9FC8B 				End {29 02}
0x9FC8D 				Option: Enabled, Value: 0x1 {09 07 03 00 30 00 01}
0x9FC94 				Option: Disabled, Value: 0x0 {09 07 04 00 00 00 00}
0x9FC9B 			End of Options {29 02}
0x9FC9D 			Setting: EFI Network, Variable: 0x210 {05 91 F9 04 FA 04 FB 02 34 12 10 02 10 10 00 01 00}
0x9FCAE 				Option: Enabled, Value: 0x1 {09 07 03 00 00 00 01}
0x9FCB5 				Option: Disabled, Value: 0x0 {09 07 04 00 30 00 00}
0x9FCBC 			End of Options {29 02}
0x9FCBE 		End If {29 02}
0x9FCC0 		Setting: Wake on WLAN and BT Enable, Variable: 0xF {05 91 EF 04 F0 04 FC 02 05 00 0F 00 10 10 00 01 00}
0x9FCD1 			Option: Enabled, Value: 0x1 {09 07 03 00 00 00 01}
0x9FCD8 			Option: Disabled, Value: 0x0 {09 07 04 00 30 00 00}
0x9FCDF 		End of Options {29 02}
0x9FCE1 		Suppress If: {0A 82}
0x9FCE3 			Variable 0x2FC equals 0x0 {12 06 FC 02 00 00}
0x9FCE9 			Setting: DeepSx Wake on WLAN and BT Enable, Variable: 0x10 {05 91 F1 04 F2 04 FD 02 05 00 10 00 10 10 00 01 00}
0x9FCFA 				Option: Enabled, Value: 0x1 {09 07 03 00 00 00 01}
0x9FD01 				Option: Disabled, Value: 0x0 {09 07 04 00 30 00 00}
0x9FD08 			End of Options {29 02}
0x9FD0A 		End If {29 02}

在BIOS下找到对应的条目,藏在Advanced>PCH-IO Configuration下。百度了下,pch全称为Platform Controller Hub,是intel公司的集成南桥。我没搞懂为什么会藏在这里?
在这里插入图片描述

挨个解释下这三条内容

  • DeepSx Power Policies:
    网上搜到的文件:ipc_bios_user_manual_en-US.pdf
    里面提到了:If enabled (Enabled), the devices switches itself to idle state, a mode with the lowest power consumption.如果启用 (Enabled),设备会将自身切换到空闲状态,这是一种功耗最低的模式。
    这个条目一共有如下的选项
    在这里插入图片描述
  • LAN Wake From DeepSx
    DeepSx的意思是Deep Sleep State,直译过来就是深度睡眠状态,所以LAN Wake From DeepSx整句话翻译过来就是深度睡眠状态下的局域网唤醒
  • Wake on WLAN and BT Enable:
    WLAN:就是无线拉,BT就是Bluetooth蓝牙

找到这里,基本上可以认为离成功只差一步之遥了。首先DeepSx Power Policies肯定要开的,看字面意思,直接S4-S5就可以,S4是休眠状态,S5是关机状态。关于这部分内容,上面这篇文章有提到:WOL 网络唤醒避坑指南:常见问题的分析与内容补充。然后就是LAN Wake From DeepSx要Enabled,这就解决了嘛~

结果却出乎意料:在漫长的开机关机过程中,尝试了这三个条目的所有选项,都没能搞定关机后网卡断电的问题。怀疑是在Power的选项上出了问题:主板是硬件,而BIOS是软件,当修改了具体的BIOS参数后,硬件肯定无法主动识别到相关的修改,肯定是由BIOS去触发相应的电路开关进行修改。而曾经的Power选项是隐藏的,是否BIOS从未触发修改过这些隐藏的数值?所以尝试,将Wake on PME的Enabled设置为Disabled,开关机后,重新设置为Enabled,仍然无效

9.Wake on AC

折腾到这里已经晚上11点了,累的一笔。打算放弃,洗澡上床睡觉。结果洗澡的时候灵光闪现,恍恍惚惚中想到了偶然看到的State After G3这个参数。
这里头点进去,有两个选项,S0和S5,分别对应开机和关机

在这里插入图片描述
State After G3:G3这个状态好像是系统异常关机,例如停电之类的偶然事件导致的关机。所以为啥里头有一个S0呢?试试看?把这个值设置为S0,行不行就看G3这个状态如何定义了。如果关机后关闭插座电源也属于G3状态,那就妥了。但是又觉得不太合理?洗完澡,抱着试一试的心态,已经不抱什么希望了。关机,关电源插座,开插座,键盘灯亮了,它居然亮了?

最后就是在天猫精灵中设置每天晚上0点关闭插座,这样第二天只要唤醒插座,电脑就会自动开机了


总结

State After G3

虽然成功实现了通电自启,但是这个开关State After G3看名字好像不是给通电开机用的。不知道打开这个东西会不会对硬件造成损坏(电压不稳之类的),然而我对硬件也不太懂,有机会再做进一步研究把,但愿我的拯救者还能再活五百年

Wake on Lan

折腾Wake on Lan花了很长时间,最后没有效果很郁闷,想了下大概有几个原因把,等有机会再来更新:

  • 我用FPTW64刷BIOS刷出问题了
  • 大神的Unlock执行文件把BIOS改出问题了
  • 要实现WOL,还有其它BIOS开关要打开(感觉是这个)
  • 这个BIOS对WOL的适配有问题
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐