积分 214 最后登录 2021-9-18 精华 0 阅读权限 30 主题 79 UID 1336158 帖子 459 PB币 1014 威望 5 贡献 0 技术 35 活跃 399
UID 1336158 帖子 459 PB币 1014 贡献 0 技术 35 活跃 399
本帖最后由 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
查看全部评分