修复 OS X El Capitan的USB端口

14次阅读
没有评论

摘要

10.11 有一个新的机制来约束的 USB 端口,SMBIOS 里定义机型会有相关的 usb 描述。如果之前版本 usb 能正常工作,升级 10.11 突然不能用了,问题就出在 SMBIOS 中所选择机型对 usb 端口的描述和实际情况不对。

问题描述

解决方法

1. 加载 usb 驱动

10.11 控制 usb 的驱动是 AppleUSBEHCIPCI.kext 和 AppleUSBXHCIPCI.kext,藏在 IOUSBHostFamily.kext 这个驱动里面,显示包内容可以打开查看。

你可以在两个驱动的 info.plist 文件查看关于 usb 端口的描述:

USB 2.0 由 AppleUSBEHCIPCI.kext 控制

/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist

USB 2.0 and USB 3.0 由 AppleUSBXHCIPCI.kext 控制

/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/Info.plist

AppleUSBEHCIPCI kext 默认将 usb2.0 定义为 EHC1 和 EHC2,如下图所示:

上图中显示的是对 imac13.1 机型的定义,根据你选择的机型查看对应的名字。

你可以更改此处的 IONameMatch 成你主板 dsdt 定义的 usb2.0 控制器的名字,也可以在 dsdt 中把 usb2.0 控制器的名字修改成 EHC1/EHC2(跟你用的机型里的信息一致)

换句话说主板上 usb2.0 控制器的名字要和 AppleUSBEHCIPCI kextinfo.plist中你对应机型定义的名字一致,改那一边都可以。

USB 3.0 有所不同,AppleUSBXHCIPCI 中是用 id 来控制的,如下图所示:

所以不管你的 USB 3.0 控制器在 dsdt 中叫什么名字,都是会被加载的,不过前提是 info.plist 中要有相应机型。

2. 端口限制

尽管 usb 驱动加载了,但不意味着所有的端口都正常工作,因为苹果公司在 SMBIOS 中用一种新的方法来控制这些端口。

请注意,如果您的 USB3.0 设备没有命名 XHC1(通常 XHC),默认情况下没有端口限制,但如果所有的端口都不能完全正常工作,您可能需要启用端口限制和手动添加端口。

以 iMac 13,1 为例:(ehc 表示是 usb2.0 端口)

默认情况下,imac13.1 只有一个 usb2.0 的端口,端口地址为 01000000, 那么你如果 smbios 定义的是这个机型,如果不添加端口的话,那么你讲只有一个 usb2.0 的端口可用!

再来看 MacBookPro 9,2 中关于 usb3.0 端口(xhci)的定义,有 1, 2, 5, 6 共四个 usb3.0 的端口可用:

要修复只有解除端口限制或者添加端口。

2a. 方法一:解除端口限制

这个方法比较简单,就是直接删除 info 里面你对应机型关于 usb 端口的描述,删除 port-count 和 ports 项即可,系统会自动从你 dsdt 的描述中生成新的端口。

对 usb3.0 而言,同样删除 port-count 和 ports,并将你 dsdt 中关于 usb3.0 的描述修改成 xhc(除了 xhc1 之外任意名字均可)

有些机型比如 iMac14,x 没有关于 usb2.0 的描述,所以如果你选择这些机型的话会报错 ”still waitingfor root device” 而导致 usb2.0 不可用

然而,苹果为一个 usb 设备设置了 15 个端口的限制,如果你 dsdt 中定义的端口数超过 15 个,这种方法的话仅有 15 个端口会被初始化,要突破限制只有使用方法 2 添加端口来解决。

2b. 添加端口到端口限制

这个方法将启用端口限制并添加你直接的端口。

To enable port restrictions:

USB 2.0:在 dsdt 中重命名你的 USB 为 EHC1 或 EHC2,或修改 IONameMatch 与你 dsdt 中的一致。

USB 3.0:在 dsdt 中重命名你的 USB 为 XHC1,或修改 IONameMatch 与你 dsdt 中的一致。

下面,你要识别你 dsdt 中有哪几个 usb 端口,比如, 我的 XHC1 有 4 个端口,分别是 1, 2, 3, 4:

但如果我使用 MacBookPro9,2 这个机型的话,我就只有 1, 2, 5, 6 (端口名字并不重要,看地址,前面说的 1 是指 01000000):

因此我需要在 info.plist 里 MacBookPro9,2-XHC1 下添加端口 3、4, 我的所有端口才能正常使用

注意:有 15 个端口的限制,举个例子,如果你的 dsdt 中定义了 14 个 usb2.0 端口,从 hs01-hs14 和 6 个 usb3.0 端口,从 ss01-ss06,那么系统将只初始化 14 个 usb2.0 端口和 1 个 usb3.0 端口。(hs01-hs14 和 ss01)

为了解决这个问题,你需要判断出那些端口是实际有作用的,那些端口只是个定义,你就可以把没用的排除掉,一般电脑 15 的 usb 端口可能是能满足的,详情参考:(这篇以后再翻译)

3. 注入 usb 驱动

上面两种方法直接编辑 kext 文件,OSX 更新后会覆盖,你可以采取注入新的驱动的方法 (RehabMan 大神的杰作)。

如果你想编辑你的 USB2.0(由 EHCI 控制)信息,将你的 DSDT 中 usb2.0 的名字从 EHC1/ EHC2 修改成别的名字(如 EH01/ EH02),从而使苹果原装驱动对 EHC1/ EHC2 端口限制失效,然后创建一个新的驱动(这基本上只是一个 Info.plist,那个可执行文件没什么内容),编辑 info.pilst 中的名为 EH01/ EH02(与 dsdt 中的名字一致)。

Usb3.0 类似,改成 xhc1 以外的任何名字,info.plist 里面与之对应。

这里有一个示例 info.plist 文件:

https://raw.githubus…ents/Info.plist

Info.pilst 中同样要注意机型的名字要和你使用的机型对应

把编辑好的 info.plist 文件放入你新建的驱动中即可

正文完
 0
liveob
版权声明:本站原创文章,由 liveob 于2024-09-14发表,共计2508字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码