Sukka's Blog

童话只美在真实却从不续写

使用 Hackintool 修复黑苹果 Intel 核显驱动外部显示器紫屏问题

Sukka's Avatar 2020-03-03 黑苹果

  1. 1. 问题分析
  2. 2. 最简单的修复方法
  3. 3. 前提条件
  4. 4. 准备工作
  5. 5. 修复步骤
  6. 6. 收尾工作
  7. 7. 参考资料

安装好黑苹果、打上简单 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,「应用补丁」处点击「应用当前补丁」,确保处于 勾选 状态。

hackintosh-intel-hdmi-fix/1.png
hackintosh-intel-hdmi-fix/2.png

  • 选择顶部选项卡的「应用补丁」,在「信息」这里选择你的平台 ID。一般的,如果之前的缓冲帧补丁已经成功驱动核显了,可以继续使用当前的平台 ID。这里我以 0x59160000 为例,查找平台 ID 可以使用黑果小兵的 Intel 核显 platform ID 整理及 smbios 速查表

hackintosh-intel-hdmi-fix/3.png

  • 点击「接口」查看当前的显示输出。绿色表示「内建」(笔记本也就是内屏)、红色的是「外接」。如果你当前插入了显示器,那么应该有红色的条目。

hackintosh-intel-hdmi-fix/4.png

  • 将显示器插到不同的接口上,根据点亮的红色条目,分别确定实际接口和 HackinTool 中的接口对应关系、使用下拉菜单将错误的接口信息改成正确的:HDMI 和 DVI 接口的「类型」选择「HDMI」、DP 接口选择「DP」。

hackintosh-intel-hdmi-fix/5.png

macOS 限制核显最多只能带三个外部显示接口,分别为 0x050x060x07(你可以点击绿色或红色的条目、查看 HackinTool 下面「显示器」中的详细信息),分别对应表中的索引 123(由于我选的平台 ID 只有两个显示接口、所以图中没有 3)。索引 -1 表示不使用该接口。

一些缓冲帧修复 HDMI 输出的教程,如 tonymacx86 上的 原始教程黑果小兵的教程 其实就是翻译的 tonymacx86 上的那篇教程,远景论坛也有一篇接近机翻的教程翻译。国内的其他教程则是抄的黑果小兵的翻译)都指出 HDMI 只能使用四个总线 ID:0x010x020x040x06。但是实际上,只有 DVI 接口有此总线限制,而 HDMI 除了可以用这四个总线以外,还可以额外使用 0x05 总线,详情见下图:

hackintosh-intel-hdmi-fix/10.jpg

你也可以看到我的 HackinTool 的截图中,我的笔记本只有一个 HDMI 接口、对应的红色条目的总线 ID 是 0x05,但是我的外接屏幕不仅能识别、还能点亮。

  • 在「应用补丁 - 通用」处,补丁类型的单选项选择「设备属性」(即注入 Device Properties 的方式打补丁,这也是目前最常用的缓冲帧补丁、声卡定制的方式),并勾选下图中的那些复选项:

hackintosh-intel-hdmi-fix/6.png

  • 在「应用补丁 - 高级」处、勾选下图中的这些复选项、仿冒图形卡 ID 选择最合适你的 CPU 的(如果你之前打过缓冲帧补丁,这一步你应该很熟悉了。如我的是搭配 Intel UHD Graphics 620 的 Kaby Lake,这里我选择了 Intel HD Graphics 620),接着点击「生成补丁」:

hackintosh-intel-hdmi-fix/7.png

  • 有时候 HackinTool 修改某些选项时会重置接口设置,所以这时候你应该再切回「接口」,检查一遍接口设置是否正确、必要时进行更正。然后返回「应用补丁」、再次点击「生成补丁」。
  • 点击菜单栏的「文件 - 导出 - 引导文件 config.plist」、选择你的 config.plist。HackinTool 会备份原始文件到 config-backup.plist、然后将补丁以不破坏原始文件(差分插入、相同属性覆盖)的方式添加到 config.plist 中。

hackintosh-intel-hdmi-fix/8.png

需要注意的是,HackinTool 是根据你当前使用的引导方式(Clover 还是 OpenCore)来判断你导出的 config.plist 的类型。如果你启动时使用的引导方式和你要打的补丁文件不同、你还需要在 HackinTool 内手动修改你的 config.plist 对应的引导方式:

hackintosh-intel-hdmi-fix/9.png

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,相关教程参见黑果小兵的这两篇 文章/翻译:

参考资料

本文作者 : Sukka
本文采用 CC BY-NC-SA 4.0 许可协议。转载和引用时请注意遵守协议!
本文链接 : https://blog.skk.moe/post/hackintosh-fix-magenta-screen/

本文最后更新于 天前,文中所描述的信息可能已发生改变