注:该方法经测试支持12、13、14、15系统,需要配合不同的解除USB限制的补丁,才能正常驱动。
一直在思考如何简单有效的将定制USB驱动的方法介绍给大家,但是远景挂掉了,收藏的资料也找不到了。只好在自己的电脑上反复试验确认无误后,才抽空写了这个教程。这里感谢那些帮助过我的大神,等远景恢复后一定第一时间附上原贴及原作者。这里需要说明的是,教程定制的是遮盖器,非驱动。目的是让系统能够正确检测到usb,结果与驱动效果一样,不影响使用以及睡眠问题。
目录:
一、前言
二、准备工具及基本驱动文件
三、获取USB接口信息
四、两种驱动方法
五、USB调试
六、结语
一、前言
对于大部分台式机来说,黑苹果的USB只需要最新的RehabMan-USBInjectAll即可驱动USB2.0和USB3.0,但是笔记本仅仅是正常驱动USB都不容易,睡眠唤醒出问题也往往都是USB出的幺蛾子。所以想要完美实现睡眠唤醒,USB完美驱动是必不可少的。实现所有USB接口如同win下一般,也是macOS重度使用者迫切需要的。下面就详细介绍一下定制USB驱动的方法,如果使用RehabMan-USBInjectAll已经能够完美驱动所有USB接口,同时睡眠唤醒也正常的,这个教程就无所谓了,其他的朋友都可以尝试。(这里不讨论USB3.1接口)
目前,通过USB定制已经解决的问题有USB2.0、3.0(5G/s)内建问题,蓝牙驱动问题或蓝牙内建问题(免驱蓝牙无法驱动),摄像头问题(主要是笔记本摄像头),USB睡眠问题(如蓝牙与摄像头导致的秒醒问题,需要定义接口属性port或dsdt打usb睡眠补丁)。
二、准备工具及基本驱动文件
定制USB的工具:
1、win平台:
AIDA64(用以确认所有USB接口以及设备对应接口)
2、macOS平台:
MaciASL(选用,编辑DSDT文件)
IORegistryEntry (用来确认USB是否正常驱动
PlistEdit pro(编辑info.plist)
基本驱动:
1、USB_Injector.kext(方法一中使用)
远景中一位大神编写的需要DSDT文件配合
2、USBInjectAll.kext(方法二中使用)
RehabMac大神编写的万能驱动,定制既是直接修改这个驱动
三、获取USB接口信息
USB接口的基本结构大致如下:(这里不讨论USB3.1接口)
1、EHC1总线(第一组USB2.0接口)
2、EHC2 总线 (第二组USB2.0接口)
3、XHC1总线(USB3.0接口)
需要获取的是EHC1、EHC2、XHC1中的接口数量,以及设备使用的接口(如蓝牙、触摸板、摄像头等),需要在win平台下,使用AIDA64工具,设备——USB下找到相关接口。
1、EHC1总线
EHC1下有两个主接口port1与port2,port2无集线器直接忽略。port1下有8个接口,接口分别是11 ~ 18,其中13设备是指纹识别器,14是蓝牙,16是摄像头(记录下来)。
2、EHC2总线
EHC1下有两个主接口port1与port2,port2无集线器直接忽略。port1下有6个接口,接口分别是11 ~ 16,其中12设备是触摸板(记录下来)。
3、XHC1总线
XHC1下有21个接口,所有接口未被设备直接使用。
使用AIDA64查看所有USB接口信息,某个总线没有,也没有关系,如实记录即可。需要说明的是被设备直接使用的大多为特殊接口,后面章节需要特殊定义,其他接口只需要定义USB2.0与USB3.0即可。
以上可以确定完整USB2.0接口,但是USB3.0则需要进一步确认,这里需要用到DSDT文件(clover启动项选择页面F4获取,保存于ACPI 下,DSDT文件的编辑需要将格式由aml转换为dsl,并在ACPI5.0下修复报错才能保存,这里不讨论)
XHC1总线下的21个接口有15个HS01 ~ HS15,6个SSP1 ~ SSP6,这里HS为USB3.0兼容USB2.0的接口,SSP为USB3.0接口(部分电脑代码不同)。由于EHC中已经定义USB2.0,这里忽略掉所有的HS接口(DSDT文件删除所有HS接口),仅保留SSP接口。
四、两种驱动方法
下面开始根据USB接口信息开始定制USB驱动。DSDT中需要将所有EHC1改为EH01,EHC2改为EH02,XHCI改为XHC。
info中对USB接口的定义分别是0、3、255,既USB2.0、USB3.0、特殊端口
方法一:
1、获得USB_Injector.kext
2、修改驱动下USB_Injector.kext—Contents—info.plist文件
将红框中的电脑型号修改成当前型号,确认电脑型号后分别是-EH01,-EH02,-XHC(macOS对USB的识别,与win中EHC1,EHC2,XHCI不同)。
①EH01
ports下保留EHC1中的8个11 ~ 18接口,分别为PR11 ~ PR18,对应DSDT中PR11~PR18。由于13设备是指纹识别器,14是蓝牙,因此UsbConnector定义为255(特殊接口)。摄像头0(USB2.0)即可,部分电脑则需要255(特殊接口),根据情况修改。PR11在部分电脑上会识别成集线器,也需要修改为255(特殊接口),根据情况修改。port-count填入接口数量,每个接口port中的值,如图依次填入。model中填入电脑型号。
②EH02
ports下保留EHC2中的6个11 ~ 16接口,分别为PR11 ~ PR16,对应DSDT中PR11~PR16。由PR11在部分电脑上会识别成集线器,也需要修改为255(特殊接口),根据情况修改。port-count填入接口数量,每个接口port中的值,如图依次填入。model中填入电脑型号。
③XHC
ports下保留XHC1中的6个接口,分别为SSP1 ~ SSP6,对应DSDT中SSP1 ~ SSP6。这里所有接口均为USB3.0,因此UsbConnector为3。
根据情况修改。这里的port-count填入是最大的数,而不是数量,因为HS01 ~ HS15加上SSP1 ~ SSP6总共21个,十六进制为15,即使删除HS01 ~ HS15,USB3.0总线接口数依然还是15,这个数能多不能少,否则会造成接口丢失。每个接口port中的值,如图依次填入。model中填入电脑型号。
3、文件放置对应位置
将修改好的驱动放在EFI—Clover—Kexts下即可,DSDT转换为aml格式,放入EFI—Clover—ACPI—patch下,自动替换OEM中的DSDT。
方法二:
1、获得USBInjectAll.kext
2、修改驱动下USBInjectAll.kext—Contents—info.plist文件
这里需要修改的位置在Configuration下内容,下面的机型可以无视,不影响结果。这里EH01、EH02、HUB1、HUB2为USB2.0,其他为各种主板不同型号的USB3.0。根据AIDA64中获取的信息找到对应的名称修改。
①EH01
ports下保留EH01中的8个11 ~ 18接口,分别为PR11 ~ PR18,由于13设备是指纹识别器,14是蓝牙,因此UsbConnector定义为255(特殊接口)。摄像头0(USB2.0)即可,部分电脑则需要255(特殊接口),根据情况修改。PR11在部分电脑上会识别成集线器,也需要修改为255(特殊接口),根据情况修改。这里的port-count与port都无需修改对所有设备通用。
②EH02
ports下保留EH02中的6个11 ~ 16接口,分别为PR11 ~ PR16。由PR11在部分电脑上会识别成集线器,也需要修改为255(特殊接口),根据情况修改。这里的port-count与port都无需修改对所有设备通用。
③XHC
win下设备管理器的通用串口控制器中查看USB3.0硬件ID,可确定USB3.0为8086_8xxx。
由于我的HS接口为USB3.0兼容USB2.0,而非USB3.0,因此HS的UsbConnector修改0或删除,保留SSP,同时SSP1 ~ SSP6所有接口的UsbConnector修改为3。这里的port-count与port都无需修改对所有设备通用。
需要说明的是,部分电脑使用这个驱动是不需要定义USB3.0即可驱动USB3.0,这就需要删除所有8086项。而部分电脑使用修改过USB的DSDT后也不需要在驱动中再次定义USB3.0,也需要删除所有8086项。因此在修改过8086项后仍然无法驱动USB3.0,可以尝试删除所有8086项。
对于部分设备使用上述驱动,对应设备依然无法驱动的,则需要SSDT-UIAC.dsl来修复
DefinitionBlock ("", "SSDT", 1, "hack", "UIAC", 0)
{
Device(UIAC)
{
Name(_HID, "UIA00000")
// override XHC configuration to have only one port
Name(RMCF, Package()
{
"8086_8xxx", Package()
{
"port-count", Buffer() { 0xa, 0, 0, 0 },
"ports", Package()
{
"SSP1", Package()//这里的SSP1为需要修复的接口
{
"UsbConnector", 3,//3是接口定义
"port", Buffer() { 0xa, 0, 0, 0 },
//{}内为接口ID,SSP1为8086_8xxx中的第16个接口,十进制为16,十六进制则为0xa,以此类推。
}
}
}
})
}
}
3、文件放置对应位置
将修改好的驱动放在EFI—Clover—Kexts下即可。
SSDT-UIAC.dsl转换为aml格式后,放入EFI—Clover—ACPI—patch下,同时config.plist的ACPI—SortedOrder中加入SSDT-UIAC.aml
五、USB调试
在修改好所有驱动后,需要在config.plist中Kernel and Kext Patches——kextstoPatch加入解除USB限制补丁。
Comment: change 15 port limit to 20 in AppleUSBXHCIPCI
Name: AppleUSBXHCIPCI
Find: <83bd8cfe ffff10>
Replace: <83bd8cfe ffff15>
//此补丁仅适用于10.11
Comment: change 15 port limit to 26 in AppleUSBXHCIPCI
Name: AppleUSBXHCIPCI
Find: <83bd8cfe ffff10>
Replace: <83bd8cfe ffff1b>
Comment: USB port limit patch #1 10.15.x modify by DalianSky(credit ydeng)
Name: com.apple.iokit.IOUSBHostFamily
Find: 83FB0F0F
Replace: 83FB3F0F
Comment: USB Port limit patch #2 10.15.x modify by DalianSky
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83F90F0F
Replace: 83F93F0F
//仅适用于10.15
如果没有使用自己修改DSDT,则config.plist中的ACPI—DSDT—Patches需要加入以下补丁:
Comment: Rename EHC1 to EH01
Disabled: NO
Find: <45484331>
Replace: <45483031>
Comment: Rename EHC2 to EH02
Disabled: NO
Find: <45484332>
Replace: <45483032>
Comment:Rename XHC1 to XHC
Disabled: NO
Find: <58484331>
Replace: <584843>
否则就需要将DSDT中的EHC1、EHC2、XHC1(或者是其他类似代码)已经修改为EH01、EH02、XHC。
所有工作完成以后,可以使用U盘对所有接口进行测试,然后使用IORegistryEntry查看是否成功,也可在系统报告中查看USB3.0是否实现5G/s速度。
六、结语
由于手头的机器有限,以上的方法无法将方方面介绍到,仅提供整体思路以及个人经验,方便更好的来定制USB遮盖器。这套定制USB遮盖器的方法结合我之前的所有教程,使我的笔记本在10.12.6版本时实现了几乎所有macOS的功能,但在10.13后由于未知的原因,睡眠唤醒变成了关机。虽然如此,还是很能说明这套方法的可行度,希望能帮助到大家。