联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
时间:2023-07-02 21:37:00
联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
文章目录
- 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC
- 说明
- 一、我的电脑
- 二、详细流程
-
- 1.BIOS选项
- 2.查阅改BIOS的资料
- 3.修改BIOS失败
- 4.改变想法:不修改:BIOS?
- 5.Wake on Lan原理
- 6.尝试Wake on Lan失败
- 7.修改BIOS成功
- 8.找到相关的唤醒BIOS参数
- 9.Wake on AC
- 总结
-
- State After G3
- Wake on Lan
说明
我对硬件和系统的底部一无所知。这个简单的功能已经折腾了两天了。所以我想写一本日志。日志很杂,但我发现B站的救援人员官方账户有150个w粉丝,所以挂在博客上,希望对大家有所帮助。
本文涉及对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只会显示Information
、Configuration
、Security
、Boot
、Exit
几张选项卡。当我发现别人时BIOS有很多参数,我自己只有一点,我意识到这些参数应该被隐藏起来。然后解锁这些隐藏的菜单,进入正确的菜单BIOS的修改过程
2.查阅改BIOS的资料
一开始,我在哔哩哔哩找到了两段视频(感谢万能哔哩哔哩):
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,所以去官网找最新的驱动。但我的电脑似乎被联想淘汰了,找不到我的R只能下载720驱动页面Y520的4KCN45WW安装。安装后,按照视频的方法重新操作,但在提取中SetupUtility反编译时,直接死循环。。。无奈只能通过上面提到的FPTW我刚开始备份的464工具KCN23WW驱动刷回去,刷的时候提示Writing Protection,大概是这个版本的BIOS有特殊的保护机制
然后我去驱动页面找历史BIOS驱动版本4KCN28WW回来重新安装,安装前BIOS上打开一个叫做BIOS BACK FLASH
参数,似乎是版本回归相关的参数,懂,但打开以防万一
然后,我只能想办法。
4.改变想法:不修改:BIOS?
反编译在上面SetupUtility可以直接搜索文件BIOS菜单条目。所以要注意Power
选项卡下的条目。但是我在这份文件中没有找到和AC
还有Power
任何与通电自启相关的关键词条目。Power
下有一个Wake on PME
和Wake on Modem Ring
,Modem 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 Management
的Setting
从Off
修改为Moderate power saving
- 网卡的属性>高级选项卡中,
Green Ethernet
、Energy-Efficient Ethernet
、Power 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的适配有问题