前一篇提到要完善(希望能夠完美)的解決黑蘋果音效與睡眠的問題,須用到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

文章標籤
創作者介紹

-Ben's PHOTO-

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


留言列表 (17)

發表留言
  • Mix OS X
  • Thanks I got the same Hackintosh as yours !
    And thanks for your sharing !
  • roy
  • 請問你有裝山獅嗎?
    能讓我下載你的DSDT 嗎?
    謝謝!!
  • DSDT內容是有版權的(版權隸屬於主機板廠商或BIOS廠商),
    所以我只能告訴你怎麼去取出並修改「你的電腦」的DSDT,
    我會改我的DSDT是因為東西是我合法買來並自用,並單純分享資訊,
    散佈DSDT檔案或完整原始碼,原則上是非法的。
    (上述提供的是「修改內容」,來源是作者發表於tonymac的公開資源,
    並非原始DSDT內容)

    先前我幫一位朋友JB他的手機(不是我自己的),
    最後演變成他公然以JB手段去寫書賺錢,
    並舉辦「JB研討會」於會場舉辦「簽書一本+免費JB一台」的活動,
    違背我告訴他「JB純分享,不得非法營利」的承諾,
    我批評他的不當作為(以及書本內容大幅抄襲iTunes和網站資源),
    卻招致他透過臉書/噗浪侮辱我的人格權,
    這些背叛的行為讓我覺得非常憤怒,
    從此以後我決定不再做「逾越個人合理使用範圍」的事情。
    如果我把改好的東西給你,這東西就不是「個人合理使用範圍」,法律上是非法的。

    所以我可以無償提供你怎麼做,
    但我不能「動手做完」再提供改好的東西給你。
    跟你說聲抱歉。

    benjenq 於 2012/07/31 17:55 回覆

  • roy
  • 謝謝你。

    我能請教你。。我在電源管理的部份。
    沒辦法加入你提供的那些字串是不是那裡有問題呢。

    都會編譯失敗。但沒加上時。就還ok
    我跟你都是 h77-ds3h 的。
    然後目前我是用msi 6850的卡

    能請教如何讓其出現hdmi 的效果呢。
    也是這樣用嗎?
  • 電源管理也有用到DTGP函數,
    從你的配備來看,
    應該是:
    (1) 添加DTGP函數(就是文章「這一段會用到蘋果MAC獨家的DTGP函數」底下這一段)
    (2) 添加ALC887-VD的音效IO(就是「搜尋Device (HDEF)」底下這一段)
    (3) 添加電源管理(文章「搜尋 0x001F0000」底下這一段)

    至於HDMI是難度最高的部分,光是不同的主機板,添加代碼的位置就不一樣。
    因為你的主機板跟我一樣,而顯卡又是68xx同系列,
    確定也能夠HDMI輸出,改法應該也一樣,只是代碼內容不同。

    不過我沒有查到6850的代碼,只查到For ATI的一般改法,
    (For一般ATI的改法,對我的AX6870也能用...我想對6850應該也可以)
    你試著參考我在文章中寫的「搜尋PCI0」這一段
    把6870的HDMI的代碼整個改成底下這段試試看

    Device (PEGP)
    {
    Name (_ADR, 0x00010000) /** Verify display address **/
    Name (_PRW, Package (0x02)
    {
    0x09,
    0x05
    })

    Device (GFX0) /** for AMD Graphics Cards **/
    {
    Name (_ADR, Zero)
    Name (_SUN, One)
    Method (_DSM, 4, NotSerialized)
    {
    Store (Package (0x02)
    {
    "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)
    }
    }
    }

    benjenq 於 2012/08/03 03:08 回覆

  • bigpillar
  • 您好!參考了你的文章安裝完成了(系統為H77-DS3H及Nvidia GT640),但為了顯卡等問題重複裝了十幾次後不是無法進入系統就是會當機等問題,後來發現

    1 , Graphics driver 不能裝GTX670的那項,會無法開機(開機過程出現錯誤) ;
    2 , Miscllaneou-FakeSMC Plugins-Motherboard Plugin裝完了會馬上當機;一定要按 Reset 重開機 ;
    3 , Miscllaneou-FakeSMC Plugins-Nvidia GeForce Plugin 也不能裝會無法開機 (開機過程出現錯誤);
    4 , Customization-Boot Options-GraphiceEnabler=No 要勾選,否則白菊花轉完即會白畫面無法進入系統;

    排除上訴問題後再依你的文章修改音效及睡眠問題基本 OK,但 HDMI 音效暫時無解(我的 CPU 是i5 3570;顯卡是 GT640),找不到相關資料可參考,另睡眠省電項目的最後一項不會出現(電腦當機時自動重開機,未修改 DSDT 時即只有出現兩個項目;修改後出現3個項目且睡眠功能正常),最後還是感謝你的文章,讓我完成系統安裝儘管還有些許問題待解。
  • nVidia的HDMI有篇舊文可以參考一下(對應5xx系列)
    http://legacy.tonymacx86.com/viewtopic.php?f=162&t=31947

    由於也是技嘉的H77-DS3H,nVidia的HDMI音效您嘗試以下的方式看看:
    搜尋Name (_ADR, 0x00010000),確認在Device (PEG0),插入以下的DSDT內容:

    Name (_PRW, Package (0x02)
    {
    0x09,
    0x05
    })
    Device (GFX0) /** for Nvidia Graphics Cards **/
    {
    Name (_ADR, Zero)
    Name (_SUN, One)
    Method (_DSM, 4, NotSerialized)
    {
    Store (Package (0x06)
    {
    "@0,connector-type",
    Buffer (0x04)
    {
    0x00, 0x08, 0x00, 0x00
    },

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

    "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)
    }
    }

    benjenq 於 2012/09/01 18:02 回覆

  • 佛洛缺德
  • 您好
    冒昧請教您一個問題???
    我的主機板是GA-H67N-USB3-B3以及GA-P67A-UD3P-B3
    參考Tonymac上的教學後已經順利的安裝完畢。
    有個小問題就是....為何使用了他們網站上的DSDT檔案後
    我的硬碟圖示在系統中會變成外接硬碟
    雖然不太影響使用,但看到的時候感覺還是不太好
    請問若要修改DSDT讓系統正確辨識圖示,要加上哪些參數呢??
    小弟英文不好,對DSDT的修改真的也是一竅不通
    若有打擾的部分還煩請見諒

    謝謝您
  • 修改硬碟圖示有好幾種方式,
    最簡單的是直接拖放,可換成任何你想要的圖示。
    或是修改Kext也行,
    詳情請參考
    http://benjenq.pixnet.net/blog/post/30988001

    benjenq 於 2012/09/03 02:24 回覆

  • Lionel Luthor 2011
  • MSI R6850 Cyclone 1GD5 Power Edition/OC(我手頭只有這張)

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

    "@1,name",
    Buffer (0x0A)
    {
    "ATY,Gibba"
    },

    "@2,name",
    Buffer (0x0A)
    {
    "ATY,Gibba"
    },

    "@3,name",
    Buffer (0x0A)
    {
    "ATY,Gibba"
    },

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

    "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)
    }
    }
    }

    ===========================================
    Fix HDMI port for MSI R6850 Cyclone 1GD5 Power Edition/OC

    Framebuffer of MSI R6850 Cyclone 1GD5 Power Edition/OC : Gibba

    你可以使用Hex Fiend這類app去編輯 ATI6000Controller.kext/Contents/MacOS/ATI6000Controller

    原來的碼
    0000000 00 04 00 00 04 03 00 00 00 01 00 00 12 04 05 01
    0000010 00 04 00 00 04 03 00 00 00 01 00 00 22 05 04 02
    0000020 00 08 00 00 04 02 00 00 00 01 00 00 11 02 06 04
    0000030 00 02 00 00 14 02 00 00 00 01 00 00 00 00 03 05
    0000040 04 00 00 00 04 02 00 00 00 01 00 00 11 02 01 03
    0000050

    改成下面的樣子
    0000000 00 04 00 00 04 03 00 00 00 01 00 00 12 04 05 01
    0000010 00 08 00 00 04 02 00 00 00 01 00 00 22 05 04 04
    0000020 00 02 00 00 14 02 00 00 00 01 00 00 00 00 03 05
    0000030 04 00 00 00 04 02 00 00 00 01 00 00 11 02 01 06
    0000040 00 04 00 00 04 03 00 00 00 01 00 00 22 05 06 02
    0000050
  • Lionel Luthor 2011
  • 修改ATI6000Controller.kext/Contents/MacOS/ATI6000Controller的依據如下

    Connector at index 0
    Type [@offset 44278]: DisplayPort (10)
    Encoder [@offset 44282]: INTERNAL_UNIPHY2 (0x21)
    i2cid [@offset 44388]: 0x90, OSX senseid: 0x1
    Connector Object Id [19] which is [DISPLAY_PORT]
    encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x12 [duallink 0x2] enc 0x4)] linkb:
    false
    Connector at index 1
    Type [@offset 44288]: HDMI-A (11)
    Encoder [@offset 44292]: INTERNAL_UNIPHY2 (0x21)
    i2cid [@offset 44415]: 0x93, OSX senseid: 0x4
    Connector Object Id [12] which is [HDMI_TYPE_A]
    encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x22 [duallink 0x2] enc 0x5)] linkb:
    true
    Connector at index 2
    Type [@offset 44298]: DVI-I (2)
    Encoder [@offset 44302]: INTERNAL_UNIPHY (0x1e)
    i2cid [@offset 44452]: 0x94, OSX senseid: 0x5
    Connector Object Id [2] which is [DVI_I]
    encoder obj id [0x1e] which is [INTERNAL_UNIPHY (osx txmit 0x10 [duallink 0x0] enc 0x0)] linkb:
    false
    Connector at index 3
    Type [@offset 44308]: DVI-I (2)
    Encoder [@offset 44312]: INTERNAL_KLDSCP_DAC1 (0x15)
    i2cid [@offset 44452]: 0x94, OSX senseid: 0x5
    Connector Object Id [2] which is [DVI_I]
    encoder obj id [0x15] which is [INTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false
    Connector at index 4
    Type [@offset 44318]: DVI-D (3)
    Encoder [@offset 44322]: INTERNAL_UNIPHY1 (0x20)
    i2cid [@offset 44479]: 0x95, OSX senseid: 0x6
    Connector Object Id [3] which is [DVI_D]
    encoder obj id [0x20] which is [INTERNAL_UNIPHY1 (osx txmit 0x11 [duallink 0x1] enc 0x2)] linkb:
    false

    之前沒仔細看,所以一直打不開這篇,今天瞄到密碼後,進來分享一下= .=
  • 天啊~真是太強大了...XD
    先前爬文時看過這類的HEX修改文,直接舉白旗投降了...

    這麼說來,微星的這張R6850,需要修改以下兩個東西,才會有HDMI音效嗎?
    1.ATI6000Controller的HEX
    2.DSDT

    benjenq 於 2012/09/05 23:59 回覆

  • Lionel Luthor 2011
  • 應該是說沒有修改kext的話,這塊板子的HDMI會沒作用.....連畫面都沒有,誰還會管它有沒有音效哩~
  • Lionel Luthor 2011
  • 可以參考下面這篇改顯卡kext
    http://bbs.pcbeta.com/viewthread-991835-1-1.html

    00 04 00 00 04 03 00 00 00 01 00 00 12 04 05 01
    按照順序是
    00 04 00 00 接口類型
    04 03 00 00 接口標誌位
    00 01 顯示特性
    00 00 對齊字符位
    12 txmt
    04 encd
    05 hotplugin
    01 senseID
    以MSI這板子為例
    雖然framebuffer有五行,但有作用的只有00 10 20 30,40這行是沒作用的,所以你要先調整位置.....把你用不到的連接埠移到40這行
    再來就用提取出來的顯卡BIOS資訊修改它,依照接口的類型把txmt、encd、senseID改成你顯卡的實際數值,hotplugin這值則是照你的意思去編排就好。
  • 完全看不懂...我好苯...哈哈...XD
    慶幸自己買對了顯卡,省去折騰之苦~

    話說當初也是爬文爬到PCBETA來,說6870直驅OOB才決定買這張的。

    benjenq 於 2012/09/06 01:03 回覆

  • Lionel Luthor 2011
  • 當Mac驅動顯卡時,它會照著framebuffer的敘述把資料傳給顯示器,講白話點.....上面提到的framebuffer就像是迷宮的路線圖,你拿對圖就到得了出口.....拿錯圖或是地圖畫錯(mac的顯卡和我們的顯卡是不同的迷宮,你拿mac顯卡的地圖走我們的迷宮.....走得出去,叫運氣好)
    既然迷宮路線不同,地圖只好重新畫過.....修改framebuffer。

    我這張MSI 6850的framebuffer會用Gibba,是因為拿Gibba這張地圖,資訊可以在不改kext的情況下,從D-Sub這連接埠正常傳出運作,至於說......拿其它的framebuffer如Duckweed來改成符合這張卡的地圖......理論上可行,實際上沒試過,如果真可行......以後就把變色龍或chimera預設使用的framebuffer內容改成自己顯卡的數值就成了!
  • 太感謝您的不吝分享了!
    經過您的詳述,有稍微看懂了一點點HEX內容,
    (距離上次修改HEX已經是十多年前的事,有些遊戲可以靠這招作弊...XD)
    或許未來還會用得上,在此感謝先!

    benjenq 於 2012/09/06 16:27 回覆

  • travis chang
  • Dear Ben 大:
    首先感謝Ben大的教學使小弟順利安裝了黑蘋,依過程小弟利用DSDTSE修正了DSDT(未加入AX6870那一段),亦將編譯後的資料置放於/Extra下,亦利用MultiBeast重新設定一次,但仍於聲音處找不到輸出設備,但於系統資訊處看的到相關設備的描述,不知小弟遺漏那一段,請求大大賜教,謝謝!!
    我的設備 CPU:i5 3570K 主機板:H77-DS3H 未使用獨顯
  • travis chang
  • 再補充一下小弟板子 V1.0(F5)
  • 驅動音效的DSDT只需補上HDEF與DTGP區段就行了,
    不過HDEF區段內的layout-id要給對就是了。

    如果您再三確認DSDT內容無誤,且MultiBeast也有安裝驅動的話,
    試試舊版(5.0.x)的MultiBeast內With DSDT的ALC 887驅動。

    benjenq 於 2012/10/25 01:46 回覆

  • travis chang
  • Dear Ben 大:
      感謝你用心回覆,因為小弟是新手layout-id是複製Ben大的文章內容中的。另小弟今晨發現我線上購買的版本是 ML10.8.2 不知此一版本安裝是否有差?
    今天我會去下載舊版的MultiBeast試試!!
    謝謝大大熱心協助!!謝謝!!

      
  • 我用的layout-id是跟著MultiBeast 5.0.x而來。

    不論ML在哪一版,安裝With DSDT音效驅動時,
    它會把MultiBeast內改過設定的AppleHDA.kext安裝到S/L/E目錄下蓋掉本來的版本,
    所以跟ML安裝哪一版關係不大,但可能跟MultiBeast的版本有關。

    benjenq 於 2012/10/26 02:14 回覆

  • easontim
  • 請問一下我修改的dsdt後面改.aml放在Extra裡
    重新用USB進去就進不去了....
    好無奈==
  • 提取出DSDT.aml之後先別急著修改,試試看能不能開機。

    benjenq 於 2013/03/29 02:45 回覆

  • aweei
  • 你好,在"修改DSDT驅動原生的AppleLPC.kext"這一段,裡面寫到”(藍字部分是參照到AppleLPC.kext的info內容)"請問這裏說的是info.plist裡面的哪一個值?因為檔案很多數字,看不出是哪一個數字,感謝分享,謝謝!
  • AppleLPC -> IONameMatch,底下有一堆pci8086,xxxx
    我是挑 2815 這一行來補
    然後AppleLPC就成功驅動了
    (現在用Z77X-UP4 TH,不用做這個動作就能驅動了)

    benjenq 於 2013/10/28 03:17 回覆

  • aweei
  • 請問已經確定載入AppleLPC,但是電源選項那邊還是只有2個選項,請問這可能是什麼原因呢?謝謝!
  • 是硬體環境不支援了吧我猜

    benjenq 於 2013/11/24 12:40 回覆