前言
微星R7850 Hawk 2GB这块独显,隶属于ATI(现称AMD)的HD 7000系列、型号为7850的Radeon独立显卡。
但显卡OEM厂商微星为了增加卖点,拿着AMD 的7850公版设计图,对自己即将出厂的7850显卡做了修改拓展。比如提高了显卡的基础核心频率、增加了一个或多个视频输出接口(如公版设计中只有一个DisplayPort,到微星手里直接把这个仅有的DisplayPort去掉,换成了两个Mini DisplayPort以支持更多的屏幕输出显示)。
而苹果当年在自己的电脑中,也同样使用过ATI(现称AMD)显卡。于是系统中就需要配置显卡的配置文件、驱动文件等来驱动对应型号的显卡正常输出图像。当然苹果不会过分对自己的显卡进行大修大改,起码不会像微星那样。大多都是按照AMD设计的公版来生产,所以在系统内的配置文件中,大多都是按照公版的显卡进行定义的,如视频输出接口的数量、有哪些种类和接口顺序等。
所以使用除苹果定制HD 7850核心的显卡之外的显卡且不需要注入任何参数直接在黑苹果系统上运行的,必须是基本和AMD公版设计差不了多少的,尤其是视频输出接口定义。但是OEM厂商对显卡的定制五花八门,不可能完全按照AMD的公版设计来,所以有很少一部分的HD 7850显卡可以不注入参数直接运行,但大多数都需要注入参数。
如果你使用的显卡和苹果系统内的显卡信息定义不同,尤其是视频输出接口定义不同,就会导致你显卡上的某些视频输出接口信号输出花屏、白屏、无信号、死机等问题。
能解决何问题
- 微星R7850 Hawk 2GB独显安装macOS 10.13.6、macOS 10.14.6黑苹果系统顺利安装并进入桌面,不卡代码、报五国等错误。
- 微星R7850 Hawk 2GB独显在macOS 10.13.6、macOS 10.14.6黑苹果系统下第二个Mini DisplayPort视频输出接口和DVI-D视频输出接口图像输出异常的问题。
- 微星R7850 Hawk 2GB独显在macOS 10.13.6、macOS 10.14.6黑苹果系统下驱动成功,系统“关于”中显示完整的独显名称和显存大小,完美驱动独显,开启毛玻璃特效
准备
硬件
- 一台已安装Windows操作系统且已连接微星R7850 Hawk 2GB显卡的电脑。
用于在Windows操作系统下读取显卡信息、导出显卡的VBIOS文件。
使用台式电脑可以直接将此显卡插在主板的PCIe Gen3 x16接口上,而若为笔记本电脑且具有PCIe协议的M.2 for Storage插槽,想要连接此显卡的话,则需要先安装完Windows操作系统后,使用CYID独显扩展卡与笔记本电脑的M.2插槽相接实现外接显示,从而能够顺利读取显卡信息,导出VBIOS文件。
软件
- 在其内已安装了任意版本黑苹果操作系统的VirtualBox虚拟机,且能正常运行。
用于在黑苹果操作系统上运行特定的软件、执行特定的命令来解析显卡VBIOS数据。
2. GPU-Z软件。
在Windows系统下运行。用于读取显卡信息、导出显卡的VBIOS文件。
3. “redsock_bios_decoder”文件和“radeon_bios_decode”文件。
将在黑苹果操作系统下使用它们。用于解析显卡VBIOS文件。
4. AMD FrameBuffer Utility软件。
在黑苹果操作系统下运行。用于解析显卡的VBIOS文件。
5. Clover Configurator软件。
在黑苹果操作系统下运行。用于读取和编辑黑苹果EFI引导文件(主要是config.plist文件)。
开始
- 在Windows操作系统下,运行GPU-Z软件。点击下图所示的按钮,将显卡的VBIOS文件另存为到其他位置备用。
2. 在VirtualBox虚拟机中安装并运行任意版本的懒人版黑苹果操作系统。
3. 在黑苹果操作系统的任意位置创建一个目录,将“redsock_bios_decoder”和导出的以.rom为文件后缀名的显卡VBIOS文件放在同一目录下,执行以下命令来得到一个redsock.txt文本文件:
./redsock_bios_decoder < [使用GPU-Z导出的显卡VBIOS文件名].rom > redsock.txt
4. 打开redsock.txt,内容如下:
V27313S.BIN :
113-MSITV273MS.1C0
PITCAIRN PRO A1 GDDR5 64MX32 HYNIX 2GB
Subsystem Vendor ID: 1462
Subsystem ID: 2732
Object Header Structure Size: 360
Connector Object Table Offset: 48
Router Object Table Offset: 0
Encoder Object Table Offset: fd
Display Path Table Offset: 12
Connector Object Id [19] which is [DISPLAY_PORT]
encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x12 [duallink 0x2] enc 0x4)] linkb: false
Connector Object Id [19] which is [DISPLAY_PORT]
encoder obj id [0x21] which is [INTERNAL_UNIPHY2 (osx txmit 0x22 [duallink 0x2] enc 0x5)] linkb: true
Connector Object Id [12] which is [HDMI_TYPE_A]
encoder obj id [0x20] which is [INTERNAL_UNIPHY1 (osx txmit 0x11 [duallink 0x1] enc 0x2)] linkb: false
Connector Object Id [2] which is [DVI_I]
encoder obj id [0x1e] which is [INTERNAL_UNIPHY (osx txmit 0x10 [duallink 0x0] enc 0x0)] linkb: false
Connector Object Id [2] which is [DVI_I]
encoder obj id [0x15] which is [INTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false
从内容中可以看到:
- 微星R7850 Hawk 2GB显卡一共有5个视频输出端口定义,分别是两个DisplayPort、一个HDMI(Type A)和两个DVI-I接口。
- 每个的视频输出端口中,已经提供了“txmit”和“enc”两项值。
- “txmit”的值已使用红色标出,“enc”的值已使用绿色标出。
5. 目前还缺少一项值“senseid”,从VBIOS文件中解析此值,需要通过“radeon_bios_decode”文件。
将“radeon_bios_decode”文件和导出的以.rom为文件后缀名的显卡VBIOS文件放在同一目录下,执行以下命令来得到一个connector.txt文本文件:
./redsock_bios_ decode < [使用GPU-Z导出的显卡VBIOS文件名].rom > connector.txt
6. 打开connector.txt,内容如下:
ATOM BIOS Rom:
SubsystemVendorID: 0x1462 SubsystemID: 0x2732
IOBaseAddress: 0x0000
Filename: V27313S.BIN
BIOS Bootup Message: 113-MSITV273MS.1C0
PITCAIRN PRO A1 GDDR5 64MX32 HYNIX 2GB
PCI ID: 1002:6819
Connector at index 0
Type [@offset 44906]: DisplayPort (10)
Encoder [@offset 44910]: INTERNAL_UNIPHY2 (0x21)
i2cid [@offset 45016]: 0x90, OSX senseid: 0x1
Connector at index 1
Type [@offset 44916]: DisplayPort (10)
Encoder [@offset 44920]: INTERNAL_UNIPHY2 (0x21)
i2cid [@offset 45043]: 0x91, OSX senseid: 0x2
Connector at index 2
Type [@offset 44926]: HDMI-A (11)
Encoder [@offset 44930]: INTERNAL_UNIPHY1 (0x20)
i2cid [@offset 45070]: 0x92, OSX senseid: 0x3
Connector at index 3
Type [@offset 44936]: DVI-I (2)
Encoder [@offset 44940]: INTERNAL_UNIPHY (0x1e)
i2cid [@offset 45107]: 0x95, OSX senseid: 0x6
Connector at index 4
Type [@offset 44946]: DVI-I (2)
Encoder [@offset 44950]: INTERNAL_KLDSCP_DAC1 (0x15)
i2cid [@offset 45107]: 0x95, OSX senseid: 0x6
从内容中可以看到:
- 微星R7850 Hawk 2GB显卡一共有5个视频输出端口定义,分别是两个DisplayPort、一个HDMI(Type A)和两个DVI-I接口。
- 每个的视频输出端口中,已经提供了senseid”的值。
- “senseid”的值已使用蓝色标出。
7. 综上,可整理出针对微星R7850 Hawk 2GB显卡的视频输出接口代码定义:
视频输出接口类型 | txmit | enc/encd | senseid |
DisplayPort | 12 | 04 | 01 |
DisplayPort | 22 | 05 | 02 |
HDMI(Type A) | 11 | 02 | 03 |
DVI-I | 10 | 00 | 06 |
DVI-I | 00 | 10 | 06
|
8. 在黑苹果操作系统中运行AMD FrameBuffer Utility软件,并打开以.rom为文件后缀名的显卡VBIOS文件, 会显示如下图所示的显卡信息。
将界面一分为二,左边的部分显示的是你当前显卡核心(微星R7850 Hawk 2GB显卡的核心代号为Futomaki)对应公版显卡的视频输出口端口定义原始值,而右边部分显示的是你当前显卡(微星R7850 Hawk 2GB显卡)的信息。
9. 将绿色方框内公版显卡对应的的四行视频输出端口原始值,复制到文本编辑器内。
完整内容如下:
000400000403000000010101000000001204040100000000
000400000403000000010201000000002205050200000000
040000001402000000010300000000000000060600000000
000800000402000000010400000000001102010300000000
10. 可以观察到每行倒数8位的值都为0,现在将其删掉。
修改后的内容如下:
0004000004030000000101010000000012040401
0004000004030000000102010000000022050502
0400000014020000000103000000000000000606
0008000004020000000104000000000011020103
11. 根据macOS操作系统的相关定义,将上述公版显卡对应的的四行视频输出端口原始值,依次进行位拆分,有以下含义:
视频输出接口类型码 | 其他无关代码,不做分析 | txmit | encd | 视频输出时端口的显示顺序 | senseid |
0004 | 0000040300000001010100000000 | 12 | 04 | 04 | 01 |
0004 | 0000040300000001020100000000 | 22 | 05 | 05 | 02 |
0400 | 0000140200000001030000000000 | 00 | 00 | 06 | 06 |
0008 | 0000040200000001040000000000 | 11 | 02 | 01 | 03 |
12. 根据macOS操作系统的相关定义,对于不同的视频输出接口类型码,有以下区分:
视频输出接口类型 | 视频输出接口类型码 |
LVDS | 0200 |
DisplayPort/Mini DisplayPort | 0400 |
DVI | 0002 |
DVI-I | 0400 |
HDMI(Type A) | 0008 |
S-Video(S端子) | 8000 |
VGA | 1000 |
13. 那么,在第7步骤中,已经整理出了针对微星R7850 Hawk 2GB显卡的视频输出接口代码定义。
此时需要以公版显卡对应的的四行视频输出端口原始值为基准,结合针对微星R7850 Hawk 2GB显卡的视频输出接口代码定义,在其基础上做修改,以达到欺骗黑苹果操作系统的目的,让黑苹果操作系统误以为微星R7850 Hawk 2GB显卡就是公版显卡,来实现正常的音频输出和图像显示。
在这里重新贴一下两个表格。
表格1:公版显卡对应的的四行视频输出端口原始值 | ||||||
行号 列号 | A | B | C | D | E | F |
视频输出接口类型码 | 其他无关代码,不做分析 | txmit | encd | 视频输出时端口的显示顺序 | senseid | |
G | 0004 | 0000040300000001010100000000 | 12 | 04 | 04 | 01 |
H | 0004 | 0000040300000001020100000000 | 22 | 05 | 05 | 02 |
I | 0400 | 0000140200000001030000000000 | 00 | 00 | 06 | 06 |
J | 0008 | 0000040200000001040000000000 | 11 | 02 | 01 | 03 |
表格2:针对微星R7850 Hawk 2GB显卡的视频输出接口代码定义 | ||||
行号 列号 | K | L | M | N |
视频输出接口类型 | txmit | enc/encd | senseid | |
O | DisplayPort | 12 | 04 | 01 |
P | DisplayPort | 22 | 05 | 02 |
Q | HDMI(Type A) | 11 | 02 | 03 |
R | DVI-I | 10 | 00 | 06 |
S | DVI-I | 00 | 10 | 06 |
结合表格2,逐步分析表格1中的值哪些要修改,哪些不用修改:
- 表格1中,位置(A,G)值为0004,表示此视频输出接口是DisplayPort。
位置(C,G),值为12。此时对应表格2中列K为“DisplayPort”的,有行O和行P。继续返回表格1,观察行G,位置(C,G)的值和表格2中位置(L,O)的一致,位置(D,G)的值和表格2中位置(M,O)的一致,位置(F,G)的值和 表格中位置(N,O)的一致,所以表格1中行G对应表格2中的行O。
综上,行G数据都正确,不需要修改任何位置的值。
- 表格1中,位置(A,H),值同样为0004,分析过程和上述一致。但这里给出一个定义:
在表格1中的列E中,可填写的值范围为01~正无穷,且数字越小,对应的视频输出端口显示优先级越大,越优先显示。又由于原始值只有四行,即可填写的值范围为01~04。
综上,行H需要修改:
位置(E,H):将值05改为03。
- 表格1中,位置(A,I),值为0400。此时对应表格2中列K为“DVI-I”的,有行R和行S。继续返回表格1,观察行I,位置(D,I)的值和表格2中位置(M,R)的一致,位置(F,I)的值和 表格中位置(N,R)的一致。只有位置(C,I)的值和表格2中位置(L,R)的不一致,分别为00和10。
综上,行I需要修改:
位置(C,I):将值00改为10。
位置(E,I):将值06改为02。
这里会问了,表格2中的行R和S的视频输出接口类型都是DVI-I,为什么不以行S的为准,把表格1中位置(D,I)的值00修改为表格2中位置(M,S)的值10?
观察第4或6步骤的日志内容可发现,最后一个DVI-D后的日志内容中显示“INTERNAL_KLDSCP_DAC1”的字样,表示它不是真正作为视频输出的物理端口,所以不以表格2中的行S为准。
表格1中,位置(A,J),值为0008。此时对应表格2中列K为“HDMI(Type A)”的,只有行Q。继续返回表格1,观察行J,位置(C,J)的值和表格2中位置(L,Q)的一致,位置(D,J)的值和表格2中位置(M,Q)的一致,位置(F,J)的值和 表格中位置(N,Q)的一致,所以表格1中行J对应表格2中的行Q。
综上,行G数据都正确,不需要修改任何位置的值。
14. 所以,表格1修改后,前后数据变化如下:
表格1:公版显卡对应的的四行视频输出端口原始值 | ||||||
行号 列号 | A | B | C | D | E | F |
视频输出接口类型码 | 其他无关代码,不做分析 | txmit | encd | 视频输出时端口的显示顺序 | senseid | |
G | 0004 | 0000040300000001010100000000 | 12 | 04 | 04 | 01 |
H | 0004 | 0000040300000001020100000000 | 22 | 05 | 05 -> 03 | 02 |
I | 0400 | 0000140200000001030000000000 | 00 -> 10 | 00 | 06 -> 02 | 06 |
J | 0008 | 0000040200000001040000000000 | 11 | 02 | 01 | 03 |
15. 将上述表格中每一行的值都复制到文本编辑器内,并在每行后补充8位0值,并整合成一行(共192个字符)。此值即为“ATIConnectorPatch”中要填入修改后的值。
完整值如下:
000400000403000000010101000000001204040100000000000400000403000000010201000000002205030200000000040000001402000000010300000000001000020600000000000800000402000000010400000000001102010300000000
折腾心得
- 折腾成功的背后,是对电脑无数次的强制重启、无数次的对显卡断电换来的。折腾黑苹果蛮伤机器的。
- 使用在Mojave上折腾成功的参数,去Catalina上尝试,始终未成功过。Catalina在Mojave的基础上又删除了大量老旧的显卡定义,同时修改了部分显卡的定义,所以导致很多在Mojave上运行良好的黑苹果,迁移到Catalina上却不好使了。
参考链接
- ATI Radeon HD 7850修改FB完美驱动 https://www.memacx.com/thread-6665-1-1.html