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內建”。代碼如下:
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0x0F)
- {
- “device-id”,
- Buffer (0×04)
- {
- 0×34, 0x3A, 0×00, 0×00
- },
- “AAPL,clock-id”,
- Buffer (One)
- {
- 0x0A
- },
- “built-in”,
- Buffer (One)
- {
- 0×00
- },
- “device_type”,
- Buffer (0×05)
- {
- ”EHCI”
- },
- “AAPL,current-available”,
- 0x04B0,
- “AAPL,current-extra”,
- 0x02BC,
- “AAPL,current-in-sleep”,
- 0x03E8,
- Buffer (One)
- {
- 0×00
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
復制代碼
很多人就直接復制粘貼而不做任何修改。雖然看起來運行正常,而實際上給睡眠喚醒之后的死機、以及喚醒之后插入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部分修正之后如下:
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0×13)
- {
- “device-id”,
- Buffer (0×04)
- {
- 0×34, 0x3B, 0×00, 0×00
- },
- “AAPL,clock-id”,
- Buffer (One)
- {
- 0×01
- },
- “device_type”,
- Buffer (0×05)
- {
- ”EHCI”
- },
- “AAPL,current-available”,
- 0x05DC,
- “AAPL,current-extra”,
- 0x04B0,
- “AAPL,current-extra-in-sleep”,
- 0x03E8,
- “AAPL,device-internal”,
- 0×02,
- “AAPL,max-port-current-in-sleep”,
- 0x3E8,
- “AAPL,standard-port-current-in-sleep”,
- 0X1F4,
- Buffer (One)
- {
- 0×00
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
復制代碼
而EHC2部分修正之后為:
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0×13)
- {
- “device-id”,
- Buffer (0×04)
- {
- 0x3C, 0x3B, 0×00, 0×00
- },
- “AAPL,clock-id”,
- Buffer (One)
- {
- 0×02
- },
- “device_type”,
- Buffer (0×05)
- {
- ”EHCI”
- },
- “AAPL,current-available”,
- 0x05DC,
- “AAPL,current-extra”,
- 0x04B0,
- “AAPL,current-extra-in-sleep”,
- 0x03E8,
- “AAPL,device-internal”,
- 0×02,
- “AAPL,max-port-current-in-sleep”,
- 0x3E8,
- “AAPL,standard-port-current-in-sleep”,
- 0X1F4,
- Buffer (One)
- {
- 0×00
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
復制代碼
至此,我們應該來說比較完美地解決了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修改。
復制代碼 2)RTC的IRQ,需要刪除。刪除之后的代碼如下:
復制代碼 3)TIMR的IRQ,需要刪除。刪除之后的代碼如下:
復制代碼 二、Firewire(火線)啟動日志FireWire runtime power conservation disabled去除: 1)在IORegistryExplorer中查詢到火線Firewire的位置:在EXP5。因此,在DSDT的Device (EXP5)的Method (_PRT, 0, NotSerialized)之前,添加以下代碼:
復制代碼 2)在Scope (_GPE)中添加以下代碼:
復制代碼 三、SMBUS:在T410的DSDT原始代碼中,SMBUS只有以下這些:
復制代碼 我們需要將其改成:
復制代碼 四、有線網卡內建:
復制代碼 五、SATA內建:
復制代碼 六、添加Fn鍵功能:
復制代碼 七、關於小太陽: *T410用的是ScrLk和Pause兩個按鍵來調節顯示器的亮度。需要在Scope (_SB)中添加以下代碼,我添加的位置是在Method (_INI, 0, NotSerialized)之后,在Device (LNKA)之前:
復制代碼 八、按電源鍵睡眠: * 在Device (SLPB)之前添加:
復制代碼 九、關機斷電: 在Method (_PTS, 1, NotSerialized)之前,添加以下代碼:【注意第一行的0×1030是T410專用的,相關資料看我的日志】
復制代碼 同時,在Method (_PTS, 1, NotSerialized)中的If (LEqual (Arg0, 0×05))里面添加非常關鍵的兩行:
復制代碼 之后,完整的代碼如下:
復制代碼 十、添加指紋設備:搜索:FPU,在代碼:
復制代碼 下面加入內建USB代碼:
IORegistryExplorer中看不到LPT和ECP設備,果斷刪除DSDT中的Device (LPT)和Device (ECP)。試驗效果不錯,不影響。決定T410的新版DSDT可以刪除這兩個Device。 * 關於顯卡代碼,我只在Device (PEG)設備下的Device (VID)中添加了以下代碼,然后啟用變色龍的GraphicsEnabler=yes。
復制代碼 有人可能需要更多更長的顯卡代碼,這里就暫時不做更多討論了。 * 關於原生CPU電源管理AppleLPC,正確代碼如下:
復制代碼 |
原鏈接: