前言

三年多前写了一篇使用 Hackintool 定制 USB 接口的方法,随着macOS系统的更新,自 macOS Big Sur 11.3 正式版更新后,OpenCore 的 USB 相关 Quirks(直译是“怪癖”) XhciPortLimit 失效,导致黑苹果无法使用超出 15 个以上的 USB 端口。

究其原因,其实是 macOS 本身限制了每个 USB 控制器有 15 个端口上限,可能是苹果觉得 0x0F(15) 比 0xFF(255) 更加简洁,也可能是因为苹果的自家产品就没有使用超过 15 个 USB 端口的场景。

这里可能有人要说了,“不对呀,我的白果用 USB 扩展坞加起来妥妥超过 15 个呀?”其实使用 USB 扩展坞,单个 USB 端口理论上最大可以扩展出 127 个接口,但无论扩展多少,它们都是共用同一个 USB 通道接入系统,因此可被视为一个 USB 端口。另外,Mac Pro 用户如果通过 PCI 扩展卡增加另一组 USB 接口,这个 PCI 扩展卡上的 USB 控制器也会有它自己的 15 个端口限制。

其实这也是好事,毕竟 XhciPortLimit 强行打开超 15 个端口,就像在超出纸张范围的地方写上内容,总归是有问题的,不应太过依赖这个特性。但是这样一来,定制 USB 就成了黑苹果的必修课,好在最近有大神开发了一款 USB 定制工具,使用非常方便,定制 USB 不再像 Hackintool 那么麻烦。接下来演示如何通过 Windows 定制黑苹果的 USB 端口文件。

「注意」早期非英特尔制造的 USB3.0 控制器可能无法在新一点的 macOS 中正常驱动使用,例如瑞萨电子 UPD720202(0x00151912),此控制器主要见于第三第四代酷睿平台。在确认 EFI 配置文件正确的情况下,此类控制器如果遇到无法驱动的情况那就真的是无法驱动了。

 

准备工作

  • 一个 USB3.0 接口的 U 盘
    • 因为 USB3.0 同时向下兼容 USB2.0 接口,因此 Windows 定制只需要一个 USB3.0 的 U 盘
    • 如果你的设备有 Type-c 接口,一并准备好 Type-c 接口的 U 盘
    • 如果没有 Windows 系统准备在 macOS 定制,还需要 USB2.0 的 U 盘
  • OpenCore Configurator
  • Hackintool:用以验证定制结果
  • USBToolBox:USB 接口发现及 USBMap.kext 生成工具
  • Windows 10 系统
    • Windows 系统在后面要说的定制过程中相比 macOS 优势实在太明显,因此建议使用 Windows 10 系统
    • USBToolBox 对 Windows 8 和 Windows 7 支持度不佳
  • USBtoolbox.kext:如果你使用 UTBMap 模式时必须搭配此文件,并且不能使用 SSDT-RHUB
  • XHCI-unsupported.kext:十代硬件设备如果定制完后无法使用,则搭配此文件
  • USBXHCIFixup.kext:如果定制完你的 USB 3.0 端口不工作,则搭配此文件
  • SSDT-USB(x).aml:这是每套 EFI 都应该有的,
  • SSDT-RHUB.aml:某些主板的 ACPI 确定存在问题,需要使用此文件进行修复调整,例如华硕 B460、部分微星 B460 等,因为他们的ACPI中存在错误

其中需要单独说明的是 SSDT-USB(x).aml 文件,OpenCore 使用了大量的 ssdt 以支持黑苹果的各个功能,其中和 USB 息息相关的 EC 设备也是如此,根据你的硬件平台不同,使用的 SSDT 文件也应该不同。这些文件可以从 OpenCore 的发行包中找到,也可以从本文下载中整理好的文件中获取:

  • SSDT-EC-USBX-DESKTOP.aml
    用于Skylake桌面端(第六代酷睿)以及更高版本intel处理器,以及AMD处理器,这个SSDT包含了很多种类型的EC设备重命名,例如EC0、ECDV、H_EC、PGEC等,并且还注入了USB供电参数,因此不再需要单独使用其他重命名补丁,该文件快捷兼容性良好,推荐使用
  • SSDT-EC-DESKTOP.aml
    用于Broadwell桌面端(第五代酷睿)以及更低版本intel处理器
  • SSDT-EC-USBX-LAPTOP.aml
    用于Skylake移动端(第六代酷睿)及更高版本intel处理器
  • SSDT-EC-LAPTOP.aml
    用于Broadwell移动端(第五代酷睿)以及更低版本intel处理器

 

「注意」

  • 开始定制前,建议拔掉所有 USB 设备,仅保留鼠标键盘(建议插到 USB2.0 接口);
  • 本文提供了两种定制方法,一种生成 USBMap.kext,另一种生成 UTBMap.kext

 

Windows 定制-UTBMap.kext方式(视频教程)

点击进bilibili观看 》

 

Windows 定制-USBMap.kext方式

软件使用 Python 编写,并且打包成了单文件,因此部分反病毒软件(例如 Windows Defender)可能报告文件存在风险,无视即可。

 

进入 Windows 10,解压文件到任意位置,直接运行其中的 Windows.exe,会发现这其实是一个没有 GUI 的命令行界面。先输入 C,按下回车进入设置界面:

建议打开 T 和 N 两项,分别输入 T 回车,N 回车即可打开,完成后按 B 返回上一个界面,下面操作方式一样,不再赘述。

T 选项就是打开接口类型提示,N 选项会把生成的 kext 内部调整为调用 macOS 原生类 AppleUSBHostMergeProperties,这是比较好的方法,原因如下(不想读可跳过,无影响):

  • USBToolBox 生成的最终 USBMap.kext 其实是一种“Codeless Kernel Extensions”,字面意思是无代码核心扩展(简称 codeless kext),其核心作用是使新设备与现有驱动程序匹配。
  • codeless kext 是不包含可执行文件的核心扩展包(kext bundle),其中 info.plist 的 IOKitPersonalities 节点(字典类型)会在遇到匹配的新设备时使之与现有的驱动程序(kext)匹配。而后者都必须具有一个可执行文件。codeless kext 通常用于驱动用户的 USB 和 HID 设备(HID:Human Interface Device,例如触摸设备等)。由于内核驱动程序实现了标准协议,因此这些类别中的几乎所有设备都可以使用它。
  • 打开 USBToolBox 的这个选项,其生成的 USBMap.kext 会将 USB 端口上的设备共享到 macOS 提供的通用驱动程序 AppleUSBMergeNub.kext,以实现驱动 USB 设备,而不必通过其他方式中转。

 

下一步,返回主界面后使用 D 选项开始识别 USB 接口。

 

接下来,使用 USB3.0 的 U 盘挨个插拔一遍接口(包括机型前部接口),注意每次插拔间隔不要过快,插上后,等系统正确识别出 U 盘,再安全移除设备。

 

全部插拔一遍过后,你会发现实际上你能使用的 USB 接口少得可怜,其实这才符合实际情况,系统内置的很多 USB 接口其实是用不到的。

不过需要「注意」的是,USB3.0 接口同时兼容 USB2.0 接口,因此会有 3.0 和 2.0 在物理上是同一个接口的情况,这个情况在 macOS 里处理起来很麻烦,不过 Windows 里就没有这个问题,不用担心。

全部插拔完成后,按 B 回车返回上一级菜单。「提示」完成插拔操作以后,USBToolBox 会生成临时文件存储你的接口数据,此时如果出现软件闪退,或需要回到 macOS 进行其它操作也没有问题。

 

此时,选择 S 回车进入接口选择和 Kext 创建界面。此时已有你会使用的USB接口数据,选择S回车,准备删除不需要的端口

下面就是接口选择和 Kext 创建界面:

 

信息说明:

  • 进入界面,软件会自动标记选择好需要保留的接口信息,一般情况下不会有错;
  • 单个 USB 控制器下的接口总数不得超过 15 个(USB3.0 绑定兼容 2.0 的算 2 个),上图中只有一个 USB 控制器,但其实中高端主板搭配两个或以上的 USB 控制器很常见,软件有计数器,注意单个 USB 控制器下的接口不要超过 15 个;
  • 上面提到的 USB3.0 和 2.0 在物理上是同一接口的情况,这个软件会自动识别并绑定,例如上图中 Port 1-3 和 Port 17-19 在物理上是同一个接口(在 macOS 中对应 HS01-03 和 SS01-03),软件成功识别并且已经自动选中了(图中提示 Companion to N 的就是);
  • 对于 Type-c 接口,部分早期主板可能没有配备转向器(Switch),会造成正反两面不是同一个接口的情况,所以对于 Type-c 接口,建议是正反两面都插拔一次较为保险,另外,Type-c 绝大部分是 USB3.0 及以上版本的接口,因此也存在同时兼容 USB2.0 的情况,可目前 Type-c 低于 USB3.0 标准的设备少之又少,因此如果你接口总数不够用(超 15 个)的情况下,可以考虑剔除 Type-c 的 USB2.0 支持,但是在这一步无法单独剔除绑定的 2.0 接口,需要修改成品 USBMap.kext,后面验证环节会说明;
  • 要删除某个接口,直接在此界面输入接口编号然后按下回车即可,如果一次剔除多个接口,中间以英文逗号分隔;再次输入编号回车则重新添加;
  • 按照软件提示的说明,要修改某个接口的类型,使用「T 英文冒号 接口编号 英文冒号 类型」这个格式进行修改,其中大写 T 英文冒号是固定的,接口编号自行选择,最后的接口类型,软件内置了一个代码表,输入类型代码即可,按 T 回车即可看到类型表,如下图:

这里简单说明一下:

Type A:0                       # 这个指最常见的 USB2.0 大接口
Type Mini-AB:1                  # Mini-AB 接口非常少见,常规主板上就更稀有了
ExpressCard:2                  # 这个接口也非常少见
USB3 Type A:3                  # 这个指最常见的 USB3.0 大接口
USB3 Type B:4                  # 这个接口非常少见
USB3 Type Micro-B:5            # 这个接口主板上也非常少见
USB3 Type Micro-AB:6           # 主板上直接附带的非常少见
USB3 Type Power-B:7            # 主要见于打印机或其它更大的设备
Type C - USB2 Only:8           # 指仅支持 USB2.0 的 Type-C 接口
Type C - with switch:9         # 指内置了转向器的 Type-C 接口
Type C - without switch:10     # 指没有转向器的 Type-C 接口
Internal:255                   # 指主板内置接口,比如奋威 T919 的蓝牙直接插到主板上那种

也就是说,假设要把 T919 的蓝牙改为内建,接口编号是 11 的话,要输入修改类型的命令就是 T:11:255

例二,如果要批量把 7-8 接口修改为“内建”接口,要输入的命令就是 T:7,8:255

例三,假设要把 17-19 接口修改为 USB2.0 Type-A,要输入的命令就是 T:17,18,19:0

其它接口类型修改以此类推。如果想了解更多关于 USB3.0 的知识,可参阅「What is USB 3.0?

如果创建 USBMap.kext 时提示:

The following controllers have no enabled ports:
Intel(R) USB 3.10 可扩展主机控制器 -1.10(Microsoft)
Select whether to ignore these controllers and exclude them from the map, or disable all ports on these controllers.

意思是 USB 3.10 这个控制器(根据你的实际情况判断)下没有启用的端口,软件提示要么忽略它要么关闭它。如果真的没有启用的接口,建议关闭(Disable),反之则返回上一步检查端口选择。

 

下一步,按下 K 回车创建 USBMap.kext,此时可能弹出这个界面:

这是因为这里选择了使用原生 AppleUSBHostController,在 Windows 中是无法识别 Mac 机型的,其实就是 SMBIOS ID(机型 ID),所以这里把笔者的机型手动输入:iMac20,1

这个机型 ID 可以通过 macOS 的终端命令来提取:

system_profiler -detailLevel mini SPHardwareDataType

运行后,终端会输出类似下面的结果:

Hardware Overview:

      Model Name: iMac
      Model Identifier: iMac20,1
      Processor Name: 10-Core Intel Core i9
      Processor Speed: 3.7 GHz
      Number of Processors: 1
      Total Number of Cores: 10
      L2 Cache (per Core): 256 KB
      L3 Cache: 20 MB
      Hyper-Threading Technology: Enabled
      Memory: 32 GB
      System Firmware Version: 1554.100.64.0.0

其中的 Model Identifier 就是我们需要的信息,这个其实也可以通过  → 关于本机 → 系统报告 → 硬件 → 硬件概览 来获取,第二项“型号标识符”就是。然后返回 Windows,输入到 USBToolBox 即可。

如果你忘了自己的机型又不想切换回 macOS,可参考 SMBIOS 机型速查表

 

最后,生成的 USBMap.kext 会出现在软件的目录里,拷贝下来,或使用 Diskgenuis 等软件把它拷贝到 EFI 目录。

如果选择直接回到 macOS,手动把 USBMap.kext 放到 EFI 目录:

  • Clover 放到 /EFI/CLOVER/Kexts/Others(或其它数字命名的文件夹如果你知道是起什么作用的话)
  • OpenCore 放到 /EFI/OC/Kexts/

最后,OpenCore 还需要把文件添加到 config 中,并启用:

此时可以取消 USBInjectAll.kext 了,XhciPortLimit 在 11.3 以上系统已失效就不要勾选了。

最后重启进入macOS系统。

「注意」

  • 如果选择生成 UTBMap.kext,则还需要搭配 USBToolBox.kext,否则没有作用;
  • 如果使用 USBToolBox.kext,如果你有 SSDT-RHUB.aml 之类会修改 USB 相关 ACPI 的文件,请把它们停用,否则 USB 定制文件不生效;

 

如果你在macOS系统下定制,macOS 的定制过程和 Windows 大致相同,我这里就不重复介绍了。下载的 USBToolBox 存在 Windows 和 macOS 两个压缩包,解压缩 macOS 的包,直接丢到终端运行,界面和设置和上述 Windows 方法一致。

 

macOS系统下操作

重启进入macOS系统后,运行 Hackintool,切换到 USB 选项卡,然后使用 USB3.0 的 U 盘挨个插入各个端口验证有效性和连接速率,这里还需要一个 USB2.0 的 U 盘(或键盘鼠标)来验证 USB2.0 的有效性,包括TypeC3.0及2.0也验证一下

补充内容:连接器一共5种类型
USB2和USB3对应USB2.0及3.0
TypeC加SW对应支持自动切换的端口
TypeC对应不支持自动切换的端口
Internal表示内键

如果验证完发现有些接口错误或不需要,可以编辑 USBMap.kext,在文件上右键 → 显示包含内容:

 

进入 Contents,使用 ProperTree 或 PlistEdit Pro 打开 Info.plist 文件:

 

然后根据 Hackintool 的验证结果来决定删除哪个接口:

 

根据上图所示,Type-c 的 USB2.0 接口(图中 HS04)如果接口总数太多的话可以舍弃,因为 Type-c 几乎没有 USB2.0 的设备。

到这里 USB 新定制方法结束。

 

常见问题

Q:定制文件没用,USB 接口列表怎么定制都没有变化?

A:常见于 华硕 或 微星 B460 系列主板,如果你使用 USBMap.kext 方法,还需要搭配 SSDT-RHUB.aml 使用;如果你使用 UTBMap.kext 方法,不需要搭配 SSDT-RHUB.aml,且理论上不应该会遇到这类问题。

 

Q:USB3.0 定制无效?

A:确定以下内容:

  • 你的主板是否需要 ACPI 里的重命名补丁,例如 EHC/XHCI(一般老机器需要)
  • 是否使用了正确的 SSDT-EC-USB(x).aml 文件
  • 主板是否需要 SSDT-RHUB.aml
  • 你选择了 USBMap.kext 方法还是 UTBMap.kext 方法?后者还需要搭配 USBToolBox.kext 使用
此内容 评论 本文后刷新页面可见!