[指南] 10.11+ USB的变化和解决方案
最后更新于:2022-04-02 05:46:07
[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中,它看起来如下:
![ehc_rename](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/78eb56e050975e00aa6b92ffc2a4184f_400x191.png)
你可以从 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`中哪些端口是处于活动状态。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/96a2ef07c5d1f916874b5f2e1edfb9cf_356x216.png)
注意:这是我的端口注入器`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`的图像:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/7bfa5d8053096f0730f0dd13f2e452f9_255x260.png)
事实上,端口地址完全依赖于 `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 `”) 返回 `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的编辑器中的样子:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ce47f3aa73dfe97bed791fcec517b266_400x123.png)
我已经从 `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` 例子中需要的那样。
';