前一篇提到要完善(希望能夠完美)的解決黑蘋果音效與睡眠的問題,須用到DSDT的修改。DSDT是存在於BIOS中定義設備配置表當中的一種,由於MAC電腦的DSDT定義的方式跟一般電腦的DSDT定義的語法內容有些出入,所以當OSX開機直接存取非MAC機器的DSDT資料時,可能讓OSX系統對設備發生某些誤判,造成OSX在開機的過程中無法成功載入驅動程式(Kext)。所以理想的方式是修改BIOS中的DSDT,儘可能修改到OSX系統可辨識的定義方式。然而這也有風險,BIOS內修改過的DSDT可能導致執行其他作業系統時發生異常,若修改過程有錯誤,還可能導致主機板整個掛點,最後得整張退回原廠修理(重灌BIOS)。

所幸這個問題有解。我們在安裝MultiBeast時勾選了UserDSDT時,會在系統Volumes的根目錄建立一個/Extra的目錄,OSX在開機時,Chimera這一類的 BootLoader 引導程式會先讀取/Extra目錄底下的設定內容去引導OSX開機。而Chimera引導程式也支援讀取DSDT檔案功能,所以並不用冒險修改BIOS內的DSDT內容,只須事先把BIOS內的DSDT資料導出來,經過我們針對MAC屬性做適當的修改之後存成檔案,放到/Extra目錄下,以後Chimera在引導OSX開機時,只需讀取改好的DSDT檔案,提供給OSX開機程序載入Kext驅動,不用冒險修改BIOS內容,也能達到修改DSDT的目的。

修改DSDT的工具很多,不過只需要以下兩個工具就能達到目的:

DSDTSE(下載):強大好用的DSDT內容編輯器。

每張主機板取出的DSDT內容都不一樣,不過畢竟它也是規格,所以格式上大多有些共通點。有關修改DSDT音效的方式,英文能力好的可參考發表在Tonymac的文章:

Optimized AppleHDA for Realtek ALC 887/888b on Lion - Update連結)。


修改DSDT:手動編輯修改DSDT.aml檔

執行DSDTSE,先將主機板BIOS內的DSDT資料導出。

螢幕快照 2012-08-01 下午4.40.26

 

導出之後,DSDT內容格式如下:(常寫程式的人,對於這格式應該不會太陌生)

螢幕快照 2012-06-29 下午3.58.13  

就跟程式語言一樣,括號{ }是一組,中間定義了若干參數,然而括號中又有括號的層級結構,要在適當的位置加上適當的定義,需要有點撰寫程式邏輯的基礎。如果對這個沒有把握,我想DSDT修改的方式就不適合操作了。

以下修改DSDT會使用到的功能如紅框所示:

DSDTSE-Info  

以上是簡單介紹修改DSDT的操作方式,開始進入正題。

一、技嘉GA-H77-DS3H

黑蘋果二號主機板GA-H77-DS3H所採用的音效晶片為ALC887-VD,之所以選擇DS3H的原因,是因為技嘉其他型號的7系列主機板大多改採VIA的VT2021音效晶片,而VT2021目前沒有對應的驅動程式(Kext),就算DSDT修改正確了,也沒辦法正常驅動,只能用萬用VoodooHDA一版一版的踹。(印象中Apple沒用過VIA音效晶片,所以不太可能無中生有)

以下是針對GA-H77-DS3H主機板的修改方式(注意:其他主機板並不適用):

DSDT音效修改(2012.08.07新增:支援ALC887、內顯HD4000、獨顯AX6870的HDMI音效輸出)

1.音效I/O埠:搜尋Device (HDEF),然後在這個區段內添加以下紅字部分:

Device (HDEF)
{

<...一堆看不懂的天書代碼>

Method (_DSM, 4, NotSerialized) {
Store (Package (0x06)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
},

"layout-id",
Buffer (0x04)
{
0x83, 0x01, 0x00, 0x00
},

"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

}

參考圖(以下的反白部分)

H77-DS3H-DSDT-FDEF      

註:Multibeast 5.1.3版以後,layout-id 改為 0x03, 0x00, 0x00, 0x00(ALC885, 887, 888, 889, 892, 898 全部都適用此layout-id)

2. 這一段會用到蘋果MAC獨家的DTGP函數,所以需要自行找個地方添加DTGP函數定義。找個區段添加以下這一段: 


Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}

If (LEqual (Arg2, One))
{
Return (One)
}
}
}

Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}

我把它補在DSDT內容最前面第一段,最保險也最不會出錯(下圖反白部分)。而DTGP有很多地方都用得到。參考圖:

螢幕快照 2012-06-29 下午4.28.55  

3.接下來是讓AX6870支援HDMI音效輸出:搜尋Device (PCI0),在這個區段添加以下內容:

Device (PEGP)
{
Name (_ADR, 0x00010000)
Name (_STA, 0x0F)
Name (_PRW, Package (0x02)
{
0x09,
0x05
})
Device (GFX0)
{
Name (_ADR, Zero)
Name (_SUN, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x0C)
{
"@0,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@1,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@2,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@3,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"model",
Buffer (0x13)
{
"AMD Radeon HD 6870"
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}

Device (HDAU)
{
Name (_ADR, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
}

參考圖(底下反白部分): 

螢幕快照 2012-08-01 下午4.47.35  

4.(2012.08.07 新增HD4000的HDMI)再來就是支援內顯HD 4000的HDMI音效輸出:搜尋Name (_ADR, 0x00020000),確認這字串只出現一次,且它在DEVICE (GFX0) 底下,新增以下內容:

Method (_DSM, 4, NotSerialized)
{
Store (Package (0x06)
{
"device-id",
Buffer (0x04)
{
0x66, 0x01, 0x00, 0x00
},

"AAPL,ig-platform-id",
Buffer (0x04)
{
0x0A, 0x00, 0x66, 0x01
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考圖(底下反白部分): 

HD4000-HDMI  

最後編譯成DSDT.aml丟到/Extra目錄下,並搭配MultiBeast 4.6.1的安裝音效設定 (Drivers & Bootloaders ->Kexts & Eablers ->Audio -> Realtek ALC8xx -> Patched AppleHDA -> ALC888b/887 ->v100302 Current 即可)

螢幕快照 2012-08-01 下午7.00.02  

重開機...幸運的話就能看到「系統偏好設定」的聲音輸入與輸出HDMI全都能用了。

HDMI-Output      

系統描述也有了

HDA-HDMI-Info        

 

電源管理:修改DSDT驅動原生的AppleLPC.kext

這個只需修改DSDT,不需另外安裝第三方驅動。搜尋 0x001F0000 ,然後在它所在的區段加上底下這一段內容(藍字部分是參照到AppleLPC.kext的info內容):

Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"device-id",
Buffer (0x04)
{
0x15, 0x28, 0x00, 0x00
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考圖(反白內容)

螢幕快照 2012-06-29 上午6.58.00  

修改編譯完丟到/Extra重開機,若有成功,兩個地方有變化:

AppleLPC.kext成功載入了。

螢幕快照 2012-06-29 上午7.00.44

 

三個勾選項目變成四個。

螢幕快照 2012-06-29 上午7.01.32   

修正10.8.x以後,H77/Z77 系統報告發生 Unknow AHCI Standard Controller:

搜尋 Name (_ADR, 0x001F0002),確認它在 Device (SAT0) 區段下,補上以下內容:


Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"device-id",
Buffer (0x04)
{
0x03, 0x1E, 0x00, 0x00
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考圖:

DSDT-SATAFix  

修正這個問題有兩種方式,一個是上述的修改DSDT,另一個是修改AppleAHCIPort.kext 的 Info.plist,二擇一。 

註:修改 AppleAHCIPort.kext 方式請參考:黑蘋果啓用硬體RAID磁碟陣列(連結)

二、技嘉GA-Z77X-UP4 TH主機板

這張主機大概是比較尊貴,所以難搞了點。我的心得是得再編輯org.chameleon.Boot.plist,不然睡眠之後不容易喚醒。

(一)編輯/Extra/org.chameleon.Boot.plist,新增:

<key>device-properties</key>
<string>7f000000010000000100000073000000020000000

2010c00d041030a000000000101060000027fff04002c0000

004100410050004c002c00690067002d0070006c00610074

0066006f0072006d002d00690064000000080000000a0066

01140000006800640061002d0067006600780000000d000

0006f6e626f6172642d31</string>

參考圖:

GA-Z77X-UP4-bootplist   

補充說明:這串device-properties的數字內容其實是透過gfxutil編碼而成。原始的內容是定義HD4000的platform-id與位置參考如下:

GA-Z77X-UP4-deviceproperties  

(二)DSDT音效修改(支援ALC892、內顯HD4000、獨顯AX6870的HDMI音效輸出)

1.音效I/O埠:搜尋Device (HDEF),然後在這個區段內添加以下紅字部分:

            Method (_DSM, 4, NotSerialized)
{
Store (Package (0x06)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
},

"layout-id",
Buffer (0x04)
{
0x88, 0x01, 0x00, 0x00
},

"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考圖:

 GA-Z77X-UP4-DSDT-HDEF  

其實就是GA-H77-DS3H的layout-id從「0x83, 0x01, 0x00, 0x00」改成「0x88, 0x01, 0x00, 0x00」。

註:Multibeast 5.1.3版以後,layout-id 改為 0x03, 0x00, 0x00, 0x00(ALC885, 887, 888, 889, 892, 898 全部都適用此layout-id)

2. 這一段會用到蘋果MAC獨家的DTGP函數,所以需要自行找個地方添加DTGP函數定義。找個區段添加以下這一段:


Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}

If (LEqual (Arg2, One))
{
Return (One)
}
}
}

Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}

我把它補在DSDT內容最前面第一段,最保險也最不會出錯(下圖反白部分)。而DTGP有很多地方都用得到。參考圖:

螢幕快照 2012-06-29 下午4.28.55  

3.接下來是讓AX6870支援HDMI音效輸出:搜尋Name (_ADR, 0x00010000),確認在Device (PEG0)底下,在這個區段添加以下內容:

                Name (_STA, 0x0F)
Device (GFX0)
{
Name (_ADR, Zero)
Name (_SUN, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x0C)
{
"@0,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@1,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@2,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"@3,name",
Buffer (0x0D)
{
"ATY,Duckweed"
},

"model",
Buffer (0x13)
{
"AMD Radeon HD 6870"
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}

Device (HDAU)
{
Name (_ADR, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}

 

參考圖(底下反白部分): 

GA-Z77X-UP4-AX6870-HDMI      

以上AX6870支援HDMI音效這一段做法,看起來跟上面GA-H77-DS3H不一樣。不過H77-DS3H應該也可以用相同的做法試試看。

(2013.07.14 new,2014.03.09 修正支援 10.8.x ~ 10.9.2) GTX 670支援 HDMI(此法支援 nVidia GTX 5xx~6xx):

搜尋 Name (_ADR, 0x00010000),確認在Device (PEG0)底下,在這個區段添加以下內容:

          Device (GFX0)
{
Name (_ADR, Zero)
Name (_SUN, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x0A)
{
"@0,connector-type",
Buffer (0x04)
{
0x00, 0x08, 0x00, 0x00
},

"@1,connector-type",
Buffer (0x04)
{
0x00, 0x08, 0x00, 0x00
},

"@2,connector-type",
Buffer (0x04)
{
0x00, 0x08, 0x00, 0x00
},

"@3,connector-type",
Buffer (0x04)
{
0x00, 0x08, 0x00, 0x00
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-2"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}

Device (HDAU)
{
Name (_ADR, One)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-2"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}

參考圖:

GTX670-HDMI    

4.再來就是支援內顯HD 4000的HDMI音效輸出:搜尋Name (_ADR, 0x00020000),確認這字串只出現一次,且它在DEVICE (GFX0) 底下,新增以下內容:

            Method (_DSM, 4, NotSerialized)
{
Store (Package (0x06)
{
"AAPL,ig-platform-id",
Buffer (0x04)
{
0x0A, 0x00, 0x66, 0x01
},

"device-id",
Buffer (0x04)
{
0x66, 0x01, 0x00, 0x00
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考

GA-Z77X-UP4-DSDT-GFX0  

 

電源管理:AppleLPC.kext原生自動載入

與GA-H77-DS3H不一樣,GA-Z77X-UP4 TH 的 AppleLPC.kext會自動載入,所以不需修正DSDT來處理這一段。

 

修正10.8.x以後,H77/Z77 系統報告發生 Unknow AHCI Standard Controller:

搜尋 Name (_ADR, 0x001F0002),確認它在 Device (SAT0) 區段下,補上以下內容:


Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"device-id",
Buffer (0x04)
{
0x03, 0x1E, 0x00, 0x00
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

參考圖:

DSDT-SATAFix  

修正這個問題有兩種方式,一個是上述的修改DSDT,另一個是修改AppleAHCIPort.kext 的 Info.plist,二擇一。 

註:修改 AppleAHCIPort.kext 方式請參考:黑蘋果啓用硬體RAID磁碟陣列(連結)

最後,GA-Z77X-UP4 TH 的 MultiBeast 安裝設定如下:

GA-Z77X-UP4-MultiBeast  

修正 USB 2 裝置在 Intel 7 系列 USB 3 埠無法使用的情形

修改方式完全參考自以下文章:

Giacomoleopardo Build - ZOTAC Z77-ITX WiFi - Core i7-3770T - MacMini 6,2 (第16.17樓)

以 OSX 10.8來說,直接安裝 Zenith432's GenericUSBXHCI.kext 即可(於 MultiBeast 5.3.x 以後的「USB 3.0 - Universal 項目」),就能一併解決原生 Intel USB3 與 VIA VL800 的問題。 

以下 DSDT 修正 USB3 的方式只能針對原生 Intel 7 系列的 USB3 埠無法使用 USB 2 裝置的問題,無法解決原生 OSX 不支援 GA-Z77X-UP4 TH 的 VIA VL800 USB 埠。

1. 備份本來的DSDT.aml

2. 尋找 Device (XHC) 至 Device (HDEF) 區段,整段替換成以下紅字內容(意即Device (XHC) 也一併改成  Device (XHC1) ):

       Device (XHC1)
{
Name (_ADR, 0x00140000)
OperationRegion (XPRT, PCI_Config, 0x74, 0x6C)
Field (XPRT, DWordAcc, NoLock, Preserve)
{
Offset (0x01),
PMEE, 1,
, 6,
PMES, 1,
Offset (0x5C),
PR2, 32,
PR2M, 32,
PR3, 32,
PR3M, 32
}

OperationRegion (XH1C, PCI_Config, 0xD0, 0x10)
Field (XH1C, ByteAcc, NoLock, Preserve)
{
PAHC, 1,
PBHC, 1,
PCHC, 1,
PDHC, 1,
Offset (0x08),
PASS, 1,
PBSS, 1,
PCSS, 1,
PDSS, 1
}

OperationRegion (XHC2, PCI_Config, 0x44, 0x04)
Field (XHC2, ByteAcc, NoLock, Preserve)
{
Offset (0x01),
MIAI, 2
}

Name (XRST, Zero)
Method (_INI, 0, NotSerialized)
{
If (OSDW ())
{
Store (Zero, MIAI)
}

If (LAnd (LGreaterEqual (OSYS, 0x07DC), LLess (OSYS, 0x2710)))
{
Store (One, PASS)
Store (One, PAHC)
Store (One, PBSS)
Store (One, PBHC)
Store (One, PCSS)
Store (One, PCHC)
Store (One, PDSS)
Store (One, PDHC)
}
}

Method (_S3D, 0, NotSerialized)
{
Return (0x02)
}

Method (_S4D, 0, NotSerialized)
{
Return (0x02)
}

Device (RHUB)
{
Name (_ADR, Zero)
Device (PRT1)
{
Name (_ADR, One)
Method (_UPC, 0, Serialized)
{
Name (UPCP, Package (0x04)
{
0xFF,
0x03,
Zero,
Zero
})
Return (UPCP)
}

Method (_PLD, 0, Serialized)
{
Name (PLDP, Package (0x01)
{
Buffer (0x10)
{
/* 0000 */ 0x01, 0xC6, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0008 */ 0x69, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
}
})
Return (PLDP)
}

Name (MUXS, "EHCA")
}

Device (PRT2)
{
Name (_ADR, 0x02)
Method (_UPC, 0, Serialized)
{
Name (UPCP, Package (0x04)
{
0xFF,
0x03,
Zero,
Zero
})
Return (UPCP)
}

Method (_PLD, 0, Serialized)
{
Name (PLDP, Package (0x01)
{
Buffer (0x10)
{
/* 0000 */ 0x01, 0xC6, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0008 */ 0x69, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
}
})
Return (PLDP)
}

Name (MUXS, "EHCB")
}

Device (PRT3)
{
Name (_ADR, 0x03)
Method (_UPC, 0, Serialized)
{
Name (UPCP, Package (0x04)
{
0xFF,
0x03,
Zero,
Zero
})
Return (UPCP)
}

Method (_PLD, 0, Serialized)
{
Name (PLDP, Package (0x01)
{
Buffer (0x10)
{
/* 0000 */ 0x01, 0xC6, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0008 */ 0x69, 0x0C, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00
}
})
Return (PLDP)
}

Name (MUXS, "EHCC")
}

Device (PRT4)
{
Name (_ADR, 0x04)
Method (_UPC, 0, Serialized)
{
Name (UPCP, Package (0x04)
{
0xFF,
0x03,
Zero,
Zero
})
Return (UPCP)
}

Method (_PLD, 0, Serialized)
{
Name (PLDP, Package (0x01)
{
Buffer (0x10)
{
/* 0000 */ 0x01, 0xC6, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0008 */ 0x69, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00
}
})
Return (PLDP)
}

Name (MUXS, "EHCD")
}
}

Method (_PRW, 0, NotSerialized)
{
Return (GPRW (0x0D, 0x04))
}

Method (_DSM, 4, NotSerialized)
{
Store (Package (0x0B)
{
"AAPL,current-available",
0x0834,
"AAPL,current-extra",
0x0898,
"AAPL,current-extra-in-sleep",
0x0640,
"AAPL,max-port-current-in-sleep",
0x0834,
"AAPL,device-internal",
Zero,
Buffer (One)
{
0x00
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

Method (XHCA, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (One, PASS)
}

Store (One, PAHC)
}

Method (XHCB, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (One, PBSS)
}

Store (One, PBHC)
}

Method (XHCC, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (One, PCSS)
}

Store (One, PCHC)
}

Method (XHCD, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (One, PDSS)
}

Store (One, PDHC)
}

Method (EHCA, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (Zero, PASS)
}

Store (Zero, PAHC)
}

Method (EHCB, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (Zero, PBSS)
}

Store (Zero, PBHC)
}

Method (EHCC, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (Zero, PCSS)
}

Store (Zero, PCHC)
}

Method (EHCD, 0, NotSerialized)
{
If (LNot (OSDW ()))
{
Store (Zero, PDSS)
}

Store (Zero, PDHC)
}
}

Device (HDEF)

如圖

XHC_HDEF  

3.尋找Name (_ADR, 0x001D0000) ,然後在這個區段內往下找到 Device (HUBN) ,再往下找會發現有幾個命名為 Device (PR1n)的區段(n= 1 到 8,也就是 Device (PR11) ~ Device (PR18) 共八個 ),然後在各區段補上: 

Device (PR11) 補上 Name (MUXS, "XHCA")
Device (PR12) 補上 Name (MUXS, "XHCB")
Device (PR13) 補上 Name (MUXS, "XHCC")
Device (PR18) 補上 Name (MUXS, "XHCD")

也就是該區段若不包括 Method (_DSM 內容,再補上。例如以下 Device (PR11) 範例:

USB-PRXX  

4. 搜尋 Method (_OSC, 4, Serialized) ,將 Method (_OSC, 4, Serialized) 至 Scope (\_SB.PCI0) 中間的內容全部替換成以下紅字內容 

            Method (_OSC, 4, Serialized)
{
Store (Arg3, Local0)
CreateDWordField (Local0, Zero, CDW1)
CreateDWordField (Local0, 0x04, CDW2)
CreateDWordField (Local0, 0x08, CDW3)
Store (CDW2, SUPP)
Store (CDW3, CTRL)
If (LEqual (One, OSDW ()))
{
If (LAnd (LEqual (Arg0, GUID), NEXP))
{
If (Not (And (CDW1, One)))
{
If (And (CTRL, 0x02))
{
NHPG ()
}

If (And (CTRL, 0x04))
{
NPME ()
}
}

If (LNotEqual (Arg1, One))
{
Or (CDW1, 0x08, CDW1)
}

If (LNotEqual (CDW3, CTRL))
{
Or (CDW1, 0x10, CDW1)
}

Store (CTRL, CDW3)
Store (CTRL, OSCC)
Return (Local0)
}
Else
{
Or (CDW1, 0x04, CDW1)
Return (Local0)
}
}
Else
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xA9, 0x12, 0x95, 0x7C, 0x05, 0x17, 0xB4, 0x4C,
/* 0008 */ 0xAF, 0x7D, 0x50, 0x6A, 0x24, 0x23, 0xAB, 0x71
}))
{
Store (One, ^XHC1.PASS)
Store (One, ^XHC1.PAHC)
Store (One, ^XHC1.PBSS)
Store (One, ^XHC1.PBHC)
Store (One, ^XHC1.PCSS)
Store (One, ^XHC1.PCHC)
Store (One, ^XHC1.PDSS)
Store (One, ^XHC1.PDHC)
}

Return (Local0)
}
}

Scope (\_SB.PCI0)

 

範例:

USB_SBPCI0  

5. 尋找 Store (0x07D0, OSYS) ,確認該區段底下有幾個作業系統的識別字,補上紅字內容:

      If (_OSI ("Darwin"))
{
Store (0x2710, OSYS)
}

範例:

USB_Darwin  

6. 找個地方補上紅字內容:

    Method (OSDW, 0, NotSerialized)
{
If (LEqual (OSYS, 0x2710))
{
Return (One)
}
Else
{
Return (Zero)
}
}

範例:

USB-OSDW  

7. 最後,如果有 \_SB.PCI0.XHC.XWAK () ,改成 \_SB.PCI0.XHC1._INI ()。

8. USB3 修正完成。

補充叮嚀:修改 DSDT 的確是有些難度,但它是讓黑蘋果運作更接近 MAC 的重要手段,尤其是 HDMI 音效,修改 DSDT 往往比踹過數十種版本的 Kext 還有效。有些網站或論壇也提供 DSDT 檔案下載,不過建議黑蘋果用戶花點精神,了解一下 DSDT 的修改操作,原因如下:

1.DSDT 的內容是有版權的:版權屬於主機板廠商,任意散佈 DSDT 內容,行為上是不合法的--雖然它跟盜版沒有直接與必然的關係。修改買來自用主機板的 DSDT 就不會有適法性的問題。

2.BIOS 有版本的差異:不同版本的 BIOS 搭配不同版本的 DSDT 可能會發生異常。我的經驗是,就連重刷同一版本的 BIOS 之後,使用原來的 DSDT 也會出現睡眠異常,需重新產生修改 DSDT。

3.不同的系統組態也會有不同的 DSDT 內容,就算型號與版本相同,錯用之後有時會發生問題(最常見的是休眠不醒)。參考以下內容:

http://osx86.co/archive/index.php/t-3531.html

arrow
arrow

    benjenq 發表在 痞客邦 留言(17) 人氣()