0%

Acer 4738G 黑苹果记实

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

VoodooPs2驱动的写法

之后的ExecutablePath和PlistPatch,都是相对于这个路径的。也就是基本上按照原格式写就行了。千万别写错啊,否则OC会卡在那里的。

因为是传统BIOS,U盘的EFI分区直接放进OC引导文件是不能启动系统的。所以需要使用OC提供的Bootinstall工具。打开终端,将Bootinstall.command拖进终端,按照提示,键入U盘的Disk id号。继续按提示操作。
传统Bios引导制作

然后把Bootinstall提供的boot文件复制到U盘的EFI分区(不是里面的EFI文件夹)。
由于是传统Bios引导,OC的配置需要注意一些问题

1
2
3
4
5
NVRAM——>LegacyEnable—>YES
Misc——>Security——>RequireSignature——>NO
Misc——>Security——>RequireVault——>NO
NVRAM——>7C43611……——>csr-active-config——>E7030000
Misc——>Security——>ExposeSensitiveData——>3

这个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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
DefinitionBlock ("", "SSDT", 1, "qingqing", "AR92xx", 0x00000000)
{
External (_SB_.PCI0, DeviceObj)

Scope (\_SB.PCI0)
{
Device (AIRP)
{
Name (_ADR, 0x001C0005)
Device (ARPT)
{
Name (_ADR, Zero)
Name (_SUN, 0x03)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x10)
{
"AAPL,slot-name",
Buffer (0x08)
{
"AirPort"
},

"device-id",
Buffer (0x04)
{
0x2A, 0x00, 0x00, 0x00
},

"compatible",
Buffer (0x0B)
{
"pci168c,2a"
},

"IOName",
Buffer (0x0B)
{
"pci168c,2a"
},

"name",
Buffer (0x28)
{
"Atheros AR5B97 Wireless Network Adapter"
},

"device_type",
Buffer (0x10)
{
"AirPort Extreme"
},

"model",
Buffer (0x28)
{
"Atheros AR5B97 Wireless Network Adapter"
},

"built-in",
Buffer (One)
{
0x01
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}

Method (_STA, 0, NotSerialized)
{
If (_OSI ("Darwin"))
{
Return (0x0F)
}
Else
{
Return (Zero)
}
}
}
}

Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}

If (LEqual (Arg2, One))
{
Return (One)
}
}
}

Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
}
}
}

然后把这个SSDT添加到OpenCore配置中。至此,无线网卡驱动成功。
由于笔记本只安装MacOSX系统,所以直接使用重命名方式来修正ACPI。

  1. GFX0 to IGPU
    1
    2
    find:0x50454750
    0x47465830
  2. EC0 to EC
    1
    2
    find:0x42415431
    Replace: 0x42415430
  3. 强制使用二进制补丁修复0D6D问题,解决供电和睡眠唤醒问题,意外的收获是显卡的功耗降了下来。
    1
    2
    find: 0x0a0d0a03
    Replace: 0x0a0d0a00

12月6日

考虑到OpenCore里可以为设备注入属性,所以再次调整无线网卡驱动方案,只在SSDT里为无线网卡添加设备位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DefinitionBlock ("", "SSDT", 1, "qingqing", "AR92xx", 0x00000000)
{
External (_SB_.PCI0, DeviceObj)
Scope (\_SB.PCI0)
{
Device (AIRP)
{
Name (_ADR, 0x001C0005)
Device (ARPT)
{
Name (_ADR, Zero)
Method (_STA, 0, NotSerialized)
{
If (_OSI ("Darwin"))
{
Return (0x0F)
}
Else
{
Return (Zero)
}
}
}
}
}
}

然后用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的实例进行讲解。
OC属性修复6370M显卡
首先确定显卡的PCI位置,比如我的是这样:_SB.PCI0.P0P2.PEGP
在DeviceProerties的Add下添加如下的设备驱动目录
PciRoot(0x0)/PCi(0x1,0x0)/Pci(0x0,0x0)

  1. device-id (data)
    指定显卡id,对于仿冒特别需要。如果你的显卡id在AMD的显卡驱动里有,device-id属性就不是必须注入项。
  2. @0,name (String)
    指定显示接口的FBName。我的显卡有3个显示接口,LVDS/HDMI/VGA,那我可以写3个,“@0,name”、“@1,name”、“@2,name”。当然只想用一个也行。不管是@几,FBName都是哪一个。
  3. 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
2
3
4
5
6
7
Scope (\_SB.PCI0.P0P2)
{
Method (_STA, 0, NotSerialized)
{
Return (Zero)
}
}

以下是完整的显卡SSDT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
DefinitionBlock ("", "SSDT", 2, "zuoyou", "6370m", 0x00000000)
{
External (_SB_.PCI0, DeviceObj)
External (_SB_.PCI0.P0P2, DeviceObj)

Scope (\_SB.PCI0.P0P2)
{
Method (_STA, 0, NotSerialized) // _STA: Status
{
If (_OSI ("Darwin"))
{
Return (Zero)
}
Else
{
Return (0x0F)
}
}
}

Scope (\_SB.PCI0)
{
Device (PEGT)
{
Name (_ADR, 0x00010000) // _ADR: Address
Name (_SUN, One) // _SUN: Slot User Number
Device (GFX0)
{
Name (_ADR, 0xFFFF) // _ADR: Address
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method
{
Local0 = Package (0x04)
{
"ATY,bin_image",
Buffer (0xF000)
{
0x55, 0xAA, 0x78, 0xE9, 0x35, 0x02... //以下数据略去
},

"hda-gfx",
Buffer (0x0A)
{
"onboard-2"
}
}
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
}
}

Method (DTGP, 5, NotSerialized)
{
If ((Arg0 == ToUUID ("a0b5b7c6-1318-441c-b0c9-fe695eaf949b")))
{
If ((Arg1 == One))
{
If ((Arg2 == Zero))
{
Arg4 = Buffer (One)
{
0x03
}
Return (One)
}

If ((Arg2 == One))
{
Return (One)
}
}
}

Arg4 = Buffer (One)
{
0x00
}
Return (Zero)
}
}
}

至此,此次黑果过程基本完毕。

附上EFI引导文件(传统BIOS的boot引导需要自行制作)
Acer4738G-High Sierra-OpenCore0.5.5