leko999 发表于 2015-10-8 13:18

解决Intel 8/9系主板USB问题(更新,支持10.11.1)

本帖最后由 leko999 于 2015-10-25 10:35 编辑

原英文教程的链接:
http://www.insanelymac.com/forum/topic/308325-guide-1011-full-speed-usb-series-89-keeping-vanilla-sle/

更简单的方法:
https://bbs.pcbeta.com/viewthread-1647578-1-1.html

这个可以修复安装10.11之后USB3端口失效的问题, 好处是不动SLE,只要/L/E下一个很小的驱动(只有Info.plist),但是这篇教程写的很不清楚,还有些错误的地方。为了给大家省点事,写一个详细一点的过程。

1. 为什么会有USB失效的问题


从10.11起苹果改变了USB驱动的模式(以前是啥样我也不知道),对USB加了些蛋疼的限制。关于这个的详细技术背景,请仔细阅读这篇 从技术角度谈谈10.11的USB驱动机制,兼论10.11 USB安装盘的花屏禁行问题。

对我等用户来说,知道两点
1. 苹果用“USB控制器名称+机型”匹配的方式来控制USB端口。控制器名称在白果里面是EHC1/EHC2(USB2)和XHC1(USB3),假如你的DSDT里面控制器是这个名字,那么就会受影响。解决办法是修改控制器名称(改dsdt.aml)让它们不使用这些名字,比如ECH1改名EH01, XHC1改名XHC。还有个办法是使用这个受到限制的名字然后修改驱动内置的限制名单,这个需要修改SLE下面的原版驱动,不在本教程的讨论范围内。参见这篇英文教程。

2. 对大多数台式机的8/9系主板,其实1根本不是问题,虽然USB2控制器默认用的是EHC1和EHC2,但是这两个下面根本没东西。所有的USB端口,USB2和USB3的,都挂在USB3控制器下,而这个控制器的名称一般是XHC,也就是说,大多数主板默认就绕过了限制1。
然而,苹果还有第二个限制,那就是一个控制器下不能超过15个设备——这个后面详细解释——表现出来的现象就是只有USB2能用,因为默认下XHC的USB2端口直接占满了这15个名额,把USB3挤出去了。

解决办法一是节流,去掉不要的端口,让总数不超过15,也是本教程的内容。二是分流,用另外的驱动把XHC的USB2端口重定向到EHC控制器下面去,保证XHC下端口数目小于15个。


2. 查看DSDT确定端口地址

用IORegistryExplorer(或者IOJones),按照下图所示,先切换到IOACPIPlane,然后找到XHC主控,下面是所有的端口

先看左侧。默认设备名就是XHC(如果是XHC1,需要改成XHC)
以我的主板为例,XHC下有21个虚拟端口,名称分别是HS01-HS15,一共15个,这个对应USB2.0(HighSpeed)
以及SSP1-SSP6,一共6个,这个对应USB3.0.(SuperSpeed Port)

如果你的机器EHC和XHC下的虚拟端口数都小于15个,则不适用本教程,也就是说USB不工作另有原因。

在右侧的_ADR就是每个虚拟端口对应的地址。



如无意外,虚拟端口的地址是从1到21顺序排列的,也就是0x01到0x15。

USB2端口HS01到HS15对应的是1到15,即0x01到0x0F
USB3端口SSP1到SSP6对应16到21,即0x10到0x15

到此为止,不需要编辑DSDT,只要查看获取信息即可。


(可选)
如果你的USB3控制器名称是XHC1,那么必须改名。用下面的MaciASL补丁将它们改成XHC,已经是XHC就不用管了。
into device label XHC1 set_label begin XHC end;
into_all all code_regex XHC1 replaceall_matched begin XHC end;EHC1和EHC2可以改名也可以不改。参考后面的步骤3,在Windows下定位端口。如果EHC控制器下有设备(可能出现在笔记本上),建议改名。台式机一般EHC下面没有设备,可以不改。
into device label EHC1 set_label begin EH01 end;
into device label EHC2 set_label begin EH02 end;
into_all all code_regex EHC1 replaceall_matched begin EH01 end;
into_all all code_regex EHC2 replaceall_matched begin EH02 end;

3. 在Windows下定位物理端口和虚拟端口的对应关系


8/9系主板,最多支持8个USB2和6个USB3。
在DSDT中,XHC控制器下有21个虚拟端口。
当把一个USB设备(无论USB2还是USB3)插入USB2接口的时候,系统会使用一个HS端口(HS01-HS15之一)
当把USB2设备插入USB3接口的时候,系统会使用一个HS端口(HS01-HS15之一)
当把USB3设备插入USB3接口的时候,系统会使用一个SS端口(SSP1-SSP6之一)


可以看到,要让USB3插口正常工作,需要两个虚拟端口——一个HS和一个SSP。默认情况下SSP缺失,结果就是USB3端口不认USB3设备,只能插USB2设备。那么以主板的最大值计算,需要8+6*2=20个虚拟端口,现在最多只允许15个,所以需要寻找对应关系,去掉一部分不用的端口。


在Windows下,可以用aida64或者免费的usbview。截图用的aida64。aida64正确列出了全部21个端口。其中端口1-15对应HS01到HS15,端口16-21对应SSP1到SSP6. 可以看到,读卡器是接在USB3上(端口17)




下面就是把USB设备分别插*入所有的端口,USB2口只要一次,USB3口需要用USB2设备和USB3设备各一次。每次插*入设备后,务必刷新一下显示,然后记下设备所在的端口号,这就是物理插口对应的虚拟端口的位置。

以我的Z87主板为例,记录如下(USB3有两个值,所有大于15的是SS口)
前USB3面板两个插口:11 20和12 21
前USB2面板两个插口:7和8
后面的见图


我主板上总共用了4个USB2(前2后2)和6个USB3(前2后4),这样一共需要4+6*2=16个虚拟端口。相比15个限制,只要去掉一个。

去端口的方法:
1. 对USB2口,去掉那就彻底没了。
2. 对USB3口,有三个选择
a 彻底干掉,一次腾出两个名额
b 干掉HS虚拟端口,这样USB3口将无法接受USB2设备,但是能用USB3
c 干掉SS虚拟端口,这样USB3口将无法接受USB3设备,但是还能用USB2.

我选择的是去掉前面板两个USB3口之一的USB2功能。这样对实际使用基本没影响。

原本需要的端口是1 2 3 4 7 8 9 10 11 12    16 17 18 19 20 21
去掉端口11,那么最终结果就是 1 2 3 4 7 8 9 10 12    16 17 18 19 20 21


4. 修改plist驱动
由于10.11.1升级增加了对9系主板的原生支持,请先升级到10.11.1,
对8/9系主板,均使用附件中的USB_Series8_Injector。

解压得到kext
用plist编辑器编辑里面的Info.plist
我用的xcode,首先右键,选“Show Raw Keys/Values“,这步很重要,否则看不到需要修改的数值


附图是已经编辑好的效果。需要改的地方:
1. 机型和控制器名称。改成和自己设置对应的部分。一共四处。
2. 展开XHC项里面的IOProviderMergeProperties,需要修改的地方
a. port-count这个不是端口的数目,是所有端口地址(port项)中数值最大的那个,也就是最后一个端口的地址。这里是15000000(端口地址0x15)
b. 每个端口的名称和port数值,注意port就是虚拟端口的地址,也就是前面的1-21(0x01-0x15),
但是需要写成DWORD,不熟悉的话可以参考如下对应表。

0x01    0x01000000
0x02    0x02000000
.
.
.
0x0F    0x0F000000
0x10    0x10000000
.
.
0x15    0x15000000


最后把这个kext装到/Library/Extensions/,用kext utility修复权限,重启,USB3应该就能用了。


更新:新的更简单的方法
https://bbs.pcbeta.com/viewthread-1647578-1-1.html

chengxin 发表于 2015-10-8 17:08

顶技术贴!

wing129983 发表于 2015-10-8 17:31

先收藏起来,万一以后换主板超过15个端口就能用上了。

fuwu1245 发表于 2015-10-8 17:32

HM67的USB3.0口也不好使啊。。。

a528589980 发表于 2015-10-8 17:51

说好了就留在10.10.5的。出了又要折腾,{:5_271:}

迷途狼 发表于 2015-10-8 17:51

苹果公司真是吃多了,好好的要改usb机制,搞的我头都大了

gujiangjiang 发表于 2015-10-8 17:53

技术贴一般我都看不大懂的,默默飘过顶一下

xvip4420 发表于 2015-10-8 18:12

不错,很清晰,但现在有2个口可以用,暂时不想改了

fzzf 发表于 2015-10-8 18:31

这种帖子,必须要顶。。。谢谢楼主啊。。。。{:5_266:}

tdyso 发表于 2015-10-8 21:02

按楼主的方法改完所有usb接口都跑到USB3.0下面去了

fzzf 发表于 2015-10-8 21:20

本帖最后由 fzzf 于 2015-10-8 21:22 编辑

对应表,昨天晚上做出来了。。。按照楼主改的。。以前usb2.0的都跑到usb3.0下面去了。。。{:5_271:}。。。
哪没对吗????

zhangxuan1340 发表于 2015-10-8 21:39

楼主写的大概明白,但是USB的自动切换方案不知能否改改,而且我是USB3全部好好的USB2全挂了

tdyso 发表于 2015-10-8 21:42

二是分流,用另外的驱动把XHC的USB2端口重定向到EHC控制器下面去,保证XHC下端口数目小于15个。
这部分不好理解,其实我的主板按国外另一种方法USB已经完美了,就是想试试楼主的方法

fzzf 发表于 2015-10-8 21:54

tdyso 发表于 2015-10-8 21:42 http://cdn.pcbeta.img.inimc.com/static/image/common/back.gif
二是分流,用另外的驱动把XHC的USB2端口重定向到EHC控制器下面去,保证XHC下端口数目小于15个。
这部分不好 ...

什么方法?

tdyso 发表于 2015-10-8 22:04

fzzf 发表于 2015-10-8 21:54
什么方法?

1.clover path DSDT
2.加载Re...man两个Fake....kext
3.添加一个SSDT

fzzf 发表于 2015-10-8 22:05

tdyso 发表于 2015-10-8 22:04 http://cdn.pcbeta.img.inimc.com/static/image/common/back.gif
1.clover path DSDT
2.加载Re...man两个Fake....kext
3.添加一个SSDT

有地址吗???我看看。。现在全在usb3.0下。。。。。{:5_265:}

tdyso 发表于 2015-10-8 22:13

fzzf 发表于 2015-10-8 22:05
有地址吗???我看看。。现在全在usb3.0下。。。。。

tonymacX86,你去找一下吧,手机上的,记不住具体地址

fzzf 发表于 2015-10-8 22:28

tdyso 发表于 2015-10-8 22:13 http://cdn.pcbeta.img.inimc.com/static/image/common/back.gif
tonymacX86,你去找一下吧,手机上的,记不住具体地址

谢谢了。。。。

simon126 发表于 2015-10-8 22:46

Mac系统通常到第5个就比较好用了。El Capitan 现在还是有许多潜在的问题。

elisontz 发表于 2015-10-8 23:14


Device (SSP1)
                {
                  Method (_ADR, 0, NotSerialized)// _ADR: Address
                  {
                        Return ((XSPA + Zero))
                  }
                }

                Device (SSP2)
                {
                  Method (_ADR, 0, NotSerialized)// _ADR: Address
                  {
                        Return ((XSPA + One))
                  }
                }

Device (SSP3)
            {
                Method (_ADR, 0, NotSerialized)// _ADR: Address
                {
                  Return ((XSPA + 0x02))
                }
            }

            Device (SSP4)
            {
                Method (_ADR, 0, NotSerialized)// _ADR: Address
                {
                  Return ((XSPA + 0x03))
                }
            }

Device (SSP5)
            {
                Method (_ADR, 0, NotSerialized)// _ADR: Address
                {
                  Return ((XSPA + 0x04))
                }
            }

            Device (SSP6)
            {
                Method (_ADR, 0, NotSerialized)// _ADR: Address
                {
                  Return ((XSPA + 0x05))
                }
            }为什么我DSDT里USB3是这样的
页: [1] 2 3 4 5 6
查看完整版本: 解决Intel 8/9系主板USB问题(更新,支持10.11.1)