一年多前写了一篇使用 Hackintool 定制 USB 接口的方法,时过境迁,其中内容虽然现在仍然有效,不过现在出现了更方便的方法,且自 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 支持度不佳
  • SSDT-USB(x).aml:这是每套 EFI 都应该有的
  • SSDT-RHUB.aml:某些主板的 ACPI 确定存在问题,需要使用此文件进行修复调整,例如华硕 B460、部分微星 B460 等

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

点击下载 SSDT-USB(x) 文件包,提取码:fufn

点击下载 SSDT-RHUB 文件,提取码:ggin;「注意」仅建议华硕 B460 及微星 B460 使用此文件

点击下载 USBtoolbox.kext 文件,提取码:98nv ,「注意」如果你使用 UTBMap 模式时必须搭配此文件,并且不能使用 SSDT-RHUB

2022/3/24 文件更新点击下载 USBXHCIFixup.kext 文件,提取码:54jw「注意」如果定制完你的 USB 3.0 端口不工作,则搭配此文件

注意看文件包中的说明选择使用。

「注意」

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

 

Windows 定制过程

软件使用 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 创建界面。

 

下面就是接口选择和 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 的蓝牙直接插到主板上那种 
What is USB 3.0?

 

下面再放一个有两个 USB 控制器的 Z490 主板的选择界面:

这个主板由于系统内置设备非常多,并且内置了多个扩展器(USB Hub),总体情况非常复杂。为保险起见,笔者暂且把软件识别到的都添加上,后续如果遇到新问题会回来更新本文。

 

如果创建 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 

最后,生成的 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 定制过程

macOS 的定制过程和 Windows 大致相同,但是这里提供一个不同选项的定制方案。下载的 USBToolBox 存在 Windows 和 macOS 两个压缩包,解压缩 macOS 的包,直接丢到终端运行,界面和设置和上述 Windows 方法一致。

「但是」这里我们尝试使用 USBToolBox 提供的类接管,不再使用苹果原生的类 AppleUSBHostMergeProperties。运行脚本,首先按 C 进入设置界面,做如下更改:

「提示」Bind Companions 可开可不开,因为在 macOS 里这个脚本无法识别 USB2.0 和 3.0 的绑定关系,笔者实测开和不开最终结果都一样。

下一步就是发现端口,和 Windows 操作方法一致:

下一步,设置各个端口的类型,过程和 Windows 方法完全一致:

最后按 K 生文件,你会发现,该方法生成的文件是「UTBMap.kext」而不是 「USBMap.kext」。UTB 笔者猜测应该是 UsbToolBox 的意思。下一步是把文件加入到你的 config.plist 中进行测试。

「注意」

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

点击下载 USBToolBox.kext ,提取码:7v80

把文件添加到你的 config.plist 中,重启即可测试是否见效:

笔者实测结果如下:

 

如果你对上述方法结果不满意,笔者之前还写过一篇使用 Hackintool 定制 USB 接口,可参考「使用 Hackintool 定制USB接口」,这里随便再讲下思路:

  • 如果你的 macOS 没有升级到 11.3 ,那还好,打开 XhciPortLimit,加入 USBInjectAll.kext,重启后即可开始定制;
  • 如果 macOS 已经升级到 11.3 及以上,那就需要分别定制 USB2.0 和 USB3.0 接口,这个过程中接口的绑定关系处理比较麻烦;

 

验证定制结果

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

如果验证完发现有些接口错误或不需要,可以编辑 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 使用
  • 以防有的人不仔细看文字,UTBMap.kext 方法笔者列在了 macOS 定制方法部分,Windows 定制笔者使用的是 USBMap.kext 方法

 

尾声

这个新的定制方法整个流程比原来使用 Hackintool 效率高了太多,并且接口类型识别,USB3.0 和 2.0 的绑定关系变得非常容易处理,笔者一次完成,根据其工作原理来看整个流程出错概率非常低,强烈推荐此方法。顺带吐槽一下苹果的单控制器 15 端口的限制,笔者这台机器物理上的接口非常少可以说非常丐了,可是随便一插拔总数就达到了 12 个,难以想象 X99/X299/X570 多控制器多端口的用户要如何取舍。

如有问题,欢迎提出。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部