[轉發]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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM