修复 OS X El Capitan的USB端口

摘 要

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

问题描述

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文件放入你新建的驱动中即可

 

 

相关推荐

超级管理员
发表评论

您必须登录才能发表留言!

目前评论:2   其中:访客  2   博主  0

  1. pyaku 4

    这里面的示例无法下载啊

  2. nokiap6110 3

    这些教程如果有图片更容易懂