[TOC]
*****
# 【指南】10.11+之后 USB的變化和解決方案
英文原文:[[Guide] 10.11+ USB changes and solutions](https://www.tonymacx86.com/threads/guide-10-11-usb-changes-and-solutions.173616/)
# 概述 (Overview)
在10.11版本,蘋果完全重寫了USB驅動程序。新的驅動程序似乎在很大程度上使用了ACPI,比以前的驅動程序更大。這給ACPI(DSDT)的正確性帶來了更多的壓力。如果不正確,存在的端口可能不會被新的驅動程序啟用
事實上,即使是蘋果自己的產品也被發現是不正確的,因此蘋果公司發明了一種方法來用一個端口注入器來覆蓋DSDT。在事件屬性被注入來定義可用端口時,這些屬性將被使用而不是ACPI。
內置的端口注入器也可以干擾USB接口,因為一個給定型號的Mac的USB拓撲不太可能與你的PC相同。
要解決這些問題,可能需要采取一些步驟。
注意本指南適用于英特爾USB3。第三方USB3,如Asmedia, NEC/Renasas還是有問題的。這些控制器沒有解決方案。所以請不要在這個帖子里問這個問題。
更新:對于不支持的USB3控制器(例如,不是英特爾生產的,不是睿思科技生產的 | not Intel, not Fresco Logic )你可以試試最新的[GenericUSBXHCI.kext](https://github.com/RehabMan/OS-X-Generic-USB3)。
# 工具/解決方案的概述
有一些方法(methods)/驅動(kexts)/技術 (techniques)來解決這些。
* 選擇正確的BIOS選項
* 在`DSDT`中使用`EHCx->EH0x`重命名
* 通過`XHC to EHCI`上,使用`FakePCIID_XHCIMux`路由(route)`USB2`設備
* 用一個自定義的端口注入器或自定義`SSDT`為`USBInjectAll.kext`注入端口
* 使用`USBInjectAll.kext`來注入端口
* 在運行OS X時,給DSDT打補丁來模擬Windows的一個版本
`USBInjectAll.kext` 和一些其他的好東西: https://github.com/RehabMan/OS-X-USB-Inject-All 。如果您需要開源庫中的各種文件,請下載這個ZIP: https://github.com/RehabMan/OS-X-USB-Inject-All/archive/master.zip 。已經構建發布的`USBInjectAll.kext`版本在README中提供鏈接,請仔細讀。
注意:閱讀`USBInjectAll`的README是一個好主意,但在閱讀這篇文章之前,你可能不會讀懂,這樣你就能更清楚地理解這些問題。
除非您的ACPI實現是完美的,否則您應該創建一個為了`USBInjectAll.kext`的自定義SSDT。它被包括在我的相關指南里:https://www.tonymacx86.com/threads/guide-creating-a-custom-ssdt-for-usbinjectall-kext.211311/
# BIOS選項
USB控制器的配置通常依賴于BIOS設置。 對于大多數個人電腦,你應該設置 `XHCI` “auto” 或 “smart auto”。
這些設置通常會影響與XHCI控制器初始化、USB2路由、USB3端口啟用 有關的DSDT中的代碼。一些DSDTs非常準確,并對所選的選項(例如,BRIX)做出適當的響應,而有些則不是。
# 禁用默認的注射器(Disabling the default injectors)
第一步是確保默認的注入器沒有效果。有這兩類注入器:
* 控制器(Controller)注入器: 這些 匹配Mac型號(SMBIOS)和ACPI中的控制器名稱(EHC1/EHC2/XHC1)。
* 集線器(Hub)端口注入器: 這些 匹配Mac型號和`locationID`(基于控制器和端口的地址).
第一類端口注入器很容易通過`DSDT`補丁來禁用。對于大多數個人電腦(PCs),`XHCI`控制器(`USB3`)被命名為“XHC”,因此它不會與使用“`XHC1`”的內置注入器匹配。
`EHC1`和`EHC2`通常被mac電腦和個人電腦( PCs)用來識別這兩個`EHCI`控制器(USB2)。通過將`EHC1`重命名為`EH01`和將`EHC2`重命名為`EH02`,您可以有效地禁用與您所使用的SMBIOS相匹配的內置端口注入器。
重命名可以用通過你打了補丁的DSDT中的`find/replace`來完成,或者通過 Clover 的`config.plist/ACPI/DSDT/Patches`。
例如,我的 Lenovo u430,我使用了下面的補丁來完成`EHCx->EH0x`的重命名:
```
# rename EHC1 to EH01
into device label EHC1 set_label begin EH01 end;
into_all all code_regex EHC1\. replaceall_matched begin EH01. end;
into_all all code_regex \.EHC1, replaceall_matched begin .EH01, end;
# rename EHC2 to EH02
into device label EHC2 set_label begin EH02 end;
into_all all code_regex EHC2\. replaceall_matched begin EH02. end;
into_all all code_regex \.EHC2, replaceall_matched begin .EH02, end;
```
注意:很有可能,上面的補丁可能無法捕捉到你的`DSDT`中所有的 `EHC1/EHC2` 實例,所以您可能需要手動更改一些引用。一個全局的搜索和替換也是一個合理的策略方法。
對于 技嘉 BRIX,我不需要給DSDT打補丁,所以我使用了通過`config.plist/ACPI/DSDT/Patches`中的Clover配置來補丁:
第1個:
```
Comment: change EHC1 to EH01
Find: <45484331>
Replace: <45483031>
```
第2個:
```
Comment: change EHC2 to EH02
Find: <45484332>
Replace: <45483032>
```
在Xcode中,它看起來如下:

你可以從 USBInjectAll 項目(上面有該項目的鏈接)提供 ` config_patches.plist`中 復制/黏貼這些補丁到你的 DSDT。使用`config.plist`實現這些補丁是最簡單也是最直接的方法。
注意:您還可以看到“第0個”,這是模擬Windows的一部分。現在不用考慮,后面會討論。
您還應該驗證`XHCI`被命名為`XHC`,而不是`XHC1`。之前的OS X版本的一個常見解決方案是應用“`USB3 Multiplex`”補丁。該補丁應該在10.11中避免,因為它將`XHC`重新命名為`XHC1`,它引入了與內置端口注入器相匹配(matching against)的可能性。在 `FakePCIID.kext` 和 `FakePCIID_XHCIMux.kext` (稍后討論)中實現USB2路由還有一種更簡單的方法。
對于一個集散器(hub)來說,沒有一種簡單的方法可以讓一個中心的內置端口注入器失效。您的SMBIOS選擇 有一個內置的注入器,并且由于端口注入器,在內部集線器(hub)有設備問題,您需要創建自己的集線器端口注入器來重寫(overrides)默認值。可以通過設置高`IOProbeScore`來重寫默認值,這與 ProBook 4540s 的 MacBookPro9,1-EH02-hub 注射器非常相似。
注意:`USBInjectAll.kext` 也有兩個用于 `EH01` 和 `EH02`(`port #1 only`)的集線器端口注入器。
# 端口注入器的一些需求
在通過重命名來禁用內置的端口注入器后,驅動程序將使用來自`ACPI`(`_UPC` 對象)的數據來確定哪些端口可用。你需要多閱讀一些ACPI規范中關于`_UPC`對象的內容。
你可以看見`ioreg`中哪些端口是處于活動狀態。

注意:這是我的端口注入器`kext`處于活動。沒有它,情況就大不一樣了。有許多端口會不見。
如果你需要的端口不處于活動狀態,很可能你的 DSDT 是不正確的并且有一些端口實際上是連接的但是被標記“`不可連接`”(` _UPC` 0的第一個字段 | first field of `_UPC` zero)
盡管您可以修補 DSDT 來更改 `_UPC` 返回的數據,但是構建一個能夠支持消失的端口(the missing ports)的注入器更容易。由于控制器對象被重命名,所以不可能與內置的端口注入器發生沖突。
在我的各種repos中有幾個端口注入器的例子:
https://github.com/RehabMan/Lenovo-U430-Touch-DSDT-Patch
https://github.com/RehabMan/Lenovo-Y50-DSDT-Patch
https://github.com/RehabMan/HP-Envy-DSDT-Patch
https://github.com/RehabMan/HP-Envy-K-DSDT-Patch
https://github.com/RehabMan/HP-ProBook-4x30s-DSDT-Patch
在當前的項目中,注入器實際上并沒有被使用。這些項目還包含自定義的 `USBInjectAll` 配置(通過 `SSDT-HACK` 中的`UIAC/RMCF`)。您可以在`USBInjectAll` 的 README上閱讀更多關于 `USBInjectAll` 配置的信息
`IOACPIPlane` 中的數據在確定可能需要啟用的端口時是有價值的。
這是我的 u430 在 `IOACPIPlane` 的`XHC`的圖像:

事實上,端口地址完全依賴于 `XHCI` 設備id。USBInjectAll使用此方法向每個端口注入適當的地址。
記住那15個端口的限制。您可能需要測試您的端口注入器的不同版本,因為潛在端口的數量可能不在15個端口限制之內。例如,您可能有`HS01-HS15`,以及`SSP1-SSP6`。這將是21個總端口(15+6)。僅供參考……目前的芯片組不可能有21個端口(8/9系列芯片組最多支持14個端口,6個端口可以配置為USB3,會一共有20個端口... 不知道為什么會有額外的端口。
要測試每個端口,您需要一個端口注入器,它覆蓋了`HS01-HS09`和`SSP1-SSP6`(總共15個),第二個用于 `HS10-15` 和 `SSP1-SSP6`。或者您可以取消USB3端口,并獨立地測試`SSPx`和`HSxx`。你懂的。一旦確定了活動的實際端口,就可以自定義端口注入器。
`USBInjectAll` 有一些特殊的標志,用于在組中禁用端口。因此,除了創建兩個自定義的注入器,您還可以使用`USBInjectAll.kext`。內核標記 `-uia_exclude_hs` 將會排除所有`HSxx`端口被注入到`XHC`上。內核標記 `-uia_exclude_ssp` 或者`-uia_exclude_ss` 將會排除`SSPx` 或 `SSxx`。使用這些標志,您可以在不使用端口限制補丁的情況下測試所有端口。請記住,如果所有USB端口都在`XHC`上,那么使用 `-uia_exclude_hs` 可能會使你的USB鼠標/鍵盤無法正常工作(USB3鍵盤/鼠標不常見)。這在筆記本電腦上并不是問題,因為內置的PS2觸控板和鍵盤都是可用的。為了在沒有鍵盤和鼠標的情況下收集信息,您可以通過局域網(LAN)上另一臺計算機進行遠程桌面控制。
您可以使用 `USBInjectAll.kext` 為您的USB控制器注入所有端口。通過注入所有端口,您可以確定哪些端口已經被使用了。還有一個可用的補丁可以增加端口的限制。只使用短期來確定哪些端口需要進入您的端口注入器。請確保您閱讀了 `USBInjectAll.kext` 的README。
**重要提示!** 端口限制補丁不應該作為一個永久的解決方案使用。現在有明確的證據表明,使用它會導致其他數據超出明顯的固定大小的數組被破壞。當端口限制超過時,USB驅動程序就會產生奇怪的行為。
集線器端口注入器(Hub port injectors)只匹配 `locationID` 和 SMBIOS 。由于`locationID`來自于控制器的端口號和地址(在 Macs和 PCs上是相同的),所以不可能通過重命名來禁用匹配的內置端口注入器。相反,必須在端口注入器驅動程序(kext)中使用更高的 `IOProbeScore` 來重寫 現有的端口注入器。`u430` 開源庫(repo)有一個集線器(hub)端口注入器的例子,這是在使用 `FakePCIID_XHCIMux.kext` 時所需要的。ProBook 開源庫有一個集線器(hub)端口注入器的例子它使用一個更高的 `IOProbeScore` 重寫了一個內置的集線器端口注入器。
注意,每個控制器/集線器(controller/hub)都有15個端口限制。也就是說,在每個注入器的個性(each injector personality)中,你只能定義15個總端口。一般來說,這不是一個問題,除了`XHCI`控制器,它的限制更容易到達。參見下面的關于`FakePCIID_XHCIMux` 的討論,因為 `FakePCIID_XHCIMux` 可以用來將一些端口移動到`EHCI`,從而消除了該問題的限制。
一個端口注入器驅動程序中 `Info.plist` 里的大多數條目是“鍋爐板”。建議您使用其中一個示例,并修改以適合您自己的硬件、SMBIOS等。
關于端口注入器屬性的一些說明:
* port-count:這個名字不太好,因為它根本就不是“數”。相反,它是最大的端口地址(由“端口”指定)
* UsbConnector:描述USB端口的連接器類型。通常的值 是 0、3、255,(0:USB2 type-A,3:USB3 type-A,255:proprietary)。更多信息在 ACPI規范中的(_UPC)。
* port:必須在DSDT中匹配端口`_ADR`。你可以在 `IOACPIPlane` 中看到這個值。
# `_OSI` 和Windows版本的檢查
ACPI代碼可以使用 `_OSI`方法(由ACPI主機實現)來檢查它正在運行的Windows版本。大多數DSDT實現將根據運行的Windows版本而改變USB配置。
當運行OS X時,DSDT可能不會對`_OSI`(“`Windows <version>`”) 返回 `true` 做任何檢查,因為它只對“Darwin”作出響應。這就是DSDT補丁的“`OS Check Fix`”系列的原因。當運行 Darwin 時,通過修補DSDT來模擬特定版本的Windows,我們可以獲得在運行特定版本的Windows時通常會發生的行為。
于10.11,正確的Windows版本模擬是系統相關(system dependent)的。一些計算機需要“Windows 8”(“Windows 2012”),一些需要“Windows 7”(“Windows 2009”)和其他一些需要“Windows Vista”(“Windows 2006”)。所以進行一些試驗可能是必要的。
ACPI 補丁是在這里:http://www.tonymacx86.com/yosemite-laptop-support/152573-guide-patching-laptop-dsdt-ssdts.html
如果你不需要修補DSDT(臺式機),你可以通過`config.plist/ACPI/DSDT/Patches`和一個小的 `SSDT` 完成這個修復。
例如,是關于 `BRIX` 的,我使用下面的補丁將 `_OSI` 映射到 `XOSI`:
~~~
Comment: change _OSI to XOSI
Find: <5f4f5349>
Replace: <584f5349>
~~~
這是在Xcode的編輯器中的樣子:

我已經從 `SSDT-HACK.dsl` 中提取了相關部分,是為了這個目的而使用的:
(`BRIX` `SSDT-HACK.dsl` 還有一些其他的東西在里面)。
```
DefinitionBlock ("", "SSDT", 1, "hack", "XOSI", 0)
{
// All _OSI calls in DSDT are routed to XOSI...
// XOSI simulates "Windows 2009" (which is Windows 7)
// Note: According to ACPI spec, _OSI("Windows") must also return true
// Also, it should return true for all previous versions of Windows.
Method(XOSI, 1)
{
// simulation targets
// source: (google 'Microsoft Windows _OSI')
// http://download.microsoft.com/download/7/E/7/7E7662CF-CBEA-470B-A97E-CE7CE0D98DC2/WinACPI_OSI.docx
Name(WINV, Package()
{
"Windows", // generic Windows query
"Windows 2001", // Windows XP
"Windows 2001 SP2", // Windows XP SP2
//"Windows 2001.1", // Windows Server 2003
//"Windows 2001.1 SP1", // Windows Server 2003 SP1
"Windows 2006", // Windows Vista
"Windows 2006 SP1", // Windows Vista SP1
//"Windows 2006.1", // Windows Server 2008
"Windows 2009", // Windows 7/Windows Server 2008 R2
//"Windows 2012", // Windows 8/Windows Server 2012
//"Windows 2013", // Windows 8.1/Windows Server 2012 R2
//"Windows 2015", // Windows 10/Windows Server TP
})
Return (Ones != Match(WINV, MEQ, Arg0, MTR, 0, 0))
}
}
```
`USBInjectAll.kext` 開源項目也有 `_OSI->XOSI` 補丁 并且 `SSDT-XOSI.dsl` 包含了上面顯示的 `XOSI`代碼
通常,`_OSI` 的調用將由OS X (ACPI主機)來處理,但是通過補丁,`_OSI` 的調用被路由到 `XOSI`,因此可以模擬一個特定版本的Windows。
上面的XOSI的版本實現了“Windows 2009”(Windows 7)的模擬,我發現它可以與 `BRIX` 很好地工作。您可以根據需要修改代碼來模擬任何其他版本的Windows(可以對所列出的Windows版本進行注釋或取消注釋)。
完整的`BRIX`開源項目`/config.plist/SSDT-hack.dsl`,等等在這里:https://github.com/RehabMan/Gigabyte-BRIX-s-DSDT-Patch
# XWAK, XSEL 和 ESEL
通常這三種方法都在DSDT中并且傾向于操作 `XHCI` 寄存器與 `XCHI` 控制器的USB2端口路由有關
創建USB2端口路由,以在沒有合適的`XHCI`驅動程序的情況下為操作系統提供向后兼容性。通過將`XHCI`上的USB2端口路由到`EHCI`控制器,僅使用`USB2(EHCI)`驅動的操作系統仍然可以在使用USB3端口的計算機上工作(當然,是以USB2的速度)。
這種路由通常在`XSEL`和`ESEL`中進行控制。當檢測到較舊版本的Windows時,會調用`ESEL`,當檢測到新版本的Windows時,會調用`XSEL`。當一個被選中這個情況是系統依賴(system dependent)的。
`XWAK`在 `_WAK` 中被調用,然后停止休眠醒來。如果您發現您的端口在之后沒有工作,那可能是因為`XWAK`對`XCHI`控制器寄存器的注冊表做了一些事情,而10.11的驅動程序沒有預料到這一點。因此,禁用`XWAK`是很有用的。
例如,改變:
```
Method (XWAK, ...)
{
... original code ...
}
```
為:
```
Method (XWAK, ...)
{
Return(0)
... original code ...
}
```
這個 return 會立即退出該方法,以避免任何可能采取的行動。
# USB2 端口的路由 (多路復用) 和 `FakePCIID_XHCIMux`
在10.11之前,Mieze 首先描述了,一些計算機從使用多路復用(Multiplex)的補丁中受益。由于DSDT代碼的不同,這個復雜的補丁很難適應不同的計算機。
在10.11中不應該使用多路傳輸(multiplex)補丁。
為了完成同樣的事情,我創建了 `FakePCIID_XHCIMux.kext` (需要`FakePCIID.kext`)。這個 kext 可以強制使用XHCI上的USB2設備被路由到 `EHCI` 控制器。
這很有用,有兩個原因:
- 有些設備在連接到`EHCI`時可能會表現得更好
- 要解決新USB驅動程序中存在的15個端口限制
盡管15個端口限制不太可能對`EHCI`控制器(`EH01/EH02`)或一個集線器(大多數內部集線器似乎包含8個端口)產生影響,但它可能是`XHCI`控制器的一個問題。因為XHCI控制器上的每個 USB3 端口實際上都是兩個端口,所以可以很容易地達到這個限制。
想象一下一個主板的 `XHCI` 上有6 個 USB3 端口。每個端口都有一個USB2組件和一個USB3組件,總共有12個端口。另外,XHCI控制器可能有幾個USB2的端口(通常是內部主板的頭 | internal motherboard headers )。在XHCI上有6個 USB3 端口和8個 USB2 端口是不典型的(14個實際端口總數),總共有20個... 5個端口超過了極限。
但是,使用`XHCI`控制器的特性,可以將USB2端口從 `XHCI to EHC1`。`FakePCIID_XHCIMux` 利用這個特性并強制進行路由。它可以阻止`XHCI`驅動程序(the XHCI driver)在OS X中的任何有關更改路由配置的嘗試。在我們的示例中,它可以將14個 USB2 端口中的一些從`XHCI`移到`EHCI`,為 `XHCI` 的其他端口保留空間,仍然保留在15個端口限制內。BIOS通過設置 `XHCIMux` 所授予的各種`XHCI`寄存器(`PR2M`)來限制此路由。因此,移動的端口可能因`BIOS/motherboard` 而不同。
它也比 多路復用補丁(the multiplex patch)更容易部署:簡單地安裝`FakePCIID.kext` 和 `FakePCIID_XHCIMux.kext`。
但是被移到`EH01`的端口(通常是`EH01` 端口1 的 集線器(hub)),仍然受到先前討論的關于端口注入器的問題的影響。如果您的DSDT沒有為這些端口(或集線器端口)返回正確的 `_UPC`,那么您需要一個注入器來修復它。
FakePCIID可以從我的github上獲得。還是請一如既往地,**查看這個 README**。
https://github.com/RehabMan/OS-X-Fake-PCI-ID
# 摘要(Summary)
快速概覽大概是這樣的:
* DSDT包含USB端口和內置USB集線端口的信息
* DSDT 可能是錯的
* 蘋果可能在幾款蘋果產品中發現了DSDT的錯誤,因此他們實現了一種重載(override)DSDT(端口注入器)的機制。
* 蘋果端口注入器與控制器和SMBIOS的 ACPI 名稱匹配。
* 如果端口注入器匹配,蘋果端口注入器將重載你的DSDT(正確的或者是錯的) 。
* 重新命名控制器以防止匹配,可以避免蘋果提供的端口注入器,在這種情況下,系統會返回DSDT(這仍然可能是錯誤的)。
* 在端口被重命名之后,如果您的DSDT提供關于 USB 端口拓撲的不準確的細節,您可以創建一個端口注入器,就像蘋果為他們自己的計算機所做的那樣(您也可以修復DSDT `_UPC`,但是更容易是做一個端口注入器)。
* `USBInjectAll.kext`可用于自動為每個 控制器/集線器 注入所有可能的端口。
* 無論如何,每個控制器(或集線器)有15個端口的限制。
* 15個端口的限制可以通過一個補丁來增加。這個補丁可能是危險的,所以它不是被長期使用的。
* 當USB3和USB3組件被路由到 `XHC` 控制器時,USB3端口是2。
* USB2 端口可以通過 `XHC` 芯片上的寄存器從 `XHC` 發送到 `EHC`。
* 內置的驅動程序支持這種路由(多路復用技術| muxing),但是還沒有很好地理解(在特殊的 DSDT 方法和 USB 端口注入器數據之間存在一種關系)。
* 可以將 `FakePCIID_XHCIMux.kext` 用于將 `XHC` 的USB2 組件強制到 `EHC`。
* 當在OS X USB驅動程序中出現這樣的寫操作時,`FakePCIID_XHCIMux.kext` 可以阻塞對USB2路由寄存器的寫入。
* BIOS設置影響了 `FakePCIID_XHCIMux` 所做的事情(它為 USB2 端口路由掩碼提供了BIOS設置)。
* `FakePCIID_XHCIMux.kext` 不能阻止來自 ACPI 空間的寫入(顯然是蘋果 `AppleACPIPlatform.kext` 不會通過`IOPCIDevice` 來完成這些寫入操作)。
* 因此,在與 USB2 端口路由有關的情況下,可以使用DSDT來進行破壞,尤其是休眠醒來。
* 對來自 ACPI 空間的端口路由寄存器的寫入操作可以通過 ACPI 補丁來修復,有時也可以通過模擬某個版本的Windows來實現(`_OSI->XOSI` 映射)。
所以…解決方案取決于實際發生的情況:
* `XHC`上的 `USB2` 端口路由的BIOS設置("auto" vs. "smart auto" vs. "enabled")。
* 重命名 `EHCx->EH0x` 避免內置端口注入器
* `FakePCIID_XHCIMux` 在 `XHC` 上實施 USB2 端口路由
* 在運行 Darwin 時,DSDT補丁用于模擬Windows(各種版本)。
* DSDT補丁以避免在`XHC` 上寫入端口路由寄存器(取消了 XWAK,ESEL,XSEL)。
* 自定義端口注入器驅動程序 以匹配 真實的端口配置
* 使用 `USBInjectAll.kext` 讓事情正常工作,這樣實際的端口就可以確定。
# 具體建議(Specific Recommendations) (7系列以前的)
在7系列之前,沒有英特爾XHCI控制器,這里只討論了USB2問題。
顯而易見,第一步需要進行 `EHCx->EH0x` 重命名。
對于5系列,在 `config.plist/ACPI/DSDT/Fixes` 中勾選 `FixUSB_1000` 。
如果你仍然有端口不能工作,安裝 `USBInjectAll.kext`。
Windows版本模擬不太可能有問題,但是如果您仍然有問題,那就一定要試一試。`_OSI->XOSI` 加上 SSDT方法 是最容易成功的。
# Specific Recommendations (7-series, 8-series, 9-series, X99)
顯而易見,第一步需要進行 `EHCx->EH0x` 重命名。
對于 7系列,8系列,9系列,安裝 `FakePCIID_XHCIMux.kext`(如果沒有`FakePCIID.kext`,那`FakePCIID_XHCIMux` 就沒有效果,這只適用于所提到的Intel芯片組)。
對于許多主板來說,假設`_UPC`在`XHC`上是正確的,那么這一切都將工作正常。
但是在這一點上有兩項可能會引起問題:
* 由于不正確的Windows模擬,您的DSDT可能會禁用USB3。應用`XOSI`補丁來解決這個問題。
* 你的SMBIOS內置的集線器端口注入器可能會被干擾。安裝 `USBInjectAll.kext` 和使用內核標志 `-uia_exclude_xhc`。這將為`EH0x`和相關的集線器啟用`USBInjectAll`端口注入器,覆蓋內置的集線器端口注入器,但是保持`DSDT`對`XHC`的控制。
如果有一些端口仍然不能正常工作,則刪除 `-uia_exclude_xhc` 內核標志。如果您的`XHC`有超過15個端口(設備id是8086:8xxx),您將需要端口限制補丁,或者需要將您的測試劃分為幾個階段(使用`-uia_exclude_hs`, `-uia_exclude_ss`,`-uia_exclude_ssp`)。
注意:對于X99系統,原生的Intel XHC驅動程序不支持 8086:8d31。您需要一個注入器驅動程序(an injector kext)來啟用它。通過查看`USBInjectAll.kext`的 README 來獲得詳細資料
# Specific Recommendations (200-series)
在10.12.3中,對于200系列芯片組上的`XHC`控制器是沒有芯片組支持。因此,我們需要一個注入器驅動程序(an injector kext)來加載100系列驅動程序。根據 USBInjectAll README,來使用 `XHCI-200-series-injector.kext`。
另外,請參閱100系列(以下)的附加信息...
# 具體建議 (100系列 100-series)
在100系列中沒有`EHCI`控制器,因此 7/8/9 系列的幾個解決方案(和問題)不適用于100系列。
Install USBInjectAll.kext. You will need the port limit patch as well as 100-series injection will always inject more than 15 ports.
安裝`USBInjectAll.kext`。您將需要端口限制補丁以及100系列的注入將始終注入超過15個端口。
在這里,自定義 USBInjectAll 使用一個帶有 `UIAC/RMCF`的SSDT。參閱USBInjectAll README。有一個專家已經創建了一個關于查找特定于您的主板的 SSDT ,這是值得花時間的。
一旦您對所有端口進行了注入,測試它們,確定您可以使用哪些端口,并使用內核標記 `uia_exclude` 排除它們。內核標記 `uia_exlude` 將通過 `RMCF` 來排除 甚至是來自自定義 `USBInjectAll` 配置的端口。在排除了足夠的端口之后,將總端口限制在15以下,您可以取消 端口限制補丁。
# 注意系統信息(System Information)
OS X中的系統信息應用程序可以顯示USB設備的信息以及它們連接到的控制器的信息(System Information -> USB)。
該系統顯示連接到 `EHCI#1` 或 `ECHI#2` 的USB設備,作為“USB 2.0總線(Bus)”;任何連接到`XHCI`的設備都是“USB 3.0總線(Bus)”。
如果您在“USB 3.0總線”下看到 USB2 設備,請不要感到驚訝。如果沒有 `FakePCIID_XHCIMux`,USB2設備插入XHCI處理的端口將被顯示為“USB 3.0總線”。XHCI可以同時處理 USB3 和 USB2 端口。
如果你“USB 2.0總線”下看到 USB2 設備插入到了USB3 端口。使用 `FakePCIID_XHCIMux`,任何 USB3 端口的 USB2 組件都被路由到`EHCI`。
# 錯誤報告
如果您有問題,請詳細描述問題,確保您的概要文件準確描述您的硬件,并提供FAQ中所要求的所有數據。
閱讀常見問題,“錯誤報告”
https://www.tonymacx86.com/threads/faq-read-first-laptop-frequent-questions.164990/
# 背景知識
這里有很多信息(也有很多noise):
http://www.insanelymac.com/forum/topic/306777-guide-usb-fix-el-capitan-1011/
注意:在這個場景中不推薦使用所謂的虛擬`kexts`。這里不需要它們像 `AppleHDA` 例子中需要的那樣。
- 簡介
- 基本命令
- 高效操作
- 命令操作
- 常用軟件
- 問題設置
- 命令行神器
- 開發配置
- 開發環境配置
- 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