OpenCore是最近兴起的在PC机上引导MacOS系统的新程序。在非常顺利地引导了ASUS_Z370-P +8700k+Vega56台式机之后,开始折腾ACER4738G,这笔记本已经老掉牙了,i380m的CPU,ATI 6370M显卡。运行的系统是MacOS10.13.6。
11月24日
除了将FakeSMC.kext替换成VirtualSMC.kext之外,其他驱动一概平移到OC中。
本次使用特意用了个U盘做OC引导,选用了SampleFull.plist作为Config.plist的模版。
第一步,就是按照模版补全SMBIOS信息,不是一般的费时间。
第二步,编辑efi文件和Kext驱动的信息,这里要注意的是VoodooPS2Controller.kext这个驱动套件,它的Plugins里还有三个驱动,我们就需要再添加三项,并注意在绑定驱动路径时,BundlePath这一项直接写全路径,比如这样写:
1 | VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Keyboard.kext |
之后的ExecutablePath和PlistPatch,都是相对于这个路径的。也就是基本上按照原格式写就行了。千万别写错啊,否则OC会卡在那里的。
因为是传统BIOS,U盘的EFI分区直接放进OC引导文件是不能启动系统的。所以需要使用OC提供的Bootinstall工具。打开终端,将Bootinstall.command拖进终端,按照提示,键入U盘的Disk id号。继续按提示操作。
然后把Bootinstall提供的boot文件复制到U盘的EFI分区(不是里面的EFI文件夹)。
由于是传统Bios引导,OC的配置需要注意一些问题
1 | NVRAM——>LegacyEnable—>YES |
这个OC版本比较老了,新版本的RequireVault改成了Vault要这样填:
1 | Misc——>Security——>Vault——>Optional |
其他的设置请自行学习,本文不是OpenCore教程。
至此,可以进入系统,并能对付使用了。
剩下一个最大的问题就是6370M显卡驱动问题,Clover里有专门的ATIConnectors配置选项,OC里没有。另一个问题是无线网卡。
11月28日
驱动无线网卡,去掉笨重的DSDT。
同时,此网卡设备并没有体现在机器的ACPI中,dsdt中唯独缺少0x001c0005这个硬件位置,但是用其他工具能找到这个硬件位置,并且系统识别无线网卡的设备ID为PCI68c,2e。苹果无线网卡驱动中没有pci168c,2e这个ID,所以必须仿冒为pci168c,2a。
原来的做法是在DSDT中添加这个设备,不过用了OC,觉得加载DSDT有点说不过去,所以做了个无线网卡的SSDT。
1 | DefinitionBlock ("", "SSDT", 1, "qingqing", "AR92xx", 0x00000000) |
然后把这个SSDT添加到OpenCore配置中。至此,无线网卡驱动成功。
由于笔记本只安装MacOSX系统,所以直接使用重命名方式来修正ACPI。
- GFX0 to IGPU
1
2find:0x50454750
0x47465830 - EC0 to EC
1
2find:0x42415431
Replace: 0x42415430 - 强制使用二进制补丁修复0D6D问题,解决供电和睡眠唤醒问题,意外的收获是显卡的功耗降了下来。
1
2find: 0x0a0d0a03
Replace: 0x0a0d0a00
12月6日
考虑到OpenCore里可以为设备注入属性,所以再次调整无线网卡驱动方案,只在SSDT里为无线网卡添加设备位置。
1 | DefinitionBlock ("", "SSDT", 1, "qingqing", "AR92xx", 0x00000000) |
然后用OC注入属性。
12月22日
从使用OpenCore开始就一直为AMD Radeon HD 6370M显卡的驱动方法所困扰。在Clover时代,AMD显卡的驱动方式大致是这样几种:
InjectATI,让Clover检测并注入显卡信息,也可以使用SSDT注入。
LoadVBios,载入AMD显卡rom。所有正确驱动的AMD显卡都会载入VBios,但是有些无法自动载入的,就需要强制注入VBios数据。
ATIConnectorsDataPatch,修复AMD显卡的显示接口的缓冲帧数据,指定FBName。
这几种方式有时需要联合使用。但是如果厘清了显卡的驱动机制,在OpenCore下只需要用设备属性注入或SSDT两种方式之一就可搞定。
一、通过OC的DeviceProerties设备属性注入修复AMD显卡。
这种方式基本上抛弃了DSDT的修补和SSDT的使用。下面结合AMD6370M的实例进行讲解。
首先确定显卡的PCI位置,比如我的是这样:_SB.PCI0.P0P2.PEGP
在DeviceProerties的Add下添加如下的设备驱动目录PciRoot(0x0)/PCi(0x1,0x0)/Pci(0x0,0x0)
- device-id (data)
指定显卡id,对于仿冒特别需要。如果你的显卡id在AMD的显卡驱动里有,device-id属性就不是必须注入项。 - @0,name (String)
指定显示接口的FBName。我的显卡有3个显示接口,LVDS/HDMI/VGA,那我可以写3个,“@0,name”、“@1,name”、“@2,name”。当然只想用一个也行。不管是@几,FBName都是哪一个。 - ATY,bin_image
这一项相当于CLover里的LoadVBios,就是载入显卡rom。非必须,但是能解决特殊问题。
成功驱动的显卡,都会载入ATY,bin_image数据的。
个别型号的笔记本会出现VBios载入不进来的情况,那就只有强行注入了VBios数据了。
ATY,bin_image 和显卡的rom 数据还是有些不一样的。不过没用在意,系统会处理的。
二、使用SSDT驱动显卡的方法。
使用SSDT驱动Acer 4738G的6370M显卡,遇到的最大问题是,系统会直接加载显卡信息,导致VBIOS加载不进来。
问题的根源在于,ACPI中的PEGP存在Name (_ADR, 0xFFFF),使用SSDT驱动显卡需要屏蔽掉ACPI中的PEGP方法,让其变成Name (_ADR, Zero)。
另外一个问题是,即使屏蔽了PEGP,还有VGA也存在Name (_ADR, 0xFFFF),因为在_SB.PCI0.P0P2这个路径下,同时存在PEGP和VGA。没了PEGP,系统初始化的时候会去找VGA。
所以彻底解决的办法是直接屏蔽掉P0P2。
那么我们就可以做如下的屏蔽P0P2的SSDT来屏蔽掉P0P2。
1 | Scope (\_SB.PCI0.P0P2) |
以下是完整的显卡SSDT
1 | DefinitionBlock ("", "SSDT", 2, "zuoyou", "6370m", 0x00000000) |
至此,此次黑果过程基本完毕。
附上EFI引导文件(传统BIOS的boot引导需要自行制作)
Acer4738G-High Sierra-OpenCore0.5.5