dsdt解决睡眠唤醒死机

首先,感谢x5115x提供了一个相对比较完整的THINKPAD T410在MAC下的DSDT修改的详细教程!使得很多略有程序代码经验的T410使用者能够自己动手修改DSDT。

在x5115x的帖子中,提到了以下几个修改:
1)添加DGTP;
2)修改LPC,支持原生电源管理;
3)修改RTC,防止CMOS重置;
4)添加显卡代码(我用了少量的代码+变色龙自动侦测,使得机器可以支持VGA的镜像输出);
5)添加关机断电代码;
6)添加声卡代码;

这些修改对于T410能跑MAC是非常重要和必须的。

经过长达一年多的使用实践,很多朋友都发现目前T410的DSDT虽然可以让机器比较正常地跑,但是确实还有不少毛病(感觉不够完美)。比如:
1)连续多次的睡眠唤醒后,偶尔死机。
2)睡眠唤醒之后,插入U盘死机。

虽然我们可以设置不让机器睡眠,从而避免死机的问题出现。但是,从完美角度来说,毕竟这是一块心病!

从DSDT修改的角度,一方面是尽量向MAC的DSDT靠近。但是从另一方面来说,也得充分考虑到硬件自身的一些特性参数。因此,生搬硬套DSDT的修改代码,的确会造成系统在使用中偶尔出现(甚至频繁出现)的毛病。

MAC OSX系统会在读取DSDT.AML文件之后,加载其中与硬件对应的“设备”。因此,我们可以通过IORegistryExplorer软件来查看加载的“设备”,并从中读取其相应的参数。这就为我们修改DSDT提供了一个非常方便的参考。

经过频繁的试验,发现T410的2个EHCI设备的DSDT参数设置不正确,是造成T410黑苹果睡眠唤醒后死机(包括插入U盘死机)现象的主要原因。

我们分析一下:在Device (EHC1)和Device (EHC2)中,我们在DSDT里面一般会各添加一段Method (_DSM, 4, NotSerialized)代码,俗称“USB内建”。代码如下:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0x0F)
  4. {
  5. “device-id”,
  6. Buffer (0×04)
  7. {
  8. 0×34, 0x3A, 0×00, 0×00
  9. },
  10. “AAPL,clock-id”,
  11. Buffer (One)
  12. {
  13. 0x0A
  14. },
  15. “built-in”,
  16. Buffer (One)
  17. {
  18. 0×00
  19. },
  20. “device_type”,
  21. Buffer (0×05)
  22. {
  23. ”EHCI”
  24. },
  25. “AAPL,current-available”,
  26. 0x04B0,
  27. “AAPL,current-extra”,
  28. 0x02BC,
  29. “AAPL,current-in-sleep”,
  30. 0x03E8,
  31. Buffer (One)
  32. {
  33. 0×00
  34. }
  35. }, Local0)
  36. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  37. Return (Local0)
  38. }

复制代码

很多人就直接复制粘贴而不做任何修改。虽然看起来运行正常,而实际上给睡眠唤醒之后的死机、以及唤醒之后插入U盘的死机造成了很大的隐患!

从IORegistryExplorer软件中,我们实际上可以看到EHC1和EHC2下还有一些未被用到的USB2.0端口(如:EHCI Root Hub Simulation@1D)。这些被红线框起来的参数是系统自动读取的,也就是说端口的参数本来就是这些值。

在上图,可以看到很多参数都是上面的DSDT代码中没有的,如”AAPL,device-internal”,”AAPL,max-port-current-in-sleep”,”AAPL,standard-port-current-in-sleep”。我们还会发现以上DSDT代码中的三个AAPL的值也与之不同,也就是说DSDT中的参数不正确!

同时,在WINDOWS中,我们使用AIDA64软件生成一个硬件的报告,从该报告中可以查到T410的EHC1和EHC2的设备ID分别是0x3B34和0x3B3C。因此,我们需要对以上代码进行修正。

其中EHC1部分修正之后如下:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×13)
  4. {
  5. “device-id”,
  6. Buffer (0×04)
  7. {
  8. 0×34, 0x3B, 0×00, 0×00
  9. },
  10. “AAPL,clock-id”,
  11. Buffer (One)
  12. {
  13. 0×01
  14. },
  15. “device_type”,
  16. Buffer (0×05)
  17. {
  18. ”EHCI”
  19. },
  20. “AAPL,current-available”,
  21. 0x05DC,
  22. “AAPL,current-extra”,
  23. 0x04B0,
  24. “AAPL,current-extra-in-sleep”,
  25. 0x03E8,
  26. “AAPL,device-internal”,
  27. 0×02,
  28. “AAPL,max-port-current-in-sleep”,
  29. 0x3E8,
  30. “AAPL,standard-port-current-in-sleep”,
  31. 0X1F4,
  32. Buffer (One)
  33. {
  34. 0×00
  35. }
  36. }, Local0)
  37. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  38. Return (Local0)
  39. }

复制代码

而EHC2部分修正之后为:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×13)
  4. {
  5. “device-id”,
  6. Buffer (0×04)
  7. {
  8. 0x3C, 0x3B, 0×00, 0×00
  9. },
  10. “AAPL,clock-id”,
  11. Buffer (One)
  12. {
  13. 0×02
  14. },
  15. “device_type”,
  16. Buffer (0×05)
  17. {
  18. ”EHCI”
  19. },
  20. “AAPL,current-available”,
  21. 0x05DC,
  22. “AAPL,current-extra”,
  23. 0x04B0,
  24. “AAPL,current-extra-in-sleep”,
  25. 0x03E8,
  26. “AAPL,device-internal”,
  27. 0×02,
  28. “AAPL,max-port-current-in-sleep”,
  29. 0x3E8,
  30. “AAPL,standard-port-current-in-sleep”,
  31. 0X1F4,
  32. Buffer (One)
  33. {
  34. 0×00
  35. }
  36. }, Local0)
  37. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  38. Return (Local0)
  39. }

复制代码

至此,我们应该来说比较完美地解决了EHC1和EHC2两个设备的硬件参数在DSDT中的相应代码修改。至少在今天一整天的多次睡眠唤醒后,插入/拔出U盘(有读写动作)、同时使用USB打印机,未发现死机现象。

二楼将补充关于IRQ、FIREWIRE提示、SMBUS、有线网卡内建、SATA内建、Fn键、小太阳、合盖睡眠、按电源键睡眠、关机断电等DSDT修改。

至于新版DSDT,我将继续测试几天之后,如果相对稳定了,就上传。

特别感谢LeoGray坛友提供的“插入U盘死机”信息!!

=====================================
新版T410的DSDT在此下载。此DSDT基于1.44版白名单BIOS,并精简掉了Device (LPT)和Device (ECP),因为即使有这2段代码也加载不了。从理论上来说,不会影响刷其他版本BIOS的机器。请使用后反馈状况!

<ignore_js_op> T410-RT8-DSDT-201301151452-连续睡眠唤醒OK.zip (74.74 KB, 下载次数: 759) 
该DSDT支持变色龙与CLOVER启动!!!

关于CLOVER引导的方法,见http://bbs.pcbeta.com/viewthread-1268481-1-1.html

另,本DSDT无论使用变色龙、或者使用CLOVER引导启动,都需要启动这两个引导的显卡自动侦测功能。即:变色龙的GraphicsEnabler=Yes,CLOVER的GraphicsInjector=Yes,【适用于NVS3100M显卡】。

我的使用情况:
1)启动运行正常;
2)自动睡眠唤醒正常;
3)合盖睡眠唤醒正常;
4)Fn+F4睡眠唤醒正常;
5)唤醒后插入U盘读写正常;
6)连续多种睡眠唤醒正常;
7)长时间睡眠唤醒正常;

注:我的机器型号是T410-2522-RT8,NVS3100M独显。若是集显或者双显卡的T410,建议参考本贴为主。

补充关于IRQ、FIREWIRE提示、SMBUS、有线网卡内建、SATA内建、Fn键、小太阳、睡眠等

本帖最后由 gcafrk 于 2013-1-27 23:27 编辑

补充关于IRQ、FIREWIRE提示、SMBUS、有线网卡内建、SATA内建、Fn键、小太阳、按电源键睡眠、关机断电、指纹驱动等DSDT修改。

一、关于IRQ
1)HPET的IRQ。由于i5-520m是双核四线程CPU,它需要4个IRQ。我们参考DSDTSE或者DSDT Editor中的说明,添加2个IRQ(0和8),同时也参考其他帖子,再为其增加2个IRQ(11和15),则代码变成:

  1. Device (HPET)
  2. {
  3. Name (_HID, EisaId (“PNP0103″))
  4. Method (_STA, 0, NotSerialized)
  5. {
  6. Return (0x0F)
  7. }
  8. Name (_CRS, ResourceTemplate ()
  9. {
  10. IRQNoFlags ()
  11. {0}
  12. IRQNoFlags ()
  13. {8}
  14. IRQNoFlags ()
  15. {11}
  16. IRQNoFlags ()
  17. {15}
  18. Memory32Fixed (ReadOnly,
  19. 0xFED00000,         // Address Base
  20. 0×00000400,         // Address Length
  21. )
  22. })
  23. }

复制代码

2)RTC的IRQ,需要删除。删除之后的代码如下:

  1. Device (RTC)
  2. {
  3. Name (_HID, EisaId (“PNP0B00″))
  4. Name (_CRS, ResourceTemplate ()
  5. {
  6. IO (Decode16,
  7. 0×0070,             // Range Minimum
  8. 0×0070,             // Range Maximum
  9. 0×01,               // Alignment
  10. 0×02,               // Length
  11. )
  12. })
  13. }

复制代码

3)TIMR的IRQ,需要删除。删除之后的代码如下:

  1. Device (TIMR)
  2. {
  3. Name (_HID, EisaId (“PNP0100″))
  4. Name (_CRS, ResourceTemplate ()
  5. {
  6. IO (Decode16,
  7. 0×0040,             // Range Minimum
  8. 0×0040,             // Range Maximum
  9. 0×01,               // Alignment
  10. 0×04,               // Length
  11. )
  12. })
  13. }

复制代码

二、Firewire(火线)启动日志FireWire runtime power conservation disabled去除:

1)在IORegistryExplorer中查询到火线Firewire的位置:在EXP5。因此,在DSDT的Device (EXP5)的Method (_PRT, 0, NotSerialized)之前,添加以下代码:

  1. Device (FRWR)
  2. {
  3. Name (_ADR, 0×03)
  4. Name (_GPE, 0x1A)
  5. Method (_DSM, 4, NotSerialized)
  6. {
  7. Store (Package (0×02)
  8. {
  9. ”fwhub”,
  10. Buffer (0×04)
  11. {
  12. 0×00, 0×00, 0×00, 0×00
  13. }
  14. }, Local0)
  15. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  16. Return (Local0)
  17. }
  18. }

复制代码

2)在Scope (_GPE)中添加以下代码:

  1. Method (_L1A, 0, NotSerialized)
  2. {
  3. Notify (\_SB.PCI0.EXP5.FRWR, Zero)
  4. }

复制代码

三、SMBUS:在T410的DSDT原始代码中,SMBUS只有以下这些:

  1. Device (SMBU)
  2. {
  3. Name (_ADR, 0x001F0003)
  4. Name (_S3D, 0×03)
  5. Name (RID, 0×00)
  6. }

复制代码

我们需要将其改成:

  1. Device (SMBU)
  2. {
  3. Name (_ADR, 0x001F0003)
  4. Name (_S3D, 0×03)
  5. Name (RID, Zero)
  6. Device (BUS0)
  7. {
  8. Name (_CID, “smbus”)
  9. Name (_ADR, Zero)
  10. Device (DVL0)
  11. {
  12. Name (_ADR, 0×57)
  13. Name (_CID, “diagsvault”)
  14. }
  15. }
  16. Method (_DSM, 4, NotSerialized)
  17. {
  18. Store (Package (0×04)
  19. {
  20. “name”,
  21. Buffer (0x0D)
  22. {
  23. ”pci8086,3a30″
  24. },
  25. “device-id”,
  26. Buffer (0×04)
  27. {
  28. 0×30, 0x3A, 0×00, 0×00
  29. }
  30. }, Local0)
  31. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  32. Return (Local0)
  33. }
  34. }

复制代码

四、有线网卡内建:
在Device (IGBE)中添加有线网卡内建代码,最终Device (IGBE)如下:

  1. Device (IGBE)
  2. {
  3. Name (_ADR, 0×00190000)
  4. Name (_S3D, 0×03)
  5. Name (RID, Zero)
  6. Name (_PRW, Package (0×02)
  7. {
  8. 0x0D,
  9. 0×04
  10. })
  11. Method (_DSM, 4, NotSerialized)
  12. {
  13. Store (Package (0×06)
  14. {
  15. “built-in”,
  16. Buffer (One)
  17. {
  18. 0×01
  19. },
  20. “device_type”,
  21. Buffer (0×09)
  22. {
  23. ”ethernet”
  24. },
  25. “name”,
  26. Buffer (0×16)
  27. {
  28. ”Intel 82577LM Gigabit”
  29. }
  30. }, Local0)
  31. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  32. Return (Local0)
  33. }
  34. }

复制代码

五、SATA内建:
* T410原始DSDT的SATA代码并未带有内建代码,因此,为Device (SAT1)和Device (SAT2)其添加以下部分:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×02)
  4. {
  5. “device-id”,
  6. Buffer (0×04)
  7. {
  8. 0x2F, 0x3B, 0×00, 0×00
  9. }
  10. }, Local0)
  11. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  12. Return (Local0)
  13. }

复制代码

六、添加Fn键功能:
* 找到Device (KBD),在其中添加:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×02)
  4. {
  5. ”AAPL,has-embedded-fn-keys”,
  6. Buffer (0×04)
  7. {
  8. 0×01, 0×00, 0×00, 0×00
  9. }
  10. }, Local0)
  11. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  12. Return (Local0)
  13. }

复制代码

七、关于小太阳:

*T410用的是ScrLk和Pause两个按键来调节显示器的亮度。需要在Scope (_SB)中添加以下代码,我添加的位置是在Method (_INI, 0, NotSerialized)之后,在Device (LNKA)之前:

  1. Device (PNLF)
  2. {
  3. Name (_HID, EisaId (“APP0002″))
  4. Name (_CID, “backlight”)
  5. Name (_UID, 0x0A)
  6. Name (_STA, 0x0B)
  7. }

复制代码

八、按电源键睡眠:

* 在Device (SLPB)之前添加:

  1. Device (PWRB)
  2. {
  3. Name (_CID, EisaId (“PNP0C0C”))
  4. Name (_UID, 0xAA)
  5. Method (_STA, 0, NotSerialized)
  6. {
  7. Return (0x0B)
  8. }
  9. }

复制代码

九、关机断电:

在Method (_PTS, 1, NotSerialized)之前,添加以下代码:【注意第一行的0×1030是T410专用的,相关资料看我的日志】

  1. OperationRegion (PMRS, SystemIO, 0×1030, 0×13)
  2. Field (PMRS, ByteAcc, NoLock, Preserve)
  3. {
  4. ,   4,
  5. SLPE,   1
  6. }

复制代码

同时,在Method (_PTS, 1, NotSerialized)中的If (LEqual (Arg0, 0×05))里面添加非常关键的两行:

  1. Store (Zero, SLPE)
  2. Sleep (0×10)

复制代码

之后,完整的代码如下:

  1. If (LEqual (Arg0, 0×05))
  2. {
  3. TRAP ()
  4. TPHY (0×02)
  5. AWON (0×05)
  6. Store (Zero, SLPE)
  7. Sleep (0×10)
  8. }

复制代码

十、添加指纹设备:搜索:FPU,在代码:

  1. Name (_HID, EisaId (“PNP0C04″))
  2. Name (_CRS, ResourceTemplate ()
  3. {
  4. IO (Decode16,
  5. 0x00F0,             // Range Minimum
  6. 0x00F0,             // Range Maximum
  7. 0×02,               // Alignment
  8. 0×02,               // Length
  9. )
  10. IRQNoFlags ()
  11. {13}
  12. })

复制代码

下面加入内建USB代码:

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×02)
  4. {
  5. “device-id”,
  6. Buffer (0×04)
  7. {
  8. 0×16, 0×20, 0×00, 0×00
  9. }
  10. }, Local0)
  11. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  12. Return (Local0)
  13. }

IORegistryExplorer中看不到LPT和ECP设备,果断删除DSDT中的Device (LPT)和Device (ECP)。试验效果不错,不影响。决定T410的新版DSDT可以删除这两个Device。

* 关于显卡代码,我只在Device (PEG)设备下的Device (VID)中添加了以下代码,然后启用变色龙的GraphicsEnabler=yes。

  1. Method (_DSM, 4, NotSerialized)
  2. {
  3. Store (Package (0×06)
  4. {
  5. ”@0,built-in”,
  6. Buffer (0×04)
  7. {
  8. 0×01, 0×00, 0×00, 0×00
  9. },
  10. ”@0,backlight-control”,
  11. Buffer (0×04)
  12. {
  13. 0×01, 0×00, 0×00, 0×00
  14. },
  15. ”@0,pwm-info”,
  16. Buffer (0×14)
  17. {
  18. /* 0000 */    0×01, 0×14, 0×00, 0×64, 0xA8, 0×61, 0×00, 0×00,
  19. /* 0008 */    0×08, 0×52, 0×00, 0×00, 0×01, 0×00, 0×00, 0×00,
  20. /* 0010 */    0×00, 0×04, 0×00, 0×00
  21. }
  22. }, Local0)
  23. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  24. Return (Local0)
  25. }

复制代码

有人可能需要更多更长的显卡代码,这里就暂时不做更多讨论了。

* 关于原生CPU电源管理AppleLPC,正确代码如下:

  1. Device (LPC)
  2. {
  3. Name (_ADR, 0x001F0000)
  4. Method (_DSM, 4, NotSerialized)
  5. {
  6. Store (Package (0×02)
  7. {
  8. “device-id”,
  9. Buffer (0×04)
  10. {
  11. 0×07, 0x3B, 0×00, 0×00     //3B07是Intel mobile 5/3400
  12. }
  13. }, Local0)
  14. DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  15. Return (Local0)
  16. }

复制代码

原链接:

http://www.91know.com/wordpress/?p=209

[转发]dsdt解决睡眠唤醒死机的更多相关文章

  1. 解决Android-studio假死机建议

    背景 终于第一个ios app发布应用商店送审了,这下也有时间把以前写的android更新一版,但是很久没遇到的as假死机问题又各种折腾了一天..最终解决的方法实在是让人忍无可忍,实在是想写下来给那些 ...

  2. windows server 2012 开机运行一段时间死机的故障

    环境: 物理机:华为2288 V5 虚拟化:esxi 6.5.2 虚拟操作系统 windwos server 2012 标准版 内安装sql server 和其他应用软件 故障描述:window se ...

  3. php-fpm死机解决办法,脚本后台自动重启

    本人用nginx+php7搭建了一台服务器,因为请求量太大,而且php里面又有挂起的任务,导致php-fpm在高峰期的时候经常死掉,吧php-fpm的最大进程数已经改到1000了,还是吃不消,cpu也 ...

  4. 一则Gedit死机引起的错误之解决

    一次,虚拟机中CentOS不明原因死机了,终端打开不能操作,SecureCRT和从SecureCRT中运行的托关于本机Windows下的Xming下的gedit也死掉了,无奈只能强制关机.重新启动后其 ...

  5. [vmware]另类解决vmware关闭win10死机或蓝屏问题

    升级win10后在使用虚拟机发生一个问题,本人的win10版本为win10 9879, 在使用vmware时,当关机会整个系统死机,在网上搜索后发现这是由于win10内核升级导致vmware不兼容,最 ...

  6. linux mint 18.3设置分辨率死机问题的解决方法

    linux mint 18.3由高分辨率设置为低分辨率的时候,会出现死机现象. 解决方法是:使用命令行: xrandr 查询所有支持的分辨率 然后通过 xrandr -s 1920x1080_59.9 ...

  7. 关于单片机编程里面调用sprintf死机的解决方法及原因分析

    好久之前的做的笔记,这里贴出. char String[100];//直接用数组代替指针即可解决 下面代代码下载至单片机中,发现会出现单片机死机问题 #include "stdio.h&qu ...

  8. win7蓝屏死机0x0000003B错误蓝屏故障解决

    win7蓝屏死机0x0000003B错误蓝屏故障解决 刚才一个朋友问我:电脑蓝屏了怎么办. 我问他要了电脑的截图,自己看了错误代码:0x0000003B 搜索资料,查询了一番.都是说电脑中病毒或者是系 ...

  9. Ubuntu死机解决方法汇总

    为什么不建议强制关机 如果长按电源按键强制关机,有可能损坏硬件或者丢失数据,甚至导致磁盘坏道! 其实, 大部分时候的死机是假死, 不是真死... 有时候鼠标还能动呢. 还有一个原因: 对于平时忠贞不二 ...

随机推荐

  1. JavaScript的理解记录(3)

    ---接上篇 一.函数:    1. 函数定义后直接执行:var f = (function(x){ return x*10}(10)); 2. 函数的调用有四种方式: 作为函数:作为方法:作为构造函 ...

  2. RHCE认证考试教材

    前段时间考RHCE7,顺便给大家分享下RHCE6.7的中文教材!毕竟此书是官方的培训教材,还是值得看看!RHEL6.7承前启后的,给个赞! 下载:http://pan.baidu.com/s/1nu9 ...

  3. C++11的default和delete关键字

    C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看. [default关 ...

  4. import random 模块导入

    import random print(random.random()) #浮点数值 print(random.randint(1,2))#循环显示1,2 print(random.randrange ...

  5. 给li设置float浮动属性之后,无法撑开外层ul的问题。(原址:http://www.cnblogs.com/cielzhao/p/5781462.html)

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  6. 【转】css布局居中和CSS内容居中区别和对应DIV CSS代码

    原文地址:http://www.divcss5.com/jiqiao/j771.shtml css布局居中和CSS内容居中区别和对应DIV CSS代码教程与图文代码案例篇 对于新手来说DIV CSS布 ...

  7. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)

    xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击  或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...

  8. AndroidPn

    客户端的主要包说明 org.androidpn.client包下的文件 public class Constants {  //包含静态数据 public class InvalidFormatExc ...

  9. 控件(弹出类): FlyoutBase, Flyout, MenuFlyout

    1.FlyoutBase(基类) 的示例Controls/FlyoutControl/FlyoutBaseDemo.xaml <Page x:Class="Windows10.Cont ...

  10. java的 clone方法

    1.java语言中没有明确提供指针的概念与用法,而实质上每个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如果取操作这个指针而已. 2.在java中处理基本数据类型时,都是 ...