DSDT解决睡眠唤醒的发现
曾经看到过一位大佬的帖子,睡眠唤醒问题,尤其在笔记本上,很多都是USB的问题。有一部分是因为USB遮蔽所导致的,但有些即使USB接口全部正常还是会出现睡眠秒醒或者唤醒死机的问题。一般问题出在DSDT中对应硬件的_PRW方法上。很多时候直接把这玩意儿删了问题就解决了(就是0x6D和0x0D的补丁)。比如删掉下面这个Method:Device (XHC){
......
Method (_PRW, 0, NotSerialized)// _PRW: Power Resources for Wake
{
Return (GPRW (0x6D, 0x03))
}
......
}
但这样做只能通过按电源按键唤醒,USB被完全屏蔽。根据那位大佬所说,第一个参数除了少数几个会影响睡眠的硬件之外,其他的都是0x69,所以我先改了第一个参数。但经过数次改动实验之后发现,并不能解决问题。所以我主要改了第二个参数。
首先在终端用log show -style syslog | grep "Wake reason"看唤醒的硬件是啥(我的是XHC,USB总线),然后在DSDT中搜Device (XHC),在里面找到_PRW方法。
一开始我把第二个参数全改成了和后面一样的0x04,依旧没解决问题。知道我看到了另一个方法:
Method (_S0W, 0, NotSerialized)// _S0W: S0 Device Wake State
{
If (LEqual (XFLT, Zero))
{
Return (Zero)
}
Else
{
Return (0x03)
}
}
看到后面的注释我觉得我可能找对了地方。既然这个方法决定设备唤醒状态,还有熟悉的if else语句......既然一个参数不行那就换另一个......然后就成了???虽然一直以为0x00会无法唤醒,但事实上现在不仅可以睡眠,甚至还可以用鼠标键盘唤醒。
不太确定是不是每一个硬件都有_S0W方法,是不是都有这样判断语句,也不知道是不是运气好......但是我确实搞定了两个阻止睡眠的硬件,一个是XHC,另一个是HDEF(似乎是音频有关)。这个是原来的:
Name (_S0W, 0x03)// _S0W: S0 Device Wake State
......
Method (_PRW, 0, NotSerialized)// _PRW: Power Resources for Wake
{
Return (GPRW (0x6D, 0x04))
}
把第二个参数改成0x03就解决了问题。
不知道这个方法能不能适用所有的电脑,希望有大佬帮忙试试,感谢。
就喜欢这种探索精神 有空我也开机试试看看{:5_262:} 楼主可以参考下我之前发的评论:https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1795909&extra=&highlight=USB&page=4 xc233 发表于 2019-5-17 10:41
楼主可以参考下我之前发的评论:https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1795909&extra=&high ...
感谢,之前说的就是这个帖子……寒假的时候做的实验,但只看懂了注释,参数传递一头雾水完全没懂,后来就一直没研究了…… xc233 发表于 2019-5-17 10:41 https://www.pcbeta.com/static/image/common/back.gif
楼主可以参考下我之前发的评论:https://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1795909&extra=&high ...
课上仔细看了一下我的DSDT,比较尴尬的是没找到_L6D这个方法,估计也是如你所说直接Notify(XHC,0x02)了,但是现在却可以正常睡眠,同时使用usb键鼠唤醒。不知道你能不能帮我看一下,有没有研究价值......
mark一下,学习 zty199 发表于 2019-5-17 13:04 https://www.pcbeta.com/static/image/common/back.gif
课上仔细看了一下我的DSDT,比较尴尬的是没找到_L6D这个方法,估计也是如你所说直接Notify(XHC,0x02)了, ...
你确定你电脑确实是进入了深度睡眠? 就喜欢这种探索精神 xc233 发表于 2019-5-18 18:19
你确定你电脑确实是进入了深度睡眠?
额,风扇停转,只有电源灯闪,硬盘应该也停了。和windows睡眠一样的。不知道算不算深度睡眠? 感谢分享! 我是采用第一种方式的,只能用开机键唤醒 到底改哪儿啊,_PRW还是S0W啊 mark一下,学习 一开始我把第二个参数全改成了和后面一样的0x04,依旧没解决问题。
把第二个参数改成0x03就解决了问题。
能否详细说明修改哪个方法,怎么修改,变更前后插图对比,说实话,我没看懂你到底是修改S0W还是修改了PRW 帅来也 发表于 2019-5-28 09:05 https://www.pcbeta.com/static/image/common/back.gif
能否详细说明修改哪个方法,怎么修改,变更前后插图对比,说实话,我没看懂你到底是修改S0W还是修改了P ...
修改的是_PRW方法,把return的第二个参数改了。修改的参数值可以参考_S0W或者_S3W类似的方法,里面有。
截图就不放了......因为更新了几次系统之后,参数不改甚至都可以正常睡眠唤醒,这可能是个玄学问题......{:5_299:} 所以可以使用热补丁的形式来完成嘛? 就是喜欢这样的探索精神 1286603273 发表于 2019-6-2 18:26 https://www.pcbeta.com/static/image/common/back.gif
所以可以使用热补丁的形式来完成嘛?
好像不行,热补丁好像是可以统一把这个_PRW删掉,但是每一个有问题的函数返回的参数值不一定一样,建议一个一个单独看看......或者就干脆删掉省事 zty199 发表于 2019-6-2 22:06
好像不行,热补丁好像是可以统一把这个_PRW删掉,但是每一个有问题的函数返回的参数值不一定一样,建议一 ...
我记得热补丁可以单独修理某一个位置的数据
页:
[1]
2