zoukankan      html  css  js  c++  java
  • [转发]dsdt解决睡眠唤醒死机

    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

  • 相关阅读:
    Java 基本知识
    开源框架 Java
    Java 常用工具
    centos7设置静态IP
    VMnet1、VMnet8到底是什么?
    centos7修改主机名的方法
    防火墙阻止了虚拟机与主机之间互相ping通解决方案
    虚拟机centos与主机互相Ping通
    centos个性化命令行提示符
    更多的常用命令
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/3855530.html
Copyright © 2011-2022 走看看