一年多前写了一篇使用 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 端口不工作,则搭配此文件
注意看文件包中的说明选择使用。
「注意」
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 回车即可看到类型表,如下图:
这里简单说明一下:
发表评论 取消回复