[TOC]
****
# 【指南】 給筆記本的 DSDT/SSDTs 打補丁
英文原文:[Patching LAPTOP DSDT/SSDTs](https://www.tonymacx86.com/threads/guide-patching-laptop-dsdt-ssdts.152573/)
# 開始學習SSDT/DSDT
常見論壇上的大神們談論 DSDT、SSDT、AML、DSL 不明覺厲,曾遍尋論壇求解釋未果。
我更喜歡通過 DSDT 進行設備注入的**SSDT**,因為**更新 BIOS,移動 PCI 卡或添加/移除 PCI卡可能需要您提取和編輯新的DSDT**。
很多人都知道使用 DSDT 補丁可以開雙核,但 DSDT 的功能不僅僅如此,除了開雙核,還可以可以修復 ACPI 缺陷(不需要 Disabler.kext ,原版cpupowermanagement 正常使用),RTC,HPET 缺陷(原版 kext 正常工作),顯卡(代替 efistring),聲卡(只是代替了 HDAEnabler.kext ),網卡(包括 TimeMachine 問題),此外還可以解決其他很多奇奇怪怪的問題,因此建議盡可能使用 DSDT 補丁。
# ACPI
ACPI 是 Hewlett-Packard, Intel, Microsoft, Phoenix 和 Toshiba 共同制定的一個開放的行業規范。是 The Advanced Configuration and Power Interface 的縮寫,也就是“電源管理模式和配置管理的接口規范”。從名字可以看出主要是“電源管理”和“配置管理”。是 BIOS 的一個高級功能模塊。
它幫助操作系統合理控制和分配計算機硬件設備的電量,有 了ACPI,操作系統可以根據設備實際情況,根據需要把不同的硬件設備關閉。如Win7或者Win8系統,系統睡眠時,系統把當前信息儲存在內存中,只保留內存等幾個關鍵部件硬件的通電,使計算機處在高度節電狀態。當然這只是它功能中的很少一部分。
它主要涵蓋的功能包括:
1. System power management(系統電源管理)
2. Device power management(設備電源管理)
3. Processor power management(處理器電源管理)
4. Device and processor performance management(設備及處理器性能管理)
5. Configuration / Plug and Play(配置/即插即用)
6. System Events(系統事件)
7. Battery management(電池管理)
8. Thermal management(溫度管理)
9. Embedded Controller(嵌入式控制器)
10. SMBus Controller(SMBus控制器)
在計算機應用平臺,ACPI 越來越重要。ACPI由很多表組成,包括:RSDP,SDTH,RSDT,FADT,FACS,**DSDT**,**SSDT**,MADT,SBST,XSDT,ECDT,SLIT,SRAT。其中**DSDT**就是它的一個重要的描述表。
DSDT 包含了所有和基本系統(basesystem)不同的設備的信息,basesystem 每臺機器都是一樣的,這個是在 acpispec 里指定的,但是每臺機器都是不相同的,所以不相同的設備大都是由 DSDT 表來描述。它包含了很多AML代碼。大多數 BIOS 是針對 windows 開發的,而 windows 自己也不完全遵循 acpi 規范,所以因為 BIOS 的 bug,這些代碼本身可能有錯,導致其他的系統,如 linux,mac os 出錯。
**Mac OS X不完整支持ACPI規范,僅支持它的子集DSDT**。
[[指南] Intel IGPU HDMI/DP audio (Sandy/Ivy/Haswell/Broadwell/Skylake)](%5B%E6%8C%87%E5%8D%97%5DIntelIGPUHDMI-DPaudioSandy-Ivy-Haswell-Broadwell-Skylake.md)我們可以手動修復這些bug**使之兼容MAC系統**。
DSDT在bios里是以編譯后的`aml`文件存在,需要把它解出來,反編譯成`aml`代碼形式(dsl文件,文本文件),代碼修改完畢再重新編譯,替換掉bios里原來的dsdt表。
**對于非蘋果電腦,要使用上盡可能完美的OS X系統,可以說修改DSDT是最有效的方法。**
# DSDT
DSDT 是 The Differentiated System Description Table 的簡寫。字面上就可以知道它是一個描述系統不同信息的表。它包含了所有除基本系統以外所有不同設備的信息,也就是**每臺計算機設備的基本系統是相同的,而不相同的設備用 DSDT 來描述**。
DSDT 表代碼為 ACPI Machine Language (AML)。
用戶通過修改DSDT可以得到更好的硬件支持,最簡單的理解就是DSDT是描述硬件的。
修改 DSDT 的主要目的就是讓 mac系統識別存在這個硬件并告訴 mac 系統你的硬件位置,以便讓 mac 系統內置的驅動來驅動硬件工作。
修改 DSDT 的基本過程:
提取 bios 的 AML 文件,反編譯為 dsl text 文件,修改完畢后,編譯到 Aml,然后替換 BIOS 中的 DSDT。
# 基本步驟
如果下面選項會對原始ACPI產生顯著的改變(尤其是系統內存區域),你需要重新提取,重新打補丁:
- 更新 BIOS
- 更改 BIOS 選項
- 更改硬件和內存設置。
使用補丁修改 DSDT/SSDT 包含了以下步驟:
- 提取原始ACPI文件
- 反編譯原始文件
- 分析并篩選這些原始文件
- 使用補丁修改
- 編譯并保存,再放到啟動引導的特定目錄
## 提取原始ACPI文件(推薦)
使用 Clover 的 `F4`進行提取,因為易于提取,并且易于比較 `ACPI/origin` 和 `ACPI/patch`(用于故障排除)。
所有BIOS實現都向操作系統提供 ACPI 文件。 因此,在任何操作系統上,您都可以提取它們以便以后進行修補。 因此,可以在 Linux,OS X,Windows甚至 Clover 引導加載程序中進行提取。
在Clover主引導程序屏幕上,您可以按**F4**,Clover 會將本地ACPI文件轉儲到`EFI/Clover/ACPI/origin`。
進入系統后對它們以進行反匯編和修補。
注意,有的 BIOS 可能按`F4` 鍵沒用,而需要 `Fn+F4`,所以,如果不確定的話,`F4` 和 `Fn+F4` 都按一次。提取的時候,你不會看到任何是否完成的提示,只是會因為正在寫文件而出現一點延遲現象,你可以等待5s。如果是用Clover的USB設備(U盤、硬盤)啟動的,文件會被提取到USB設備,這樣會感到比較明顯的延遲。
有時候,Clover 提取的 SSDT 可能會重復。重復的文件,會影響到反編譯。如果你反編譯的時候看到了這樣的提示信息(duplicate definitions),則需要分析所有 SSDT 以消除重復的文件。通過查看文件大小很容易看出哪些是重復的。大小相同的文件可能是重復的。
您可以在終端中查看所有SSDT的文件大小(以字節為單位):
```
ls -l SSDT*.aml
```
## 在Linux提取(可以順便提取聲卡codec)
在Linux系統里,可以直接在系統分區里找到原始ACPI文件。你可以在 `/sys/firmware/acpi/tables` 和 `/sys/firmware/acpi/tables/dynamic` 看到。可以簡單地用命令進行拷貝。
Linux系統不需要安裝,做一個啟動U盤(推薦 Ubuntu Desktop 版本)就可以了:http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows
打開Linux的終端輸入:
~~~
sudo cp -R /sys/firmware/acpi/tables DEST
~~~
**注意: 用FAT32格式的USB設備(U盤、硬盤)的掛載點的路徑,替換命令里的 `DEST`**
(Xee:出現文件權限問題,可以先拷到桌面,在從桌面復制到U盤)
你的U盤或硬盤需要是FAT32格式的。FAT32格式可以避免出現文件權限問題,因為FAT32格式在Linux系統里沒有文件權限的問題。用于替換DEST的 自動掛載的USB設備的名字,取決于你的Linux版本和它的啟動方式。你可以在終端輸入`mount`命令,來查看當前的掛載點。或者,在圖形界面,把鼠標移到文件管理器上相應的USB設備名上。
Mac下提取也是非常容易的。比如使用:`DSDT Editor` 等工具。
## 準備反匯編工具
> [Compiling and decompiling ACPI Tables](https://khronokernel.github.io/Getting-Started-With-ACPI/Manual/compile.html)
> [https://github.com/acidanthera/MaciASL/releases](https://github.com/acidanthera/MaciASL/releases)
要正確反匯編解壓縮的文件,您需要從終端運行的 iasl 編譯器。
您將需要最近的 `iasl` 版本才能正確反匯編它們。這里有一個[適當的版本](https://bitbucket.org/RehabMan/acpica/downloads/)。將 iasl 二進制文件復制到你的路徑(例如`/usr/bin`)是一個好主意,所以很容易從終端訪問。
例如,如果您將其下載到 `~/Downloads/iasl.zip`,則可以在終端中提取并復制它:
```
cd ~/Downloads
unzip iasl.zip
sudo cp iasl /usr/bin
```
### 從github上構建最新的`iasl`
你也可以從我的github構建我的 iasl 的最新版本。iasl 的最新版本最終將在 bitbucket 鏈接上提供,但對于那些想要處于“作死邊緣”的用戶,您可以自己構建。最新的版本總是傾向于有實驗性的和沒有經過良好測試的代碼。
假設你已經安裝了 Xcode:
```
mkdir ~/Projects && cd ~/Projects
git clone https://github.com/RehabMan/Intel-iasl.git iasl.git
cd iasl.git
```
然后build它:
```
make
```
在這一點上,你可以安裝它:
```
sudo make install
```
假設您已將 `MaciASL.app` 安裝到 `/Applications`,那么您可以在 `MaciASL`中使用新版本(您剛剛構建并安裝到 `/usr/bin`):
代碼(文本):
```
sudo cp /usr/bin/iasl /Applications/MaciASL.app/Contents/MacOS/iasl62
```
## 反編譯ACPI文件
雖然提取到的 aml 文件可以用 MaciASL 直接打開,但不建議這樣做。用MaciASL直接打開aml文件,是軟件在做對打開的這個文件的單獨反編譯。然而,ACPI文件之間有著緊密的聯系,只對一個文件單獨反編譯,得到的文件會包含許多難于修復的錯誤。
所以,最好的方法是,**使用iasl編譯器,同時反編譯所有文件**。要做的準備工作有,新建一個文件夾用于存放所有DSDT和SSDT文件,并重命名所有文件,例如加上`.aml`擴展名。
然后在OS X Terminal中反匯編:
```
cd "to directory where you placed all SSDT/DSDT"
iasl -da -dl DSDT.aml SSDT*.aml
```
對于較新的ACPI集(通常\[但不總是\]與Skylake和以后),不需要 `-da`,因為它們已經嵌入了外部操作碼:
```
cd "to directory where you placed all SSDT/DSDT"
iasl -dl DSDT.aml SSDT*.aml
```
**注意**:**不要用`-da`命令去反編譯 DSDT和 SSDT 以外的 ACPI文件,那將是無效的(Xee:所以還是把多余的文件先清掉!)**。
**注意**:請閱讀下面有關`refs.txt`的部分。使用`refs.txt`需要更多的努力,但可以消除許多常見的錯誤。
反編譯成功后,你將得到 所有文件的 dsl 形式,修改就是使用 dsl 文件進行。修改好 dsl 文件后,使用 MaciASL 的另存為,并選擇 文件格式 "ACPI Machine Language Binary” ,再在文件名那里加上 .aml 擴展名,保存。編譯保存為aml之后,把它們放到引導程序規定的加載目錄(變色龍 `/Extra`,`Clover /EFI/Clover/ACPI/patched`)。保存好 dsl 文件,以防將來需要應用更多的修補程序。
**讓我再次陳述它(因為很多人會出現這樣問題):如果您直接在MaciASL 中打開一個AML文件,然后單擊Compile,你做錯了。你們要記住,不要左耳朵進右耳朵出!!!!** 該規則的唯一例外是使用最新的iasl編譯的AML文件,該文件中嵌入了外部操作碼。這包括您自己用當前的iasl和原始設備制造商(通常是Skylake或更高版本)編譯的本地ACPI編譯的文件。
注意:使用 ACPI 6.1 的新工具在處理使用新版iasl編譯的AML文件時更加健壯。ACPI 6.1為編譯器添加了一個功能,將外部引用的操作碼添加到AML二進制文件中。ACPI 解釋器會忽略這些數據,但這些數據對于反匯編程序(也只有 iasl 的 ACPI 6.1 版本)非常有用,可以從獨立的AML中創建更好的反匯編。因此,您可能會發現使用最新工具重新編譯的 AML 文件可能會更可靠地直接打開。當然,現在的 OEM ACPI DSDT和 SSDT 目前還沒有未使用新工具,所以如本指南中所述,您仍然必須首先使用選項 `-da`將所有 DSDT / SSDT 反編譯。
留意一下 蘋果的Snow Leopard 系統的相關實現:不幸的是,10.6.8的`ACPI`太過時了,以至于它用外部操作碼(the external opcode)會阻塞AMLs。如果您計劃在 Snow Leopard 上使用您的`ACPI`文件,那么您就可以在編譯您的AML文件時需要對 `iasl` 使用無證的 `-oe` 選項。當您從MaciASL編譯(另存為)時,這個選項是不設置的,所以您需要在終端中編譯您的文件。“`-oe`”選項會禁止在輸出AML文件中生成外部的操作碼。
# 使用 `refs.txt` 反匯編
有時還有其他未解決的外部因素(任何文件中都未定義的符號)。 iasl 反匯編程序將嘗試猜測參數的數量,但通常猜測不正確。 您可以通過在文本文件中提供外部聲明來更正它。 SGPO,ECRD,ECWT 和 MMTB 是一些常見的未解析符號。
下面的 `refs.txt` 內容有一些常見的(但不太常見)缺少的符號(正如該貼中有些用戶所報告的),反匯編程序容易使它們混淆。
首先在您的 `DSDT/SSDT` 文件所在的目錄中創建 `refs.txt`:
```
External(MDBG, MethodObj, 1)
External(_GPE.MMTB, MethodObj, 0)
External(_SB.PCI0.LPCB.H_EC.ECWT, MethodObj, 2)
External(_SB.PCI0.LPCB.H_EC.ECRD, MethodObj, 1)
External(_SB.PCI0.LPCB.H_EC.ECMD, MethodObj, 1)
External(_SB.PCI0.PEG0.PEGP.SGPO, MethodObj, 2)
External(_SB.PCI0.GFX0.DD02._BCM, MethodObj, 1)
External(_SB.PCI0.SAT0.SDSM, MethodObj, 4)
External(_GPE.VHOV, MethodObj, 3)
External(_SB.PCI0.XHC.RHUB.TPLD, MethodObj, 2)
```
注意:創建 `refs.txt` 的一個方便的方法是在終端中使用 `pbpaste` 命令。復制上面的文本到剪貼板(我假設你知道如何做到這一點),然后:
代碼(文本):
```
pbpaste>refs.txt /* 利用了mac上的兩個命令行工具,pbcopy 可以把管道輸入復制到剪貼板,pbpaste 可以把剪貼板內容導出 */
```
這將在您當前的目錄中創建 `refs.txt`。
然后在反匯編過程中使用它:
代碼(文本):
```
iasl -da -dl -fe refs.txt DSDT.aml SSDT*.aml
```
~~較早版本的`iasl`反匯編程序會將這些外部聲明*放在所有其他外部聲明之前*。這也是一個糟糕的選擇。大多數情況下,您需要移動它們,以便它們遵循其他外部聲明而不是前面的聲明。這將是顯而易見的,因為你會從外部聲明,從 `refs.txt` 插入后面的錯誤。在目前支持ACPI 6.1的`iasl`中,這個bug已經修復了。~~
# 分析原生的ACPI
在反編譯之后,您可能想要查看每個 `dsl` 文件的內容。使用來熟悉每個內容。某些修補取決于內容。 例如,如果要修補以禁用離散圖形設備,則可能正在尋找與該設備相關的 `_OFF` 方法(此過程在單獨的指南中介紹,在本指南的后面部分進行了介紹)。
除了給獨顯打禁用補丁之外,沒有必要對所有的 SSDTs 進行打補丁,因為在[Clover筆記本指南](https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/)中已經完成了常見的重命名操作。重命名最好通過 `config.plist/ACPI/DSDT/Patches` 進行,因為它和手動進行操作相比,可以避免很多的錯誤。
在大多數情況下,您應該只關注 `DSDT.aml`。
# 篩選ACPI文件
對于較舊的計算機(Sandy Bridge和之前),與 CPU 相關的 SSDT 可能會導致問題。如果是這種情況(您已經不得不使用備用的DropTables,`DropOem = true`或`DropSSDT = Yes`),那么您不應該在 `ACPI/patch` 中包含這樣的 SSDT。
我喜歡把所有的 SSDT 按原來的順序包括在內,除非已知會導致問題。請記住,SSDT 不需要任何補丁,不需要重新編譯。您可以直接使用未經修改的原始 AML 文件。
注意:使用當前的[ Clover 筆記本指南](https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/),您需要應用于SSDT的大多數修補程序已經在 `config.plist/ACPI/DSDT/Patches`(IGPU重命名,IMEI重命名,HDAS重命名,EH0x重命名等)中完成。因此,您不大可能需要修補 SSDT。相反,您可以從`ACPI/patched`中省略所有這些元素,并使 `DropOem=false`。在大多數情況下,您只需要修補`DSDT.aml`。
注:從Clover 轉儲的“x” SSDTs文件并同樣地 從 Linux 轉儲的動態子目錄地 SSDTs 動態加載和永遠不會包含在 `ACPI/patched`(這些 SSDTs 和來自SystemMemory 的 ACPI 按需加載)。
所以...假設你認為你可能需要做一些過濾...
在你成功的反匯編你的文件后,看看每一個試圖確定SSDT的目的。如果它與 CPU 相關并且已知會引起問題,就把它拖到其它地方(也可以直接刪除)并且不要通過引導加載程序注入含有它的設置。在大多數情況下,和 CPU 相關的 SSDT 包含了 `Scope _PR.CPUx` 這樣的聲明。
以下是常見的SSDT的特點和功能:
- CPU相關:上面已經討論過。包括除非知道會導致問題的。
- SATA:可以留,也可以不留,自己決定就好。
- PTID:一般對蘋果系統來說,是沒用的。也許這個文件還會有很多錯誤。一種比較少的應用情況是,在這個文件里,可以找到 讀取風扇轉速,溫度,或者其它系統狀態 的線索。
- IAOE:如果存在這個文件,通常來講,它會在DSDT里的 `_PTS` 和 `_WAK` 方法被調用。如果刪除這個文件,就會影響到睡眠。
- GFX0:通常包含了 Device GFX0 的SSDT,是和 集成顯卡 相關的。亮度補丁就是針對這樣的文件的。老的筆記本(Haswell以前的),GFX0一般是定義在DSDT里。對于較新的Haswell筆記本電腦,通常在SSDT中定義(盡管它也可以在DSDT中)。
- PEGP:包含PEGP的文件,一般是和 獨顯 和 雙顯卡切換 有關。有時候不只有一個這樣的SSDT,為了實現 屏蔽獨顯 等功能,你需要保留所有包含PEGP的SSDT,并對它們做一些修改。
我們需要弄清楚,每個SSDT的大概是做什么的,哪些需要刪除,哪些需要不做修改地保留,哪些需要修改。
# 修復錯誤
即使同時反編譯所有文件(使用 `iasl` 的 `-da` 參數),還是難免存在錯誤。反編譯后的文件之所以還會有錯誤,是因為一直以來`iasl` 編譯器的版本都在更新、iasl 的實現細節變化了、不同的電腦與系統環境。存在這些錯誤的原因可能是(Rehabman認為),里面調用到的一些方法,實際上是Windows內部實現的(例如 `MMTB`方法和`MDBG`方法)。實際也有這樣的情況,ACPI 文件的代碼原本就存在缺陷或者某些代碼本來就是無效的(有時候很難區分)。
所以..在確定你需要哪些文件之后,你必須對它們進行補丁,以便它們無錯地編譯。在我的記本 MaciASL 補丁存儲庫中有許多這種錯誤的常見補丁。
* MaciASL:https://github.com/RehabMan/OS-X-MaciASL-patchmatic
* 筆記本電腦補丁:https://github.com/RehabMan/Laptop-DSDT-Patch
注意:以上補丁源里的補丁,沒有在 DSDT Editor 軟件里測試過。DSDT Editor 軟件存在著很多bug,內置的 `iasl` 編譯器也很老了。這個就不要問我了。
在看別人的項目頁面的時候,都請仔細閱讀作者提供的README,到正確的地址下載軟件,學習配置 MaciASL。修復語法錯誤的補丁的名字,以`[syn]`開頭。例如,對于一些比較老的電腦,提供了"`Fix _PLD Buffer/Package Error`", "`Fix TNOT Error`", 和 "`Fix FPED Parse Error`”補丁。為了確定你需要用哪個補丁,需要看 編譯結果 窗口給出的 提示信息,再定位到提示的行,查看錯誤行前后都有什么樣的代碼。您也可以嘗試應用修補程序,以查看它是否進行了更改,如 MaciASL 的“Preview 預覽”窗口中所示。 如果您不熟悉每種錯誤類型,則可能需要進行一些試驗和嘗試/錯誤。
對于一些錯誤,你可以簡單地刪除造成錯誤的那行代碼來解決。當然,這要取決于這一行代碼對于功能的實現,是否是必需的。例如,對于由External語句造成的錯誤,一般可以刪除那行代碼以修復錯誤。如果需要,你自己可以做一個刪除這樣的錯誤行代碼的補丁。
學習一下 ACPI 規范 和 具有一些編程經驗,有助于處理 DSDT 和 SSDT。
你的目標是讓每個 `.dsl` 文件無誤地編譯( warnings/remarks/optimizations 都不用管)。一旦你有沒有錯誤編譯的文件,你可以繼續打補丁,以解決你的 OS X 安裝問題。
具有多余/不必要的外部聲明是很常見的。 例如,我查看的最近的 DSDT 有很多 `Name already exists in scope` 錯誤??。 對于DTSE,DTS1,DTS2,DTS4,BNUM,PDTS,PKGA,SPST。
解決方法是簡單地注釋掉相關的外部聲明。
例如:
```
// External (DTS1, FieldUnitObj) // (from opcode)
// External (DTS2, FieldUnitObj) // (from opcode)
// External (DTS3, FieldUnitObj) // (from opcode)
// External (DTS4, FieldUnitObj) // (from opcode)
// External (DTSE, FieldUnitObj) // (from opcode)
... and so on ...
```
注意:最近 DSDT 中的一個常見錯誤是 `ECRW`(在 `_CRS` 方法中)。這是 `iasl` 錯誤導致的一個非常常見的錯誤。我不打算為它添加一個 MaciASL 補丁,因為它最終將由 Intel 修復(這是一種復原)。
容易修復。
替換下面的:
```
If (LEqual (PM6H, One))
{
CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status
Store (Zero, ECRW (If (PM0H)
{
CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length
Store (Zero, F0LN)
}))
}
```
使用下面的:
```
If (LEqual (PM6H, One))
{
CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status
Store (Zero, ECRW)
}
If (PM0H)
{
CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length
Store (Zero, F0LN)
}
```
# 常見的補丁
一般,你需要先弄清自己的需求,再根據需求選擇要用的補丁。但也有一些補丁是通用的,并且這些補丁一般不會造成什么問題。它們在Rehabman的[補丁源 repo ](https://github.com/RehabMan/Laptop-DSDT-Patch/blob/master/.maciasl)里,這里列出:
~~~
"Fix _WAK Arg0 v2"
"HPET Fix"
"SMBUS Fix"
"IRQ Fix"
"RTC Fix"
"OS Check Fix"
"Fix Mutex with non-zero SyncLevel"
"Fix PNOT/PPNT"(只在丟棄與CPU相關的SSDT時使用)
"Add IMEI" (如果DSDT或SSDT已經有 IMEI/HECI/MEI 設備,請勿使用)
~~~
注意:您使用的 `OS Check Fix` 補丁與筆記本電腦隨附的 Window s版本或當前使用的 Windows 版本無關。
注意:如果包含了所有 OEM SSDTs,請不要使用 `Fix PNOT/PPNT` 補丁。它僅適用于您省略與OEM CPU相關的 SSDTs 的情況。
USB 補丁可以用來修復“睡眠自動喚醒”,即在睡眠開始之后幾秒鐘內沒有喚醒的情況下,筆記本電腦將不會睡眠。
這些補丁可用于注入 USB 的電源屬性:
`6-series USB`
`7-series/8-series USB`
使用`AppleUSBXHCI.kext`的“睡眠自動喚醒”的替代解決方案是使用“`USB _PRW 0x6D`(即時喚醒)”。您應該檢查您的DSDT,以確定相關的`_PRW`方法返回什么,以確定補丁適合您的DSDT。在repo中也提供了“`USB _PRW 0x0D`(即時喚醒”)(0x0D和0x6D都是`XHC/EHC/HDEF`從`_PRW`返回的常見值)。
`_PRW` 修補程序可用于修復"即時喚醒(instant wake)",在這種情況下,筆記本電腦將在睡眠開始后的幾秒鐘內,筆記本電腦無法入睡。只使用“`USB _PRW 0x6D (instant wake)`”或者“`USB _PRW 0x0D (instant wake)`”,因為它與DSDT中的現有代碼相關(也請注意適用于Skylake和更高版本的這些補丁的特定版本)。 您應該檢查您的DSDT,以確定相關的 `_PRW`方法返回什么,以確保該補丁適合您的DSDT。“`USB _PRW 0x0D (instant wake)`”(`0x0D` 和 `0x6D`是`XHC/EHC/HDEF`從`_PRW`返回的常見值)
USB3 Mutliplex補丁,有助于加載`AppleUSBXHCI.kext`(原生USB3.0驅動),于是就不需要安裝第三方的`GenericUSBXCHI.kext`了。這個補丁是基于Mieze的發現而制作的。大部分DSDT需要對它做一些修改,才能使用(不然可能會提示有錯誤)。例如,對于惠普的Probook,Rehabman制作了這個補丁的修改版本。聯想u310/u410可以直接使用這個補丁:"`7-series USB3 Multiplex`”
如果您具有Haswell CPU / 8系列芯片組,并且 `AppleLPC.kext` (電源管理的一種)未加載,則應使用此修補程序注入兼容的ID,以允許其加載:
“`Haswell LPC`”
如果您具有Skylake CPU / 100系列芯片組,并且 `AppleLPC.kext` 未加載,則應使用此修補程序注入兼容的ID,以允許其加載:
“`Skylake LPC`”
注意:Skylake及更高版本可能不需要AppleLPC。
關于重命名的注意事項:重命名必須是“平衡的”。 重命名對象以更好地匹配OS X的期望是很常見的(例如,將“將`GFX0`重命名為`IGPU`”以進行正確的IGPU電源管理)。 在這種情況下,所有引用該名稱的DSDT / SSDT也必須重命名。 這就是為什么最好使用 `config.plist / ACPI / DSDT / Patches` 完成重命名的原因。
注意重復標識符:您必須確保您的補丁文件不包含重復標識符。一個常見的例子是在一個SSDT中添加一個`_DSM`方法到指定的路徑,在那里,OEM已經在另一個SSDT的路徑上定義了一個`_DSM`。為了避免這個問題,您可以使用“`Remove _DSM methods`”補丁作為您對所有 DSDT/SSDT 的第一個補丁。也可以使用“`Rename _DSM methods to XDSM`”也是可以的(有時“`Remove _DSM methods`”在`MaciASL`中暴露一個缺陷)。
# 問題具體修補
電池狀態:http://www.tonymacx86.com/yosemite-laptop-support/116102-guide-how-patch-dsdt-working-battery-status.html
中文翻譯:http://bbs.pcbeta.com/viewthread-1521462-1-1.html
背光控制:http://www.tonymacx86.com/yosemite-laptop-support/152659-patching-dsdt-ssdt-laptop-backlight-control.html
中文翻譯:http://bbs.pcbeta.com/viewthread-1571456-1-1.html
禁用 NVidia / Radeon 獨立顯卡 :http://www.tonymacx86.com/yosemite-laptop-support/163772-guide-disabling-discrete-graphics-dual-gpu-laptops.html
當你在看針對某個特定型號的筆記本教程的時候,作者都會介紹用了哪些補丁,或者直接提供下載。你能容易的看出來,他們的補丁和Rehabman的補丁,在語法上是相似的。(例如這樣的語法:'into_all method label FOO code_regex xxyy removeall_matched;')。這些補丁語句需要粘貼到MaciASL的補丁窗口,再應用。
如果你對制作補丁有興趣,可以去看有關MaciASL修補程序語法的文檔:http://sourceforge.net/p/maciasl/wiki/Patching%20Syntax%20Grammar/
注意:在許多情況下,DSDT補丁與其他kexts,已打補丁的kexts或 Clover `config.plist`補丁一起結合使用,在系統的kext被加載時,這些補丁會對這些系統的kext進行打補丁。
# 打過補丁的AppleHDA 的相關補丁(仿冒聲卡驅動相關的補丁)
有兩個和仿冒聲卡驅動相關的補丁,需要和仿冒的聲卡kext一起使用:
`Audio Layout 12` (根據實際情況,自己修改 layout-id,例如把 12 改成 28 等)
`IRQ Fix`(解決需要`-f`才能加載聲卡驅動的問題)
注意,您必須有一個與您的編解碼器匹配的AppleHDA,并且必須確定選擇了哪個layouid-id。對于已修補的AppleHDA的創建者來說,layout-id是一個任意的選擇。
要查看別人修改的AppleHDA用的`layout-id`是哪個值,首先,你需要知道自己聲卡的`codec id`的十進制形式(例如,`0x10ec0269 = 283902569`)。
再去查看 `AppleHDA.kext/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/Contents/Info.plist`,查看HDAConfigDefault 節點下面的`codec id`(可能有許多條目在一個草率修補的AppleHDA或只有一個)。
和你的`codec id`匹配的那組里,LayoutID的值,就是你需要的 layout id 值。
有的驅動修改者,同一個`codec id`可能會對應多個`layout-id`,選擇一個你需要的 id 注入。
# 保存由引導裝載程序裝載的文件
為了使用你修改、編譯好的DSDT/SSDT,你需要把它們放到Clover引導能加載它們的目錄。每種引導的加載目錄是唯一的,且對文件的命名要求也不同。
如果用 **MaciASL** 保存,另存為的時候,文件格式一定要選擇"ACPI Machine Language Binary”(文件-另存為-文件格式)`.aml` 后綴。如果不選擇文件格式,就相當于,硬是把`dsl`文本文件,存成了`aml`字節碼文件(沒有經過編譯器轉換),這會造成無法預知稀奇古怪的問題。
Clover(推薦):aml 文件應該放到 Clover 所在的分區(通常是EFI分區),如果存在 `EFI/Clover/ACPI/patched`。
DSDT.aml(如果存在)將自動替換OEM DSDT。 本指南(以及與本指南鏈接的其他指南)假定您使用的是`config.plist / ACPI / AutoMerge = true`,`config.plist / ACPI / SSDT / DropOem = false`。 使用 `AutoMerge = true` 時,可以將打好補丁的 SSDTs 按照原來的名稱( `ACPI/origin` 中的名稱)放置在 `ACPI/patched`中進行修補,會自動將其插入,以免影響SSDT的原始順序。 不需要(或建議)將 `SortedOrder` 與`AutoMerge = true`一起使用。 其他配置在下面的“推薦配置”中會介紹。
Clover 3062版本以前,SSDT的命名必須是這樣的:SSDT-x 或 SSDT-xx,x是一個整數(一直支持到SSDT-19)。Clover允許SSDT的名字不連續(例如,SSDT-1.aml, SSDT-5.aml, SSDT-6.aml是可以的)。Clover 3062以后的版本,會加載所有在ACPI/patched里的aml文件,對名字沒有嚴格限制了。一定要注意,SSDT的加載順序非常重要,你留下來的SSDT,要保持提取的時候的順序。
Clover 3062版本以后的注意事項:`ACPI/patched` 里SSDT的加載方式的改變,造成了加載順序的不確定性。你應該要使用 `config.plist/ACPI/SortedOrder` 功能,指定SSDT的加載順序。Clover 3088 版本以后,實現了`SortedOrder`參數。從我的 Clover 指南鏈接的config.plist 文件對SortedOrder有一個很好的默認值:http://www.tonymacx86.com/yosemite-laptop-support/148093-guide-booting-os-x-installer-laptops-clover.html
注意:SSDTs必須由引導加載器按其原始順序加載。原始的順序是由名稱后面的數字指定的。例如,如果您使用Clover `F4`來提取您可能會有類似的東西:SSDT-0.aml, SSDT-1.aml, SSDT-2.aml, SSDT-3.aml,表示SSDTs必須以該順序加載(0/1/2/3)。
~~變色龍(或Chimera 不推薦):修改、編譯好的DSDT/SSDT,應該放到 系統盤的 /Extra(或者你的引導程序所在的其它地方的 `/Extra`)。如果/Extra里存在DSDT.aml,引導程序就會用這里的DSDT,替代掉原始的DSDT,提交給系統。變色龍要求,SSDT的名字是連續的。這樣的情況,文件都會被加載:SSDT.aml, SSDT-1.aml, SSDT-2.aml, SSDT-3.aml,直到引導找不到接下來的名字的文件。另外,這樣的情況:SSDT.aml, SSDT-1.aml, SSDT-4.aml, SSDT-5.aml,只會加載SSDT.aml 和 SSDT-1.aml。SSDT-4.aml 和 SSDT-5.aml不會被加載(變色龍會忽略這些文件)。~~
~~最后,如果不先屏蔽原始的OEM SSDT,就不能放自己修改的SSDT。最簡單的方法,是設置`DropSSDT=Yes`(變色龍) 或者 `ACPI/SSDT/DropOem=true`(Clover),從而在系統啟動的時候,先屏蔽原始的SSDT,之后再把目錄里的SSDT(沒有修改或修改過)提交給系統。~~
如上所述,Clover的RehabMan分支中的一項新功能允許您在不使用 `DropOem = true`且不使用 `SortedOrder` 的情況下替換 OEM SSDT,同時始終保持四葉草注入的未打補丁和打補丁的SSDT的原始順序。通過設置 `config.plist/ACPI/AutoMerge=true`,啟用此功能。 當放置在 `ACPI/patched` 中時,SSDT必須保留其原始編號方案。 從2017年12月15日起,此功能已在 RehabMan bitbucket 網站上的Clover_v2.4k_r4359.RM-4506.c5fc0346.zip 中全面運行。 自 r4334 起,所需的更改已在官方Clover (在 sourceforge 上)中實現(但您可能會遇到一些錯誤,請使用 RehabMan fork 的版本 )。筆記本電腦主指南中鏈接的每個 plists 默認情況使用 `AutoMerge = true`。
RehabMan fork 的 Clover::https://github.com/RehabMan/Clover
筆記本電腦主指南:https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/
# 推薦的配置
以下是有效的配置,其他任何配置都可能是錯誤的(有些情況我不希望涉足,因此使用了‘可能” likely’)。首先列出的配置更可取。
全部 hotpatch:
- 所有的補丁都是通過`config.plist`完成的
- 在 `ACPI/patched` 中只有附加的 SSDTs(例如,沒有打補丁的 `DSDT`, 沒有打補丁的`SSDTs`)
- `SortedOrder` 可以不指定
- `DropOem=false`
部分 hotpatch:
- 打補丁的`DSDT.aml`放置在 `ACPI/patched`
- 在 `ACPI/patched` 中只有附加的 SSDTs (例如,沒有打補丁的 `SSDTs`)
- 通過`config.plist`來進行重命名(會對原生的 SSDTs 和 `ACPI/patched` 下的 `DSDT.aml` 應用)
- 不指定 `SortedOrder`
- `DropOem=false`
部分 hotpatchh 和打補丁的SSDTs:
- 需要 RehabMan 構建的Clover
- 打補丁的`DSDT.aml`放置在 `ACPI/patched`
- 在 `ACPI/patched` 中選擇打了補丁的的 SSDTs (必須以提取到 `ACPI/origin` 的名稱來命名)
- 附加的 `SSDTs` 也放置在 `ACPI/patched` 中
- 仍然可以使用`config.plist` 來完成重命名
- 不指定`SortedOrder`
- `config.plist/ACPI/AutoMerge=true`
- `DropOem=false`
全部打補丁的 DSDT + SSDTs:
- 打補丁的`DSDT.aml`放置在 `ACPI/patched`
- 完整的一組打了靜態補丁的 OEM SSDTs 放置在 `ACPI/patched`(還是以原本 `ACPI/origin` 下的原始名稱)
- 附加的`SSDTs` 也放置在 `ACPI/patched` 中
- `config.plist`中的重命名是不推薦的(它們只適用于 `DSDT.aml`)
- `SortedOrder`需要設置 `SSDT` 加載順序
- `DropOem=true`
# Floating regions
在ACPI中,OperationRegion可以定義MMIO 區域(region),SystemMemory區域,EmbeddedControl區域等。這些區域通常具有固定的地址,這些地址僅取決于計算機配置,BIOS版本或BIOS選項。 有時,這些區域可能會隨機或意外更改。 這被稱為“浮動區域”。
由于通過修補DSDT和/或SSDT,我們在給定的時間點提供了這些地址的快照,當BIOS發出命令,需要變動地址值時,我們提取的文件是做不到這樣的變動的。在這樣的情況下,你也許能注意到,某一個特定的功能變得斷斷續續,或者可能隨機地出現一些穩定性問題。
如果您具有隨機浮動的區域,則**可以嘗試** Clover 的 FixRegions 功能(`config.plist / ACPI / DSDT / Fixes / FixRegions = true`)。 您可以在Clover Wiki中找到詳細信息。 注意:FixRegions 只能固定 DSDT 中的浮動區域。 SSDT中的浮動區域存在問題,除了為受隨機浮動區域影響的SSDT 不提供修補的SSDT之外,沒有其他好的解決方案。 解決修補的SSDT中的浮動區域超出了本指南的范圍。 請注意,FixRegions 是相對有問題的。 它無法修復所有區域,有時可能會錯誤地“修復”區域。
# 資源
MaciASL(RehabMan fork):https://github.com/RehabMan/OS-X-MaciASL-patchmatic
patchmatic:https://github.com/RehabMan/OS-X-MaciASL-patchmatic
iasl(RehabMan fork):https://bitbucket.org/RehabMan/acpica/downloads
ACPI spec:
5.0a:[http://acpi.info/spec.htm](http://acpi.info/spec.htm)
Latest:[http://www.uefi.org/specifications](http://www.uefi.org/specifications)
RehabMan github:https://github.com/RehabMan?tab=repositories
Clove r筆記本電腦指南:http://www.tonymacx86.com/yosemite-laptop-support/148093-guide-booting-os-x-installer-laptops-clover-uefi.html
筆記本電腦的 Clover `config.plist`文件:https://github.com/RehabMan/OS-X-Clover-Laptop-Config
Clover 跟帖:http://www.insanelymac.com/forum/topic/284656-clover-general-discussion/
Clover 變化:http://www.insanelymac.com/forum/topic/304530-clover-change-explanations/
# 提供反饋
請勿將此線程視為您的專用疑難解答線程。 如果您的特定筆記本電腦有特定問題,請打開單獨的線程。 如果您發現此處有錯誤或希望做出貢獻,請回復此主題。
# 問題報告
請閱讀上面的“提供反饋”。最好打開一個單獨的帖子。
在那個單獨的帖子中,清楚地描述你的問題。并提供相關數據...
閱讀常見問題,“Problem Reporting”
https://www.tonymacx86.com/threads/faq-read-first-laptop-frequent-questions.164990/
****
# 使用Clover Fix
也許有的同學會說,有的電腦不用 DSDT 也可以完美,其實,這樣的說法不太嚴謹。因為,雖然沒有在相關文件夾放自己修改過的 DSDT 文件,但是,系統啟動時,其實是會自動從BIOS 讀取出廠時的原始 DSDT的。
由于 **Clover 的強大功能**,使得不需要手工修改原始的 DSDT:
比如`Fix ****`參數,就是在啟動讀取原始 DSDT 文件時,由 Clover 程序根據相應的`Fix參數`,向 DSDT 里添加對應的通用性代碼,再把修改后的DSDT,提交給系統。這樣,修改 DSDT 的動作,是發生在系統啟動時。也就給大家一個似乎不需要自己修改的DSDT的印象。
# 參考
相關:[SSDT GPU (Graphics Card) Injection](https://www.tonymacx86.com/threads/ssdt-gpu-graphics-card-injection.183354/)
其他翻譯:
[DSDT 有什么?如何提取黑蘋果系統里的 DSDT 文件](http://www.xp988.com/tech/6028.html)
[[教程]](http://bbs.pcbeta.com/forum.php?mod=forumdisplay&fid=546&filter=typeid&typeid=1199)[\[授權翻譯\] 使用補丁修改 DSDT/SSDT \[DSDT/SSDT 綜合教程\]](http://bbs.pcbeta.com/viewthread-1571455-1-1.html)
[對筆記本的 DSDT/SSDT 打補丁](http://blog.csdn.net/wr132/article/details/54798754)
[教程 運用MaciASL軟件的補丁源-幫你完善DSDT](http://www.memacx.com/thread-5726-1-1.html)
[關于DSDT修改-提取軟件以及使用方法【詳解】](http://www.memacx.com/thread-718-1-1.html)
http://www.sdifen.com/getdsdt.html
http://bbs.pcbeta.com/viewthread-1571455-1-1.html
https://www.maoshu.cc/1168.html
DSDT SE鏈接: http://pan.baidu.com/s/1gfbthlD 密碼: r6c4DSDTeditor鏈接: http://pan.baidu.com/s/1bpcNhTl 密碼: hag8IDSDT鏈接: http://pan.baidu.com/s/1qYAS4XY 密碼: qwvwMACIASL鏈接: http://pan.baidu.com/s/1c1I2ucC 密碼: 99x9
- 簡介
- 基本命令
- 高效操作
- 命令操作
- 常用軟件
- 問題設置
- 命令行神器
- 開發配置
- 開發環境配置
- brew
- git
- Karabiner-Elements
- iTerm2
- MacVim
- aria2
- LaunchBar
- zsh
- Tmux
- Charles
- Emacs(感覺不需要了)
- 常用工具
- Alfred
- mac 詞典增強
- Mac 高級操作
- mac 資源
- 黑蘋果
- 個人配置
- 黑蘋果資源
- 驅動集合
- 工具集合
- 黑蘋果指南
- [FAQ] 開始必讀!筆記本電腦常見問題
- [指南] hackintosh之SSDT/DSDT
- [指南] hackintosh之hotpatch
- [指南] 為Sierra(以及后來的版本)進行USB電源屬性注入
- [指南] 10.11+ USB的變化和解決方案
- [指南] 為USBInjectAll.kext創建一個自定義的SSDT
- [指南] Intel IGPU HDMI/DP audio (Sandy/Ivy/Haswell/Broadwell/Skylake)
- [指南] 怎么給DSDT打補丁來顯示電池狀態
- [指南]在雙GPU筆記本電腦中禁用獨立顯卡.md
- [指南]
- OpenCore
- 多系統引導
- hotpatch
- 黑蘋果裝機
- 刷BIOS大法
- dd