z1326 发表于 2015-10-28 07:15

10.11 USB问题之下篇,一步一步教你解决USB问题

本帖最后由 z1326 于 2015-11-9 08:33 编辑

有几个问题忘了说了,在这里补充编辑下。

1 自己动手实验之前clover配置里那些选项建议不要乱开,有关USB的选项推荐都关了,这样可以减少干扰,让人更快更清晰地排查原因。

2 本系列文章有关USB3.0的驱动方法是适用于intel原生USB3.0的,通过第三方转接芯片(比如台式机主板自行添加PCIE USB3.0转接卡的)转接出来的USB3.0口不在本文的说明范围之内。

尤其注意,某些sandybridge平台的笔记本(i3/5/7-2xxxM CPU+移动6系列芯片组),虽然机器上可能带了USB3.0接口,但是这绝对是第三方转接芯片转接出来的,因为sandybridge平台上没有intel原生的USB3.0支持,intel最早的USB3.0原生支持出现于ivybridge平台(i3/5/7-3xxx/3xxxM系列CPU+桌面/移动7系列芯片组)。对于第三方USB3.0转接芯片,国外技术高手写了一个专门的kext来支持,就是genericUSBXHCI,但是这个kext貌似目前还没有更新到支持10.11的版本,只能耐心等待一下了。

之前发过 https://bbs.pcbeta.com/viewthread-1646768-1-1.html 这篇文章,从技术角度谈谈10.11的USB驱动机制,兼论10.11 USB安装盘的花屏禁行问题,该文中对10.11新引入的USB遮盖器机制进行了说明。本文是它的下篇,教你动手解决USB问题。闲话不说,开始讲。接上文,现在来谈一谈如何动手修正10.11下USB的驱动问题。

Part1:修改USB总线名称,躲避内部遮盖器

关于10.11开始引入的遮盖器机制,上一篇中讲的比较清楚了,在此不再赘述。现在的问题是,我们应该怎么办?

有的教程里说在
/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里动手,把相关限制条目删了,或者改名。我没验证过这样干是否有效,但是我还是推荐不要动sle下的kext,因为如果靠改sle下的原装kext来实现功能,且不说SIP防护的问题,以后升级的时候可能会被覆盖,到时候还要再动手,麻烦。

那么,到底怎么办呢?DSDT里,把EHC1 EHC2这两个USB总线重命名成EH01 EH02就可以了。(如果你DSDT里 USB3总线名称是XHC1,那也要改回XHC,本来就是XHC的就不用改了)。

具体实现这个有两种方法:直接编辑DSDT,或者改clover的config plist,两者任选一个。

如果选改DSDT的话,那就找出自己的DSDT dsl文件,用MACiASL打开,Edit-Find,全篇从头开始查找EHC1,找到一个就改成EH01,一直到改完整篇,再也搜不出一个EHC1为止。然后,同样的方法,把全篇的EHC2改成EH02.(如果USB3 总线名称是XHC1的话,也要这样改成XHC,本来就是XHC的就不用改了)。之后重新编译aml并放到指定位置。

如果选改clover的config plist的话,用clover configurator打开config plist,在ACPI分页中如下图所示给DSDT打补丁。(与上一个方法同理,USB3总线名称本来就是XHC的不需要打第三条,只需要打前两条)



如果你干完这个之后,所有设备就都正常了,那么恭喜你,下面的内容你可以不看了。

Part2:探明自己机器USB总线下设备的分布

如果你的机器,经过上面的重命名之后依旧有某些USB插口不能用,或者有某些USB3接口不认USB3设备,那我们就要研究一下机器的USB总线了。

首先,用MACiASL打开自己的DSDT dsl文件,查看EH01,EH02,XHC这3个Device下面的子设备分布。比如我的这台机器,基本上就是这样的。

Device(EH01)   (_ADR, 0x001D0000)
      Device(HUBN)      (_ADR,Zero)
            Device(PR01)      (_ADR,One)
                  Device(PR11)(_ADR,One)
                  Device(PR12)(_ADR,0x02)
                  //以此类推,一直到
                  Device(PR18)(_ADR,0x08)


Device(EH02)   (_ADR, 0x001A0000)
      Device(HUBN)      (_ADR,Zero)
            Device(PR01)      (_ADR,One)
                  Device(PR11)       (_ADR,One)
                  Device(PR12)       (_ADR,0x02)
                  Device(PR13)       (_ADR,0x03)
                  Device(PR14)       (_ADR,0x04)
                        Device(PR24)       (_ADR,0x04)
                  Device(PR14)       (_ADR,0x04)
                        Device(PR24)       (_ADR,0x04)
                  Device(PR15)       (_ADR,0x05)
                        Device(PR25)       (_ADR,0x05)
                  Device(PR16)       (_ADR,0x06)

Device(XHC)   (_ADR, 0x00140000)
      Device(RHUB)      (_ADR,Zero)
            Device(HSP1)      (_ADR,One)
            Device(HSP2)      (_ADR,0x02)
            Device(HSP3)      (_ADR,0x03)
            Device(HSP4)      (_ADR,0x04)
            Device(SSP1)      (_ADR,0x05)
            Device(SSP2)      (_ADR,0x06)
            Device(SSP3)      (_ADR,0x07)
            Device(SSP4)      (_ADR,0x08)

我的4个USB3接口都很正常,DSDT里耶可以看到,XHC下也正好是8个端口(完美对应了4个USB3接口,HSP是4个兼容的USB2口,SSP是4个USB3端口)。但是EH01和EH02,就需要分辨了。因为根据我自己对自己电脑硬件的了解,USB2总线下的设备总共只有4个,分别是:eSata/USB2二合一接口,BCM20702蓝牙,m17x外星人灯光控制器,摄像头。总共4个设备,但是EH01和EH02下,8+6,总共有14个PR(EH02下 PR14,15,16下有PR24,25,26三个子设备,根据RehabMan大神指教,这三个子设备没什么用,可以无视)。14个PR里一定有10个是空的。只有4个PR上才是有东西的。还有的人,搞的台式机主板,XHC下端口有十好几个,很难搞清与机身上USB口的对应关系。怎么办呢?

ps:EHC总线下会有很多个PR的Device(有的机器叫PRT),XHC总线下会有很多个SSP和HS的Device(有的机器叫HSP),为方便叙述,我们把这些统称为端口。


方法1,单刀直入。

去“关于本机”-“系统概述”-“USB”一页中查看。比如这张图。



BCM20702A0就是我的蓝牙主控,然后,如果选中BCM20702A0,会显示出它的位置ID是:0x1a110000,0x1a是EH02主控器的位置(EH01主控器的位置是0x1d),第三位的1是指HUBN-PR01的位置是1,第四位的1就是指下面位置1的端口了(对应上文中PR11的_ADR,One),所以根据这个位置ID,我们判断出,EH02-HUBN-PR01-PR11端口对应的设备是内置蓝牙模块。

对于蓝牙,摄像头这样的一直连接,无法拔下的设备,基本这样就能查出来了。对于USB接口,由于不连接设备的时候看不出东西,你可以准备一个U盘(或者移动硬盘,甚至鼠标等外置USB设备),一个一个接口地插上去,每插一个接口就去看一次,看看这个接口对应的是哪个端口。注意,USB3接口需要用USB2.0的U盘和USB3.0的U盘各测一次(因为每个USB3.0等接口在DSDT里是对应两个端口的,USB3一个,兼容的USB2一个,上一篇文章写的,希望你还记得)

用纸笔记下,EH01 EH02 XHC下哪个端口对应哪个接口/设备,哪个端口是空的,没用的。

本方法缺点:只能测试出已经被10.11系统驱动并正常工作的端口。如果某个端口是有用的,但是由于DSDT里标记错误,或者XHC总线下端口太多,超过15个,被挤出去了,那用这个方法就不能找出外置接口/设备与端口的对应关系。

方法2,时光穿越。

说白了很简单,估计不少人的机器在Yosemite下都是驱动完美的。那就装回Yosemite,然后完美驱动,再打开ioreg查看就是。比如这个是我在Yosemite下的ioreg。



可以看到,M17x外星人灯光控制器,位于EHC2(现在已经被我们改成EH02了)总线下,右边,locationID是0x1a120000,1a代表EHC2(EH02)总线,因为上面从DSDT里得知,Device(EH01)   (_ADR, 0x001D0000)   Device(EH02)   (_ADR, 0x001A0000),所以1a是EH02;1a后面的一个1代表1号位置的Hub,就是 Device(PR01)      (_ADR,One),后面的ADR One;然后,0x1a120000,自x起,第四位的2才代表的是端口的地址是2号,对应的是 Device(PR12)       (_ADR,0x02) 后面的那个0x02。如此一番推理下来,知道了M17x外星人灯光控制器对应的是EH02下的HUBN-PR01号hub-PR12端口。

有一个和方法1一样的问题,蓝牙,摄像头这样的一直连接,无法拔下的设备,直接就查出来了。USB接口,直接看看不出来怎么办。解决方法也是和方法1里一样,找好U盘等USB外界设备,一个口一个口地插拔,尝试。我觉得Yosemite应该不存在每个主控器最多下设15个端口的限制吧,因此这样干基本能查出所有的设备/接口与端口的对应关系。

本方法缺点:需要设置完善驱动的Yosemite系统,费时费力。

方法3,偷天换日。

具体来讲,就是开windows,然后用AIDA64,查看设备-USB设备。(请尽量保证windows下硬件驱动安装齐备)

然后在AIDA64里右边一栏所有设备情况就能看到了,包括在哪个总线,哪个端口。如下图。



本图是AIDA64-设备-USB一页中USB3总线(XHC)的情况,上面写的Intel(R)USB3.0可扩展主机控制器,看到这个就知道这个总线是USB3的XHC总线,然后下面有Port1至Port8,自然分别代表了DSDT里的HSP01-04和SSP01-04,我把一个USB3的U盘接道机身的某一个USB3接口上,发现它挂在了Port6下,由此知道了这个外置接口USB3通道所占用的端口是SSP2(XHC下的第6个端口)。

我感觉这个方法比较简便实用。





z1326 发表于 2015-10-28 07:16

本帖最后由 z1326 于 2015-10-28 08:41 编辑

Part3:DSDT中的USB端口信息的修改


查找好端口与外部接口,内置USB设备的对应关系后,如果你的机器在Part1的总线改名后依然有不工作的地方,那你就可以尝试动手修改了。总体来说,有两种可行的办法,一是定制遮盖器(Customer Injector),二是修改DSDT。但是关于如何自制定制遮盖器,RehabMan讲解不详,而从他给出的几个实例中我又实在难以完全领会其中的要点,所以我还是给大家讲讲DSDT里的USB代码吧。


下面是我的EH02总线-HUBN-PR01-PR11的代码,经过Part2的查证我们得知这个端口连接的是BCM20702蓝牙模块。




                  Device (PR11)
                  {
                        Name (_ADR, One)
                        Name (_UPC, Package (0x04)
                        {
                            0xFF,
                            0xFF,
                            Zero,
                            Zero
                        })
                        Name (_PLD, Package (0x01)
                        {
                            Buffer (0x10)
                            {
                              /* 0000 */    0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                              /* 0008 */    0xB0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                            }
                        })
                  }




注意看Name (_UPC, Package (0x04)下面的那个大括号,里面有4行字符。这个区块被称为_UPC Object。下面的4行字符,第一行代表可连接性,如果是0xFF就是可连接的。如果这里标着Zero就是表示这个端口不可连接。


第二行表示的是接口类型,就是上一篇文章中提到的USBConnector值,也就是表示USB接口的类型,Zero(就是0)代表USB2.0 typeA型母口,0x02代表type miniAB USB2.0, 0x03代表 USB3.0 typeA型母口,0xFF(估计就是16进制的255)代表特殊接口。


第三行和第四行目前没有定义,是保留出来为以后做扩展用的。现在均应该填Zero,不应填其他数值。


_UPC Object区块中,最重要的就是第一行的可连接性了,所以如果通过Part2中的分析,你发现你的一个接口明明是有用的,是对应到一个内部设备或者一个外置USB接口的,但是在DSDT里,对应的_UPC Object 第一行却被标了不可连接,那你就应该考虑手动将其改过来。第二行的USB接口类型,如果发现与事实不符之处,也应尽量将其改为符合现实的情况。


然后看 Name (_PLD, Package (0x01)这个区块,下面有两行数据,每行有8个具体数据,_PLD这个区块是用来表示USB端口的位置信息与外部视觉特征的,英语全称是Physical Location of Device。如上所示,本区块数据两行总计16组,32个数据,有的是表明USB端口的颜色,有的是表明USB端口的位置(在机箱前面板,后面板还是侧面),有的是目前没有定义,暂时留空留作将来扩展用,必须填0的。但是这么多信息中最重要的应该就是一个,那就是可见性,我从RehabMan的修改实例中推测得出,可见性信息应该是在第二行,第一组数据的第二个数值,也就是上面例子中0xB0的后面的那个0。这个位置,填0就是不可见(hidden),填1就是可见(visible),像是内部设备的接口,比如内置蓝牙,笔记本内置摄像头,这种情况应该标注为不可见;对于外置USB接口则应标注为可见。


注意:技术资料中明确说明,在DSDT中标注某个USB端口为,_UPC区块,“不可连接”,_PLD区块,“可见”。这样的标注方法是不合逻辑的,不合法(illegal)的。


*本部分参考资料:


1 Microsoft MSDN在线文档,关于ACPI标准中USB端口部分的讲解。(Using ACPI to Configure USB Ports on a Computer)


https://msdn.microsoft.com/en-us/library/windows/hardware/ff553550


2 ACPI3.0b标准 pdf文档 第300页左右内容,pdf链接如下:


http://www.acpi.info/DOWNLOADS/ACPIspec30b.pdf


3 RehabMan在insanelymac论坛的回帖(不好找,因为在第10页上,一般人不会翻那么多页,一般就看主贴,多的看两三页就差不多了,但是这个回帖讲的很清楚,如果不是英语苦手,看下还是可以的)


http://www.insanelymac.com/forum/topic/306777-guide-usb-fix-el-capitan-1011/page-10


(第10页,182楼)


PS of Part3:


Q:我的主板USB3主控XHC下面有20多个端口,超过了15个端口的名额限制了怎么办?


A:1 先识别出这些端口是不是都是有用的,有没有无效端口。2 对于所有有效端口,如果超过了15个端口的名额限制,建议将其bypass走,具体怎么做,详见上一篇文章的Part3。


Q:出现什么情况可以判断一个内置设备的USB部分驱动已经好了呢?


A:在“关于本机”-“系统概述”-“USB”一页中出现相关设备信息就表明USB驱动部分已经没问题了。比如我的蓝牙,只要在“关于本机”-“系统概述”-“USB”一页中出现“BCM20702”的设备就说明USB驱动部分已经没问题了。如果在“关于本机”-“系统概述”-“蓝牙”一页中没有相关信息,并且蓝牙实际上也不能用,这个就不关USB驱动的事了,这个就是蓝牙驱动的问题了,要搞好必须从蓝牙驱动的角度来解决。(比如在IOBluetoothFamily kext下面plugin的相关kext中,内置的plist里注入自己的设备ID,或者采用国外现成的Bluetooth Firmware 上传kext,Bluetooth ID注入kext等)





Part4:USB总线消失之谜局-不同设备争IRQ问题及其对策

说实话我的机器真的很折腾,问题一个接一个,最让我崩溃的两个问题之一是这样的:

我的机器上有个eSata/USB二合一接口(以下简称为eSata口),可以当成USB2接口接USB2设备上去用(这种接口不少笔记本上都有)。但是安装10.11之后,神奇的状况发生了,这个接口没用了,而且在“关于本机”-“系统概述”-“USB”一页中,这个接口所在的EH01总线直接不出来了(经查证eSata口位于EH01-HUBN-PR01-PR17),页面上出现的只有EH02的总线。


如图,USB2总线只有一个,EH01总线找不到。

倒也不是完全不能用,有的时候EH01会出现,eSata口也能用,但是这个几率非常小,而且变好状态的出现似乎是随机的,无论我怎么进行排除法实验都找不到相关规律性。


最后经过艰苦的查证与搜索,我终于确定了这个问题的原因:争抢IRQ。

IRQ是什么大家先不用管,就把IRQ当成一个电脑内部设备需要用的东西就是了。IRQ这东西是有限的,而且是有编号的,比如1号,2号之类的。USB主控器要工作,需要IRQ。如何查找某个设备占用的IRQ的编号呢?看ioreg文档。比如下图,我偶然间碰到过一次eSata口可以使用,EH01总线也正常显示,我就赶紧用ioreg把当时的记录保存下来了。这是从当时的记录里截取的。


左侧页面中点击EHC1@1D,然后查找右边页面,IOInterruptSpecifiers,看到下属Data里的值是:17 00 00 00 07 00 00 00,主要就看前两位就可以了,前两位是17,说明EHC1(或者EH01)USB2主控器要正常工作需要占用17号IRQ。

然后,这是eSata口不工作,EH01总线在系统报告里消失的时候的ioreg记录。



可见,EH01总线下空空荡荡,右边的页面里找不到IOInterruptSpecifiers,说明EH01主控器没有IRQ可用。

然而,就在同一份ioreg记录中,我们找到了HPET设备,情况如下:


左边点击HPET后,请看右边的IOInterruptSpecifiers里的四个IRQ,最后一个编号3号的,17 00 00 00 00 00 00 00,前两位是17,现在知道了吧,HPET把EH01的IRQ抢走了,导致EH01没有IRQ可用,就失效了。

我猜,类似问题(一整个USB主控消失)十有八九是HPET抢了USB主控器的IRQ这个原因,这个问题怎么解决呢?给HPET指定4个IRQ,不要让它去抢就可以了。这个补丁在RehabMan的MACiASL补丁源里有,叫system IRQ,当然,由于河蟹原因,国内上外网的速度可能比较......。所以我直接把这个补丁给贴出来吧。

#Maintained by: RehabMan for: Laptop Patches
#system_IRQ.txt




# This can fix non-working audio and also has an affect on HPET.
#
# Use this if you have issues with patched AppleHDA (required on almost all laptops)
# or if you have issues with HPET (restart after wake).




# IRQ fix
into device name_hid PNP0000 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0100 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0B00 code_regex IRQNoFlags\s\(\)\n\s+\{(\d+)\} remove_matched;
into device name_hid PNP0103 code_regex IRQNoFlags\s\(\)\n\s+\{.*\} removeall_matched;
into device name_hid PNP0103 code_regex Name\s\(([^,]+),\sResourceTemplate\s\(\).*\n\s+\{((?:.|\n)*)\}\) replace_matched
begin
Name (%1, ResourceTemplate()\n
{\n
    IRQNoFlags() { 0, 8, 11, 15 }\n
%2
})\n
end;

把以上红字部分复制粘贴到一个txt文档里就做成可以用的DSDT补丁了。貌似这个补丁的原理是从原属设备的手中拿掉0号,8号,11号,15号IRQ并将这4个IRQ分配给HPET。反正我打了这个补丁就解决问题了,你要是确认除了这4个IRQ,你的机器上有其他空闲IRQ可用,那或许你也可以手动改变IRQ的分配。

z1326 发表于 2015-10-28 07:16

本帖最后由 z1326 于 2015-10-28 22:02 编辑

Part5:一睡就醒问题

安装10.11后,我的机器还有个毛病,睡眠一睡就醒。经过试验最后解决。当然睡眠问题很复杂,不可能所有的睡眠问题的原因都是这个,但是如果是USB原因导致的睡眠问题,那你可以看看这个Part做参考。

首先,要想实现正常睡眠功能必须要想办法启用原生电源管理,用NullCPUPowerManagement是不行的,这方面我就不多说了。但是如果启用了原生电源管理还这样,而且怀疑有可能是USB3导致的睡眠问题,那可以试试RehabMan的这两个补丁,usb_prw_0x0d_xhc.txt和usb_prw_0x6d_xhc.txt,在RehabMan的MACiASL补丁源里有。我猜0x0d是笔记本用的,0x6d是台式机用的,当然这是胡猜的,猜错了别找我,你不妨两者都试试。同样,为了方便生活在河蟹之下的国内朋友,把这两个补丁贴出来。


以下是0x0d的

#Maintained by: RehabMan for: Laptop Patches
#usb_prw_0x0d_xhc.txt




# remove _PRW methods to prevent instant wake




# delete any existing XHC1 device
into device label XHC1 name_adr 0x00140000 remove_entry;
# delete any existing USB2 device
into device label USB2 name_adr 0x001D0000 remove_entry;




# if _PRW objects are methods
into method label _PRW parent_adr 0x001D0000 remove_entry;
into method label _PRW parent_adr 0x001A0000 remove_entry;
into method label _PRW parent_adr 0x00140000 remove_entry;
into method label _PRW parent_adr 0x001B0000 remove_entry;
# some other LAN cards use 0x00190000
into method label _PRW parent_adr 0x00190000 remove_entry;




# if _PRW methods are stuffed into a separate scope
into method label _PRW parent_label _SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label _SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label _SB.PCI0.XHC remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label \_SB.PCI0.XHC remove_entry;




# if _PRW objects are names
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
# some _PRW have three entries in the Package
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;




# seems to work better if _PRW is present, but returns 0 (original was 3) for sleep state
into device name_adr 0x001D0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x001A0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x00140000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x001B0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x00190000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;




# rename XHC to XHC1
# rename is not a good idea for 10.11, maybe not for prior versions
# disabled for now




#into device label XHC set_label begin XHC1 end;
#into_all all code_regex XHC\. replaceall_matched begin XHC1. end;
#into_all all code_regex XHC_\. replaceall_matched begin XHC1. end;
#into_all all code_regex \.XHC, replaceall_matched begin .XHC1, end;




#Maintained by: RehabMan for: Laptop Patches
#usb_USB_7-series.txt




# USB property injection for 7-series boards (originally HM76)




# Insert Apple USB properties into EHC1
into method label _DSM parent_adr 0x001D0000 remove_entry;
into device name_adr 0x001D0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;




# Insert Apple USB properties into EHC2
into method label _DSM parent_adr 0x001A0000 remove_entry;
into device name_adr 0x001A0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;




# Insert Apple USB properties into USB 3.0 XHC
into method label _DSM parent_adr 0x00140000 remove_entry;
into device name_adr 0x00140000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;








# special cases... (not in u430 DSDT)
#into scope label _SB.PCI0.XHC.RHUB.HS05 set_label begin _SB.PCI0.XHC1.RHUB.HS05 end;



以下是0x6d的

#Maintained by: RehabMan for: Laptop Patches
#usb_prw_0x6d_xhc.txt




# remove _PRW methods to prevent instant wake




# delete any existing XHC1 device
into device label XHC1 name_adr 0x00140000 remove_entry;
# delete any existing USB2 device
into device label USB2 name_adr 0x001D0000 remove_entry;




# if _PRW objects are methods
into method label _PRW parent_adr 0x001D0000 remove_entry;
into method label _PRW parent_adr 0x001A0000 remove_entry;
into method label _PRW parent_adr 0x00140000 remove_entry;
into method label _PRW parent_adr 0x001B0000 remove_entry;
# some other LAN cards use 0x00190000
into method label _PRW parent_adr 0x00190000 remove_entry;




# if _PRW methods are stuffed into a separate scope
into method label _PRW parent_label _SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label _SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label _SB.PCI0.XHC remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label \_SB.PCI0.XHC remove_entry;




# if _PRW objects are names
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
# some _PRW have three entries in the Package
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;




# seems to work better if _PRW is present, but returns 0 (original was 3) for sleep state
into device name_adr 0x001D0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x001A0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x00140000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x001B0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x00190000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;




# rename XHC to XHC1
# rename is not a good idea for 10.11, maybe not for prior versions
# disabled for now




#into device label XHC set_label begin XHC1 end;
#into_all all code_regex XHC\. replaceall_matched begin XHC1. end;
#into_all all code_regex XHC_\. replaceall_matched begin XHC1. end;
#into_all all code_regex \.XHC, replaceall_matched begin .XHC1, end;




#Maintained by: RehabMan for: Laptop Patches
#usb_USB_7-series.txt




# USB property injection for 7-series boards (originally HM76)




# Insert Apple USB properties into EHC1
into method label _DSM parent_adr 0x001D0000 remove_entry;
into device name_adr 0x001D0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;




# Insert Apple USB properties into EHC2
into method label _DSM parent_adr 0x001A0000 remove_entry;
into device name_adr 0x001A0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;




# Insert Apple USB properties into USB 3.0 XHC
into method label _DSM parent_adr 0x00140000 remove_entry;
into device name_adr 0x00140000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
    Return (Package()\n
    {\n
      "subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
      "subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
      "AAPL,current-available", 2100,\n
      "AAPL,current-extra", 2200,\n
      "AAPL,current-extra-in-sleep", 1600,\n
      "AAPL,device-internal", 0x02,\n
      "AAPL,max-port-current-in-sleep", 2100,\n
    })\n
}\n
end;








# special cases... (not in u430 DSDT)
#into scope label _SB.PCI0.XHC.RHUB.HS05 set_label begin _SB.PCI0.XHC1.RHUB.HS05 end;

跟上面一样,保存成txt,然后在MACiASL里打补丁。


如何编辑DSDT,如何打补丁,如何编译aml这些问题就不说了,有经验的朋友都明白,新手请自行查找相关教程。

打完,收工。

z1326 发表于 2015-10-28 07:16

本帖最后由 z1326 于 2015-10-28 22:01 编辑

占楼备用。

wujizhihun 发表于 2015-10-28 09:30

感谢分享~~

sapphire1987 发表于 2015-10-28 09:34

赞一个,目前被安装盘各种重启困扰中,没法开始体验el capitan,回头上了完善的时候再拜读

yygutn 发表于 2015-10-28 09:36

楼主大大,你提供的所有方法我都试过了,USB2.0还是没有驱动

芦苇602 发表于 2015-10-28 09:53

留名,技术贴支持,随时查看!

z1326 发表于 2015-10-28 09:55

yygutn 发表于 2015-10-28 09:36 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
楼主大大,你提供的所有方法我都试过了,USB2.0还是没有驱动

1 总线改名
2 查找并激活所有有效端口
3 修复可能出现的IRQ冲突
简单点说我就是提供了这些方法,你都搞了吗?你查查你的DSDT,看看里面是不是有UHC总线(机器比较老的话是有可能的,我的机器时ivybridge HM77,所以才只有两个EHC和一个XHC)

傲骨虚怀 发表于 2015-10-28 10:02

yygutn 发表于 2015-10-28 09:36 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
楼主大大,你提供的所有方法我都试过了,USB2.0还是没有驱动

我与你相反,(笔记本)3.0无法驱动。

yygutn 发表于 2015-10-28 10:03

HM87,改了总线,查了端口,IRQ修复。。。。

z1326 发表于 2015-10-28 10:08

本帖最后由 z1326 于 2015-10-28 10:12 编辑

yygutn 发表于 2015-10-28 10:03 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
HM87,改了总线,查了端口,IRQ修复。。。。
HM87还有usb2的接口?感觉8系列的移动版应该全是usb3的接口才对。

z1326 发表于 2015-10-28 10:12

傲骨虚怀 发表于 2015-10-28 10:02 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
我与你相反,(笔记本)3.0无法驱动。
如果你说的是你签名的笔记本,那不能驱动是正常的。sandybridge平台 HM65芯片组没有原生的USB3支持,想用USB3只能用第三方转接芯片,而文中的USB3驱动方法只适合intel原生USB3平台。

东骧神骏 发表于 2015-10-28 10:14

好贴啊,前排支持

yygutn 发表于 2015-10-28 10:16

z1326 发表于 2015-10-28 10:08 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
HM87还有usb2的接口?感觉8系列的移动版应该全是usb3的接口才对。

有2个USB2.0总线

z1326 发表于 2015-10-28 10:19

yygutn 发表于 2015-10-28 10:16 http://cdn.pcbeta.img.inimc.comstatic/image/common/back.gif
有2个USB2.0总线

是有,但是你两个EHC总线上有设备吗?USB2的接口?摄像头?蓝牙?

非爱 发表于 2015-10-28 10:23

不错我喜欢了

yygutn 发表于 2015-10-28 10:32

z1326 发表于 2015-10-28 10:19
是有,但是你两个EHC总线上有设备吗?USB2的接口?摄像头?蓝牙?

ehc1有port5摄像头,port6外置接口,
ehc2有pirt5蓝牙,port4……忘了,1外置接口

yygutn 发表于 2015-10-28 10:32

z1326 发表于 2015-10-28 10:19
是有,但是你两个EHC总线上有设备吗?USB2的接口?摄像头?蓝牙?

有的啊,蓝牙摄像头和两个外置的接口

z1326 发表于 2015-10-28 10:35

在“关于本机”-“系统概述”-“USB”一页中出现USB2总线的信息了吗?
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 10.11 USB问题之下篇,一步一步教你解决USB问题