10.11自定义USB口,全部驱动成功,特来分享
本帖最后由 sdsy1212 于 2015-12-21 08:22 编辑这次10.11的USB改动可算是让大家有的折腾的了。从前也许很多用台式机的人并不使用DSDT,我就不用,但是到了现在,迫不得已,必须得用了。
修复USB的过程一个分3部分。第一,提取DSDT。第二,进入windows,查找每个USB的USB2编号和USB3编号。第三,通过模板文件,生成适合本机的kext。
首先我说一下,其实可以不必使用DSDT,但是如果不用,就要修改系统文件,对于处女座的我是不能容忍的。而且,如果不用DSDT,升级以后修改过的文件就丢失了,没法一劳永逸了。 首先,导致USB失效的文件是S/L/E下的IOUSBHostFamily.kext里的AppleUSBEHCIPCI.kext和 AppleUSBXHCIPCI.kext 里的/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/Info.plist你可以直接修改这2个文件,但是这是系统文件,处女座的你能忍吗?当然不能,所以我们用一个injector USB kext来解决这个问题。(原帖来自insanelymac)思路是这样的,通俗的说USB2 USB3在osx系统中的学名分别是EHC1 EHC2和XHC1,而主板自带的DSDT信息中USB2 USB3的学名为EHC1 EHC2和XHC的。别看这XHC和XHC1只差一个数,这就导致osx没有认出来这是USB3而没有完全限制住USB3。我们利用这个思想,在系统加载的时候将USB2改的让osx认不出来,然后用另外一个kext去描述它的属性,描述的内容自然是与你自己机器吻合的。clover启动系统的时候加载这个kext,这样USB就能全部驱动了。
然后,问题就来了,我们更具体一点是要描述啥?咋描述?
这时候我们需要一个windows的环境,利用一个叫aida64_engineer的程序。这个程序可以帮我们检测USB的物理接口的逻辑地址。
这里我们介绍另外一件事。可能大家注意到一点,USB3的接口是蓝色的,而实际上,USB3不仅是颜色不同,而且针脚也不同,USB3拥有USB2的4针以兼容USB2,同时多出5针,这5针就是USB3的不同之处。当一个USB3口插入USB2设备的时候,因为USB2没有那多出的5针,就使用兼容的4针模式,如果插入的是USB3设备,那就使用9针模式。这样,对于一个USB3口来说,它可以有2种工作模式,USB2或USB3。这也就是说对于一个USB3的物理接口,会有2个逻辑地址,以配合2种工作模式。
本帖最后由 sdsy1212 于 2015-10-27 05:24 编辑
所以,当你使用aida64去查看机箱上的同一个USB3口的时候,当你插USB2设备(比如鼠标)和USB3设备(比如USB3的U盘),显示出来的逻辑地址是不一样的。但是,对于一个USB2口,不管你插USB2设备还是USB3设备,都只有一个地址。
你要做的就是记录每一个USB2口,当插入设备时,位于哪个控制器下,编号多少。如果纯USB2口下的设备 都在USB 3.0 ROOT HUB下出现 那么你就不用管什么EHC1 EHC2 EH01 EH02了 和你没关系
如果纯USB2口下的设备 在USB 2.0 ROOT HUB下的 Generic USB Hub下一层的PORT1,2,3,4,5...下 就算再多个物理口 逻辑口都只能是算一个
后面你生成kext的时候 EH01里只算一个Port 1就好 EH02里也只算一个Port 1就好
每一个USB3口,当插入USB2设备时,编号多少,插入USB3设备时,编号又是多少。
干这件事的时候就是,找一个USB口插一个USB设备,刷新一下aida64软件的结果,记录一下,然后换口再继续重复操作。
比如,我试验一个我的机箱前面板的USB3口,按理说,这个USB3口会有2个地址。我先插个USB3的U盘试试。结果如下图。
我发现这个口,在插入USB3设备的时候,会出现在Port 16。如果我改成插入一个USB2的罗技接收器,我发现,16号设备不见了,而接收器信息出现在了Port 1。
自此,我们得出了结论,此USB口的USB2编号为1,USB3编号为16,此口不管是USB2还是USB3都属于USB3控制器管理。
注意,有些USB2设备,如上文所说 这里只要是出现在Generic USB Hub下的 不管是Port1下有多少个Port1,2,3,4,5,6等等 都只能算一个Port1
这2个控制器,到了osx下就是ECH1 ECH2了,我之前的那个口是USB3控制器下的,到了osx里,就是XHC了。
因为一般来说 ECH1和ECH2下都只会有Port1 如果你真的纠结哪个是EHC1哪个是EHC2
那么我告诉你8CA6数字小 所以它是EHC1 8CAD数字大 所以它是EHC2
你要做的,就是把每个口都试一遍,当你完成了这个操作,第二部分的工作就算做完了。你要把这些结果记录下来。
本帖最后由 sdsy1212 于 2015-10-29 09:12 编辑
等等,好像我们直接完成了第二部分,那第一部分呢?第一部分是有关DSDT的。那么DSDT到底是什么呢,简单的说,DSDT就是描述你主板接口功能等等所有配置的清单。对于修复USB来说,DSDT方面要做的事很简单,只是查找EHC1 EHC2替换为EH01 EH02而已。这么做的目的就是让osx的系统文件无法找到EHC1 EHC2从而无法描述USB2.0控制器下的设备,而我们后面自制的kext则会担起对EH01 EH02这两个偷梁换柱后的USB控制器进行详细描述,并使其驱动。但是我知道很多用台式机同学可能都没有提取过DSDT文件,不用担心,我们慢慢聊这个问题,一步一步的解决。本文所述的方法只能适用于7系8系9系主板,因为6系没有原生USB3.0,10系我又没亲身试过,故不在讨论范围内。虽然这段我们是谈DSDT的,但是我们先聊点别的。上一楼所说,USB控制器有2种,Enhanced Host Controller USB2.0 ROOT HUB控制器和eXtensible Host Controller USB3.0 ROOT HUB控制器也就是EHC和XHC。其中EHC控制器有2个EHC1 EHC2,而XHC控制器只有一个,其名称就是XHC。对于7系主板来说,黑色的纯USB2.0口是在EHC1 EHC2控制下的,蓝色的USB3.0口不管插USB2.0设备还是USB3.0设备,都会在XHC控制下。对于8系9系主板来说,不管是黑色的纯USB2.0口还是蓝色的USB3.0口,你插什么设备都在XHC控制器下。说这么多,那这到底有什么用呢?是这样的,如果你是8系9系的主板,那么EHC1 EHC2和你没半毛钱关系,也就是说你可以不管DSDT了。直接看下一楼怎么制作injector kext就好了。如果你是7系主板,那么很不幸,DSDT还是和你有关系的,因为你的黑色纯USB2.0口是受EHC1 EHC2控制的,你得把DSDT里的EHC1 EHC2改成EH01 EH02。可是有些同学心里犯怵了,我没DSDT文件啊,而且听说改DSDT有很多错误的,我弄不来怎么办。我要说不幸中也是有万幸的。因为我们毕竟不是在DSDT里搞什么大动作,也不是注入整段的补丁代码,只是修改几个名字。所以我们可以用clover的配置文件config.plist里的补丁代码来实现这个改名字的操作,而不提取DSDT。具体代码是<key>DSDT</key> <dict> <key>Patches</key> <array> <dict> <key>Comment</key> <string>change EHC1 to EH01</string> <key>Find</key> <data>RUhDMQ==</data> <key>Replace</key> <data>RUgwMQ==</data> </dict> <dict> <key>Comment</key> <string>change EHC2 to EH02</string> <key>Find</key> <data>RUhDMg==</data> <key>Replace</key> <data>RUgwMg== </data> </dict> </array> </dict>怎么在config.plist里添加这段代码,我就不教你了。改完clover的config后,即使你没DSDT文件,那么,以后你再去提取DSDT,里面也没EHC1 EHC2了,在clover启动时就给自动替换成EH01 EH02了。然而,人和人还是不一样的,总有把自己的人生设定为困难模式的同学,这里我也简单说下如何提取DSDT,而如果你用了clover注入代码修改EH01 EH02的方法后,也可以试着提取一下未改过错的DSDT,查找一下EHC1 EHC2看看有没有,从而达到让你的心里更踏实的目的。提取的方法有很多,对于菜鸟,以前没提取过DSDT的,可以下载RehabMan大神的patchmatic程序,并解压放置在桌面(所有涉及的程序已经贴在1楼附件里了),然后打开终端执行cd ~/Desktop./patchmatic –extract桌面上就会生成很多aml文件,这些aml文件就是DSDT和SSDT。但是这些文件是机器能读的文件,我们读不了,所以需要反编译。这时你需要下载iasl程序(解压后放到桌面上)来对aml文件进行集体反编译,让其变成我们能读的格式。用法是./iasl –da –dl *.aml执行完这个以后,桌面就会出现很多dsl文件,DSDT.dsl就是我们需要的了。现在你需要下载RehabMan大神的MaciASL工具(解压后放到‘应用程序’里以备用)来对DSDT.dsl进行编辑(双击DSDT.dsl就行,或者选择打开方式->MaciASL),并改错(此处省略两万字)和再编译。注意第一次进入MaciASL后,要在Preferences里的iASL栏里的Compiler Options改成ACPI 5.0,用4.0编译会有更多的错误。如果你已经用clover注入替换代码了,那么你现在可以查找EHC1 EHC2看看有没有,应该是没有就对了,因为你替换掉了嘛。再找找EH01 EH02,这里应该是有的就对了。如果你没用clover注入替换代码,我们要查找EHC1,将其全部替换为EH01。查找EHC2,将其全部替换为EH02。注意EHC1和EHC2都不仅仅有一个。再点Compile(即'编译'的意思),然后查错(被省略的两万字)。错误都搞定后,我们选择另存为。格式选择’ACPI Machine Language Binary’。这就是你的DSDT了,应该是DSDT.aml文件就对了。把这个修改好的DSDT,aml放到你的CLOVER的EFI/CLOVER/ACPI/patched文件夹下
自此,DSDT的事就干完了。
本帖最后由 sdsy1212 于 2015-10-29 09:17 编辑
现在我们来说说最后一步,怎么用模板,改出一个你自己主板合适的injector USB kext。我们首先下载模板(1楼附件里有)。是一个kext文件,要点右键,显示内容->Content,你会发现一个Info.plist文件。然后下载一个叫plistedit pro的软件(附件里也有,破解注册使用时别忘了断网)去修改它。此时,你手中应有一个表格,关于你的USB2口和USB3口的,用aida64记录的信息。打开模板以后,要检查机型,如果不符合,要改一下,共6处。然后就改相应的项就可以了。这里要注意port-count,就是你最后一个port的编号。还有port的名字并不重要什么HS01HS02你可以任意取。UsbConnector里如果此编号连接类型USB3填3,如果是USB2填0,如果是蓝牙设备,我看别人帖子说填255,如果摄像头也填255。当然蓝牙和摄像头多数还是USB2类型的,你不确定就先填0。port的data就是你记录的逻辑地址编号了。注意此处使用的是16进制。也就是说1 2 3 4 5 6 7 8 9之后是A B C D E F 然后是10 11 12 13 14 15比如你记录的地址是18,那么这里要填写的是12000000而非18000000完成了这个以后,保存,放到你的Clover的EFI/CLOVER/kexts/10.11目录下重启,你的USB就回来了。由于这里说的比较潦草,另有一篇帖子有一个Z77主板的全程实例,可做参考。https://bbs.pcbeta.com/viewthread-1651310-1-1.html 支持楼主,希望对有同样问题的景友有帮助。 czczyx 发表于 2015-10-25 00:01 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
支持楼主,希望对有同样问题的景友有帮助。
后面还有2层楼正在核审中。。。{:5_278:} 我想知道此方法对于拓展卡USB3.O是否有用,像NEC这种扩展卡 yuanjing1840 发表于 2015-10-25 00:07 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
我想知道此方法对于拓展卡USB3.O是否有用,像NEC这种扩展卡
这个不太清楚 不懂pcie总线、、、抱歉了。。。
支持楼主 来,我也学习一下。怎么修改USB来让CAPITAN系统认识 好文谢谢分享 先标记一下,跟楼主学习下如何修改 支持了usb是个大问题啊 回去看看,z77的2.0死掉了 sdsy1212 发表于 2015-10-25 08:05 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
后面还有2层楼正在核审中。。。
发个word吧{:5_262:} 很棒,正是我想要的 好帖子,感谢分享 好贴要跟随 支持技术贴,讲得很清楚 楼主,我也是NUC 54250 可以分享一下你的efi文件夹么?