查看: 41025|回复: 158

[分享] 从技术角度谈谈10.11的USB驱动机制,兼论10.11 USB安装盘的花屏禁行问题

  [复制链接]
z1326 发表于 2015-10-7 19:45 | 显示全部楼层 |阅读模式
快御云安全
本帖最后由 z1326 于 2015-10-28 21:07 编辑

本文技术原理部分来源于RehabMan大神的帖文,具体做法来源于pcbeta,insanelymac等论坛,由本人统一理解并整理而成。

Part1: 10.11的USB驱动机制与遮盖器

10.11 El Capitan开始,苹果完全重写了OSX系统的USB驱动机制。原来的驱动是怎么样的大神没说我也不知道。现在的情况是这样的。

首先,一般而言,对于ivybridge平台开始的电脑(自2012年的ivybridge开始intel引入原生USB3驱动),一般而言,硬件内总共存在3个USB主控器,两个USB2.0的,一个USB3.0的。两个USB2.0的。在ACPI表(就是我们常说的DSDT)中,两个USB2.0主控器一般被命名为EHC1和EHC2,无论对PC机还是白果机都是如此。但是USB3.0的主控器,PC机的DSDT里一般命名为XHC(或许也有例外),白果机则命名为XHC1。

或许苹果本来想的是,完全依赖ACPI表(就是DSDT信息)来读取有关USB的数据,但是问题来了,有些机器的ACPI表(DSDT信息)是不准确的,当然,普通PC机不准确不关苹果的事,爱准不准。但是,注意,苹果发现,自家的有些白果机的ACPI表(DSDT信息)也是不准确的,这就不好玩了。

为了解决这个问题,苹果引入了一个东西,RehabMan大神称之为injector,我想了下,决定这个词还是不能直译,还是意译的好,我决定称其为遮盖器。具体说来,遮盖器机制,就是我们很多教程里提到要修改的

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

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

这两个plist里的那些条目。


比如,我们打开EHCI的plist是这样的,看这里IOkitpersonalities的下面,有很多机型,MacBook,MacBook Air什么的。


然后,点开一个机型,比如MacBook Pro 9,1 下面是这样的。记住这里主要参数,port-count,UsbConnector,port三个。



具体是这样的,首先,通过Smbios确定机型,比如,如果Smbios里读取的机型是Macbook Pro 9,1 那就去这两个plist里找Macbook Pro 9,1的条目。

然后就是对主控名称,这两个plist里,USB2.0主控器名称是EHC1,EHC2,USB3.0主控器名称是XHC1,现在开始查找DSDT,如果DSDT里的主控器名称和这里的一样,那么,就无视dsdt里的信息,以plist中的相关信息为准,换句话说,plist里的信息“遮盖”住dsdt的信息,这就是所谓的“遮盖器”。遮盖之后的信息怎么看,看port-count,UsbConnector,port三个参数

参数解说如下:

port-count:这是一个坑爹的命名,因为很容易根据字面意思理解成,这个hub下面的PRT(端口)总数。实际上不是,这个东西的意思是,下属所有PRT(端口)中的最大port值。也就是说,你下面如果有3个PRT,3个PRT,port值分别是01000000,02000000,06000000,那port-count这里填的不应该是03000000,而应该是06000000。

UsbConnector:代表所属USB接口类型,一般有0,3,255等常见数值。其中0代表usb2.0 typeA型母口,2代表 type miniAB,3代表USB3.0 typeA型母口,255代表特殊接口。

port:该USB接口所在位置的编号。

比如遮盖器读取到这样的信息,Smbios:MacBook Air 6,2 XHC1-SSP1(UsbConnector:3,port:0A000000),意思就是说,10.11系统你听好了,不管DSDT说什么都不要信,听我的就对了,我告诉你,MacBook Air 6,2这种机型,USB3.0主控器名称是XHC1,下属0A000000位置,有一个命名为SSP1的USB3.0 typeA母口。

当然,如果主控器名称没对上怎么办?比如USB3.0主控,plist里是XHC1,DSDT里是XHC。很简单,遮盖无效,以DSDT信息为准。所以如果想摆脱遮盖怎么办,很简单,DSDT里给主控器改名,EHC1改成EH01,EHC2改成EH02,本来是XHC的不要动,是XHC1的改回XHC。这样就摆脱遮盖了。

上面已经说过了,USB2.0,PC和白果,DSDT里命名是一样的,都是EHC1和EHC2。USB3.0,PC一般是XHC,白果则是XHC1。所以一般而言,我们搞黑果El Capitan,USB2.0接口及相关设备都会被遮盖。USB3.0则一般不会被遮盖。当然有的人说,我USB3.0为什么也被遮盖了。两个可能的原因,1,RP值问题,你的DSDT就是非主流地用了XHC1的名称;2,你的DSDT以前打过某些patch,作过某些修改,把XHC给你改成XHC1了。

PS:RehabMan把injector分为两个级别,Controller injectors和Hub port injector。我暂时将其翻译为主控遮盖器和端口遮盖器。

具体而言,我的理解就是,主控遮盖器就是上面两个plist中的EHC1 EHC2 XHC1,只要对应了Smbios机型,然后dsdt中这3个主控的名称和plist中对应上,这个主控就被plist中的信息遮盖。要躲开主控遮盖器很简单,给DSDT里USB主控改名就行。(上面说了)

但是这个主控下的接口具体是什么样子,具体怎么遮盖法,那就要看下面第二级的端口遮盖器了。具体端口遮盖器的参数就是上面说过的port-count,UsbConnector,port这3个了。

注意一点的是,由于端口遮盖器不是靠对照名称(PRT1,PRT2那些),而是靠检测port值辨认目标的。所以改名(比如在DSDT里把PRT1改成PR01)并不能使对应的端口遮盖器失效。

BTW:特别再次说一下,从前在10.10 Yosemite及更早的时代,有一个DSDT的patch叫做USB mutiplex或者USB3.0 multiplex或者类似的名字的,这东西是干什么的,到Part3再说。但是先说下,这个DSDT严重不建议在10.11使用。因为这个patch会把XHC重新命名为XHC1.


Part2: 10.11 USB安装盘的电源管理五国Panic以及花屏禁行问题

估计有的朋友在制作了10.11的clover USB安装U盘,开始安装的时候,开启verbos模式,会遇上这样的问题。1,五国Panic,verbos代码显示AppleIntelCPUPowerManagement,2,屏幕上不断出着代码,突然一下花屏了。然后出现一个禁止通行的符号。而且,花屏,屏幕冻结,禁行符号出现后,仔细看的话,大约可以看出来,最后一行verbos代码是 “still waiting for root device”。这两个问题我碰到了,卡了我十几个小时。

我的经验如下:

电源管理五国panic:由于10.11的SIP机制防卫很严,加上clover config设置不到位,导致clover读不到NullCPUPowerManagement kext,就禁行了

出现花屏禁行:如果不是BIOS里没设定好AHCI的话(这个原因这些年已经反复在置顶帖里讲了,相信大多数人不会忽略),基本上就是以下原因,由于上面Part1中提到的新USB驱动机制,安装盘所在USB口不在plist里遮盖器提供的驱动范围之内,安装盘里的镜像读不到,就五国panic了。

(注意:安装10.11 clover的版本要新,最好使用3270或者3277)

对策:

电源管理五国panic:用clover configurator编辑config plst,在Rt Variables 一页中修改如下;
ROM:选择 UseMacAddr0
MLB:填上 C02032109R5DC771H
BooterConfig:填上 0x28
CsrActiveConfig:填上 0x67

(上面这套参数是我从一个pcbeta贴里翻出来的,目前本坛linzhouyu大神在本区置顶帖里好像推荐的不是这个,说是CsrActiveConfig用0x13更好,我建议两套可以都试验下)

然后检查下,fakesmc NullCPUPowerManagement VoodooPS2Controller等必要驱动是否齐备。注意一点,目前clover对于10.11 安装镜像识别可能不太好,加载的时候可能找到10.10的文件夹里去,所以尽量把10.11 10.10 other三个文件夹,甚至更早的10.9等文件夹里都放上必要驱动,以求万无一失。

禁行符号:
对策1:尝试换一下Smbios的机型,说不定换一个机型,目前的USB口就有驱动了。(这个要看RP,不一定有用)
对策2:尝试换一个USB口用。(这个要看RP,不一定有用)
对策3:修改DSDT里USB主控器名称,躲避遮盖。
对策4:在硬盘里分一个7GB以上的分区来写入安装镜像,直接从硬盘安装,一了百了。

Part3: USB3.0 multiplex patch和FakePCIID_XHCIMux kext以及15个端口总数的限制

USB3.0 multiplex(或者类似名称)是一个在10.10时代被使用的DSDT patch,MACiASL软件里RehabMan patch源里就有。

FakePCIID_XHCIMux kext是RehabMan最近几个月新制作的一个kext,注意,FakePCIID_XHCIMux kext必须配合FakePCIID kext一起使用,也就是说,要两个一起安装。

USB3.0 multiplex patch和FakePCIID_XHCIMux kext这两个东西的作用是一样的。众所周知,USB3.0向下兼容USB2.0.,所以USB3.0的主控器XHC下面存在着USB2.0的port。这两个东西的作用就是,把USB3.0主控器(XHC)下的USB2.0 port转移(bypass)到USB2.0主控器(EHC1,EHC2)下,让USB3.0主控器(XHC)只负责管理USB3.0设备。注意,这并不是说USB3.0口就不能读USB2.0的U盘了,而是说用了这两个东西其中之一后,当你把USB2.0的U盘接到3.0接口上,2.0主控(EHC1,EHC2)会代替3.0主控(XHC)来处理它,具体U盘仍旧是可以写入读取的。

在10.11时代,如果你有这个功能需求,这两个功能相同的东西我们应该采用哪个呢。答案是,后一个,采用FakePCIID_XHCIMux kext和FakePCIID kext的组合。

为什么不采用USB3 multiplex patch呢,原因1,这个patch对DSDT改动较大,而不同机型的DSDT又有很大差异性,使用这个patch,兼容性和成功率并不是那么高的;原因2,这个patch会把DSDT里USB3.0主控器的名称改成XHC1,导致10.11的XHC1遮盖器生效。

再有一个问题,XHC控制器USB2.0 bypass,这一功能有什么实际意义呢?

其一:有些USB2.0设备在EHC1,EHC2主控器下比在XHC主控器下性能好些。
其二:就是Part4标题里说的15个端口总数的限制了。

简单来说,老外技术人员发现了这样的限制条件,10.11下,每个USB主控器(EHC1,EHC2,XHC)下,端口数不能超过15个,超过部分不予处理,作废。

对于EHC1,EHC2两个USB2.0主控器,这15个限制名额一般是用不完的。就算加上一些内置设备,难道还能有30个USB2.0端口吗?

但是对于XHC这个USB3.0主控器,有的时候就有点麻烦了。因为:

1 USB3.0 只有XHC这一个主控器,不像USB2.0有两个。
2 USB3.0向下兼容USB2.0,所以默认情况下,每个外置USB3.0的接口,实际上内部占用的是两个端口,USB3.0一个,兼容的USB2.0一个。所以如果你的笔记本有3个外置USB3.0接口,就要占用XHC主控6个端口名额。
(看下图,我的笔记本DSDT信息,XHC主控-RHUB-下面有HSP1,2,3,4,SSP1,2,3,4总共8个端口,HSP的4个就是兼容的USB2.0端口,HSP就是High Speed的简写,SSP那4个才是USB3.0端口,SSP是Super Speed的简写,XHC USB2.0 bypass这个功能就是要把那4个HSP从XHC名下移走,移动到EHC1,EHC2名下)



笔记本还好点,因为笔记本外置USB3.0接口数量不多,说破天就是4个。(我的笔记本Alienware M17X R4,17寸高性能巨型游戏本,这样才4个,那些13寸14寸小本不可能比我这个还多吧)台式机主板......有的定位比较高端的,8个USB3.0口,这样XHC下就是16个端口,超限制了。更过分的,有的台式机,XHC下,不光有n个USB3.0端口,还有m个纯的USB2.0端口,这样的话,XHC下端口总数就是2n+m。所以说白了,这个XHC USB2.0 bypass,FakePCIID_XHCIMux kext的功能就是,XHC下15个端口名额不够用,把其中的2.0端口移动到富裕名额的EHC1,EHC2那边去。

当然,如果你XHC主控下,端口名额不紧张,也不在乎那点所谓的USB2.0设备性能差别问题(比如我就是这样),那你就不用搞这个东西。


暂时先写到这里吧,对于各种稀奇古怪的USB设备问题,RehabMan给出的解决方法是根据自己的机器,自制遮盖器,(当然我认为还有一种办法是手工改写DSDT里,各个USB端口下的_UPC Object )但是具体怎么样自制,他讲的很不详细,我也正在研究中,而且我的电脑,Alienware M17X R4 ,USB2.0总线上的设备总是有一部分罢工。三四个设备这个好了那个就坏。我到现在也还没搞定。所以还是先发这一篇文出来把机制方面的内容讲清楚。如果我成功参悟了自制遮盖器的方法,到时候在发新文。

PS:不知道远景有没有帖子的编辑时间限制?有的话能不能麻烦版主给我把本帖的编辑时间限制去了,方便我以后修改。
更新:本文只是讲讲驱动机制方面的内容,只能算是上篇,具体怎么做修改,请看新鲜出炉的下篇-10.11 USB问题之下篇,一步一步教你解决USB问题,链接如下:https://bbs.pcbeta.com/viewthread-1651615-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

15

查看全部评分

550318159 发表于 2015-10-7 20:32 | 显示全部楼层
SF,非常感谢楼主的分享,我再仔细研读一下。。。
回复

使用道具 举报

菜泡饭1024 发表于 2015-10-7 20:32 | 显示全部楼层
这么好的文章竟然没有人回复! 虽然很久没折腾了一直稳定停留在10.10 但是还是需要好好研究一下这个问题,接下来肯定会用到!
回复

使用道具 举报

onlymechen 发表于 2015-10-7 20:32 | 显示全部楼层
没看的太明白,问一下我现在很奇怪,10.10.5 下我的usb 是两个hi-speed总线,2个usb口一个esata都能用,另一个总线上有一个蓝牙一个摄像头,摄像头正常。但是到了10.11,名称会变成usb2.0的总线,摄像头那两个都能正常,但是3个usb都不行了,按你说的,我应该修改dsdt还是修改你说那个文件?
USB Hi-Speed 总线:

  主控制器位置:        内建 USB
  主控制器驱动器:        AppleUSBEHCI
  PCI 设备 ID:        0x1c26
  PCI 修订版 ID:        0x0004
  PCI 供应商 ID:        0x8086
  总线数:        0x1d

集线器:

  产品 ID:        0x0024
  厂商 ID:        0x8087  (Intel Corporation)
  版本:        0.00
  速度:        最大 480 Mb/秒
  位置 ID:        0x1d100000 / 2
  可用电流 (mA):        500
  所需电流 (mA):        0

5880:

  产品 ID:        0x5800
  厂商 ID:        0x0a5c  (Broadcom Corp.)
  版本:        1.01
  序列号:        0123456789ABCD
  速度:        最大 12 Mb/秒
  制造商:        Broadcom Corp
  位置 ID:        0x1d180000 / 4
  可用电流 (mA):        500
  所需电流 (mA):        100

USB Receiver:

  产品 ID:        0xc52b
  厂商 ID:        0x046d  (Logitech Inc.)
  版本:        24.00
  速度:        最大 12 Mb/秒
  制造商:        Logitech
  位置 ID:        0x1d140000 / 3
  可用电流 (mA):        500
  所需电流 (mA):        98

回复

使用道具 举报

fzzf 发表于 2015-10-7 20:32 | 显示全部楼层
必须点赞。。。。。这是我这几天看到的USB帖子,说的最好的。。。
回复

使用道具 举报

qhg2092 发表于 2015-10-7 20:42 | 显示全部楼层
好文章,收藏先
回复

使用道具 举报

jiedy91 发表于 2015-10-7 20:48 | 显示全部楼层
楼主 把技术说的通熟易懂啊!  高人!
回复

使用道具 举报

墨白 发表于 2015-10-7 20:53 | 显示全部楼层
楼主良心!!!!!!!!!!!
回复

使用道具 举报

zonglan 发表于 2015-10-7 21:02 | 显示全部楼层
这样的技术贴必须常有
回复

使用道具 举报

vitamin!m 发表于 2015-10-7 21:04 来自手机 | 显示全部楼层
好文 赞!等楼主后续帖。
回复

使用道具 举报

媛懒如此 发表于 2015-10-7 21:12 | 显示全部楼层
本帖最后由 媛懒如此 于 2015-10-7 21:20 编辑

因为都是usb2.0没这个问题,就是想知道如果直接删掉/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/Info.plist
里面的相关描述,结果会如何?是采用dsdt里的描述?
回复

使用道具 举报

天涯猎人 发表于 2015-10-7 21:28 | 显示全部楼层
USB都能用,睡眠一睡就醒有办法解决吗,唤醒原因GLAN EHC2
回复

使用道具 举报

lhxxwyh 发表于 2015-10-7 21:30 | 显示全部楼层
看了楼主的帖子后,很受启发。
回复

使用道具 举报

szg 发表于 2015-10-7 21:52 | 显示全部楼层
那请问要如何修改来使usb可以用呢?我升级完,所有usb接口都用不了!结果就卡在输入密码的登录界面,一点都没办法,还请指点迷津!,我的主板是华硕p9x79 ws
回复

使用道具 举报

z1326  楼主| 发表于 2015-10-7 22:19 | 显示全部楼层
本帖最后由 z1326 于 2015-10-7 22:38 编辑
天涯猎人 发表于 2015-10-7 21:28
USB都能用,睡眠一睡就醒有办法解决吗,唤醒原因GLAN EHC2

初步判断,可能是_PRW Method 搞的鬼,K掉这东西就好了。RehabMan有一个补丁解决这个问题。USB3_PRW 0x0D and Rename,大约是这个名字,一个是0x0D的一个是0x6D的。我猜笔记本一般用0x0D。
回复

使用道具 举报

tdyso 发表于 2015-10-7 22:21 来自手机 | 显示全部楼层
技术贴,顶起
回复

使用道具 举报

z1326  楼主| 发表于 2015-10-7 22:38 | 显示全部楼层
onlymechen 发表于 2015-10-7 20:32
没看的太明白,问一下我现在很奇怪,10.10.5 下我的usb 是两个hi-speed总线,2个usb口一个esata都能用,另一 ...

如果你认为你DSDT里的USB相关信息都对(主要是相关端口的_UPC Object都对),那可以改下DSDT,把里面的EHC1/2改成EH01/02。(为稳妥可以用clover打补丁的来改)帖子里说了,这样会导致遮盖器主控名对不上,从而使遮盖器实效。然后系统改为读取DSDT。就OK了。PS:有的帖子说,把plist里遮盖器port-count一行和ports目录删除了也能干掉内置遮盖器,但是RehabMan没有确认这个说法。

当然,这么干,前提是你DSDT里信息是准确的。不准的话,只有自己动手改DSDT,或者自己动手定制遮盖器。主帖最后说了,这些手段具体要怎么操作,我还没参透.......
回复

使用道具 举报

sunnywin7 发表于 2015-10-7 22:41 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

z1326  楼主| 发表于 2015-10-7 22:41 | 显示全部楼层
媛懒如此 发表于 2015-10-7 21:12
因为都是usb2.0没这个问题,就是想知道如果直接删掉/System/Library/Extensions/IOUSBHostFamily. ...

我估计你说的是这个做法:把plist里遮盖器port-count一行和ports目录删除掉。

按照RehabMan描述的机制,应该是像你说的那样,不过RehabMan没有确认这一点。
回复

使用道具 举报

z1326  楼主| 发表于 2015-10-7 22:46 | 显示全部楼层
szg 发表于 2015-10-7 21:52
那请问要如何修改来使usb可以用呢?我升级完,所有usb接口都用不了!结果就卡在输入密码的登录界面,一点都没 ...

你先看看你DSDT里 USB3.0主控器名称是不是XHC1?是的话先把DSDT里的XHC1都改成XHC,运气不是太差的话应该能搞活一部分USB口。全部搞活,搞到完美估计要费点劲了。你这可是X79,发烧级主板,我估计上面USB3.0口有一大堆。

至于为什么USB3.0口多了,要多费一些周折,请仔细阅读主楼part3部分。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋手机版联系我们

Copyright © 2005-2025 PCBeta. All rights reserved.

Powered by Discuz!  CDN加速及安全服务由「快御」提供

请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。

远景在线 ( 苏ICP备17027154号 )|远景论坛 |Win11论坛 |Win10论坛 |Win8论坛 |Win7论坛 |WP论坛 |Office论坛

GMT+8, 2025-2-23 22:48

快速回复 返回顶部 返回列表