使用 Hackintool 修复黑苹果 Intel 核显驱动外部显示器紫屏问题
安装好黑苹果、打上简单 FrameBuffer(缓冲帧)补丁以后,笔记本的内屏等内建显示器应该已经可以正常驱动了,但是使用 HDMI 等外部显示接口输出的屏幕的色调出现发紫问题,这时候需要修补 EDID 或在缓冲帧补丁中定制输出接口。
问题分析
既然外部显示器能点亮,至少说明核显已经被正常驱动、而且 HDMI 等外部显示接口也是核显驱动的。因此省下了不少麻烦(有的笔记本外部显示接口是独显驱动、核显仅驱动内屏,需要驱动双显卡)。
macOS 处理外接显示屏向来有一些奇怪的问题。以我的显示器为例,插上 HDMI 时显示器提示的输入信号并不是 HDMI,而是 DVI。这导致 macOS 将外接显示屏认为是电视机、并尝试使用 YCbCr
颜色空间而不是 RGB
颜色空间,从而导致紫屏。
最简单的修复方法
通过生成一个 EDID 强制 macOS 使用 RGB 颜色空间是最简单的解决方法。
下载这个 Ruby 脚本 并在终端里执行,会在你的 HOME
目录内生成一个 DeviceVendorID-xxxx
的文件夹,将这个文件夹复制到 /System/Library/Displays/Contents/Resources/Overrides/
中即可。如果提示已经存在同名文件需要覆盖,务必中止复制,备份原始文件夹再覆盖。复制成功后,重启即可。
当然强制使用 RGB 通道并非解决了所有的问题(比如我的显示器接上 HDMI 后提示 DVI 的问题并没有通过修补 EDID 得到解决)。一劳永逸的办法是定制显示接口、重做缓冲帧补丁。
前提条件
重做缓冲帧补丁、修复信号输出类型的前提是,你当前的核显已经可以正常驱动(核显驱动的一个特征是显存 1536MB、2048MB 或 3072MB,而不是 7MB)。如果你的核显尚未驱动,务必先按照「使用 WhateverGreen 驱动 Intel 核显 | 醉渔小站」中介绍的方法驱动核显。
如果你的核显已经成功驱动、但是外部屏幕不能点亮(黑屏、无信号),也可以尝试按照本文定制外部显示接口。
准备工作
既然是重做缓冲帧补丁,那么准备工作是一样的:Lilu 和 WhateverGreen 自然是必备的,使用的工具还是 HackinTool(本文将使用目前最新版的 HackinTool 3.2.4 版本进行演示)。建议参考「使用 WhateverGreen 驱动 Intel 核显 | 醉渔小站」这篇文章的「准备工作」章节自查 Clover 的相关设置(如 Inject ATI、Inject Intel 等)是否已经禁用、过时 kext 驱动(如 IntelGraphicsFixup 、IntelGraphicsDVMTFixup)是否已经删除。
修复步骤
- 不论做什么,都建议备份一份 EFI。我的建议是复制一份 EFI 到 U 盘里,接下来的操作只修改 U 盘里的 EFI,重启时选择从 U 盘引导。这样如果你搞砸了、可以拔掉 U 盘重启(硬盘里的 EFI 是正常的)。而且进系统以后再插上 U 盘可以直接挂载 U 盘的 EFI 分区、而硬盘里的 EFI 分区还要手动输密码挂载。等 U 盘里的 EFI 修改好能用以后,再把 U 盘里的 EFI 复制到硬盘里。
- 将显示器接上电脑,并确保显示器被电脑成功识别(屏幕显示内容即可)
- 运行 HackinTool,在菜单栏「缓冲帧」处选择 macOS 10.14,「应用补丁」处点击「应用当前补丁」,确保处于 勾选 状态。
- 选择顶部选项卡的「应用补丁」,在「信息」这里选择你的平台 ID。一般的,如果之前的缓冲帧补丁已经成功驱动核显了,可以继续使用当前的平台 ID。这里我以
0x59160000
为例,查找平台 ID 可以使用黑果小兵的 Intel 核显 platform ID 整理及 smbios 速查表。
- 点击「接口」查看当前的显示输出。绿色表示「内建」(笔记本也就是内屏)、红色的是「外接」。如果你当前插入了显示器,那么应该有红色的条目。
- 将显示器插到不同的接口上,根据点亮的红色条目,分别确定实际接口和 HackinTool 中的接口对应关系、使用下拉菜单将错误的接口信息改成正确的:HDMI 和 DVI 接口的「类型」选择「HDMI」、DP 接口选择「DP」。
macOS 限制核显最多只能带三个外部显示接口,分别为
0x05
、0x06
和0x07
(你可以点击绿色或红色的条目、查看 HackinTool 下面「显示器」中的详细信息),分别对应表中的索引1
、2
和3
(由于我选的平台 ID 只有两个显示接口、所以图中没有3
)。索引-1
表示不使用该接口。一些缓冲帧修复 HDMI 输出的教程,如 tonymacx86 上的 原始教程(黑果小兵的教程 其实就是翻译的 tonymacx86 上的那篇教程,远景论坛也有一篇接近机翻的教程翻译。国内的其他教程则是抄的黑果小兵的翻译)都指出 HDMI 只能使用四个总线 ID:
0x01
、0x02
、0x04
、0x06
。但是实际上,只有 DVI 接口有此总线限制,而 HDMI 除了可以用这四个总线以外,还可以额外使用0x05
总线,详情见下图:你也可以看到我的 HackinTool 的截图中,我的笔记本只有一个 HDMI 接口、对应的红色条目的总线 ID 是
0x05
,但是我的外接屏幕不仅能识别、还能点亮。
- 在「应用补丁 - 通用」处,补丁类型的单选项选择「设备属性」(即注入
Device Properties
的方式打补丁,这也是目前最常用的缓冲帧补丁、声卡定制的方式),并勾选下图中的那些复选项:
- 在「应用补丁 - 高级」处、勾选下图中的这些复选项、仿冒图形卡 ID 选择最合适你的 CPU 的(如果你之前打过缓冲帧补丁,这一步你应该很熟悉了。如我的是搭配 Intel UHD Graphics 620 的 Kaby Lake,这里我选择了 Intel HD Graphics 620),接着点击「生成补丁」:
- 有时候 HackinTool 修改某些选项时会重置接口设置,所以这时候你应该再切回「接口」,检查一遍接口设置是否正确、必要时进行更正。然后返回「应用补丁」、再次点击「生成补丁」。
- 点击菜单栏的「文件 - 导出 - 引导文件 config.plist」、选择你的
config.plist
。HackinTool 会备份原始文件到config-backup.plist
、然后将补丁以不破坏原始文件(差分插入、相同属性覆盖)的方式添加到config.plist
中。
需要注意的是,HackinTool 是根据你当前使用的引导方式(Clover 还是 OpenCore)来判断你导出的
config.plist
的类型。如果你启动时使用的引导方式和你要打的补丁文件不同、你还需要在 HackinTool 内手动修改你的config.plist
对应的引导方式:Clover 和 OpenCore 注入设备属性的方式是不一样的,所以如果你是从 Clover 启动、在给 OpenCore 打补丁时一定要注意!
- 接下来你就可以重启、使用打了新缓冲帧补丁的
config.plist
引导了。如果你的显示器提示的信号类型和实际外部显示接口类型仍然不符、或者显示接口直接黑屏了(没信号输出或输出信号类型不匹配),那就修改总线 ID 和索引、重新做缓冲帧补丁。
收尾工作
我的显示器在重做了缓冲帧补丁、定制了接口数据以后就恢复了正常。但是对于有的显示器,即使修复了输出信号类型,但是外部显示接口输出的画面仍然是呈现紫色,那么也只能注入 EDID 了。这里推荐 xzhih 的 one-key-hidpi 脚本,除了可以开启 HiDPI 设置、还内置了一键注入 LG 显示屏 和 Pro Display XDR 的 EDID(需要在运行脚本时选择带「EDID」的选项)。除了 one-key-hidpi、前文提到的强制 RGB 空间的 EDID 修补脚本两种方法以外,还可以使用 DarwinDumper + FixEDID 或使用 HackinTool 注入 EDID,相关教程参见黑果小兵的这两篇 文章/翻译:
- 使用 HIDPI 解决睡眠唤醒黑屏、花屏及连接外部显示器的正确姿势 | 黑果小兵的部落阁
- Hackintool (原 Intel FB-Patcher) 使用教程及插入姿势 | 黑果小兵的部落阁 中的「显示器 EDID 修补」章节
参考资料
- General Framebuffer Patching Guide (HDMI Black Screen Problem) - tonymacx86 的 HDMI 黑屏修复教程,黑果小兵的教程就是翻译的这篇。
- Force RGB mode in Mac OS X to fix the picture quality of an external monitor - 一篇关于白苹果外接显示器偏紫色的博客,文中的解决方案就是注入强制使用 RGB 颜色空间的 EDID。
- 更新完mojave之後,外接螢幕出現異常... - Mobile01 - 台湾 Mobile01 论坛上关于白苹果外接显示器偏紫的帖子,iMac、MacBook Pro 都不能幸免。
- 在 macOS / Hackintosh 接上 LED 電視螢幕產生單色屏修復 Purple / Magenta 屏幕 - 前文中提到的 Ruby 脚本就是在这篇文章里发现的。