黑苹果的安装与配置

本文以 macOS Mojave 为例进行说明,包含内容较多,主要适合较新主板的安装。

记录硬件配置

在 Windows 下,右键点击此电脑,选择管理-设备管理器,得到设备清单。在某设备上点击属性-详细信息,在属性下拉栏选择硬件 ID,记录下 VID 和 PID。VID 即 Vendor ID,指供应商 ID,在 Windows 下以VID_显示。PID 即 Device ID,指设备 ID,在 Windows 下以PID_显示。

可通过以下链接查询设备名称与 PID 的关系。

1
2
3
4
5
6
7
8
# Intel
http://pci-ids.ucw.cz/read/PC/8086

# AMD
http://pci-ids.ucw.cz/read/PC/1022

# Nvidia
http://pci-ids.ucw.cz/read/PC/10de

Mac 对 Intel CPU 基本兼容,对 AMD CPU 需要进一步处理。本教程仅讨论 Intel CPU 的情况。

对于笔记本,主要记录显卡、声卡、网卡、键盘、触控板和蓝牙的型号。以本机为例,型号为华硕 FL8000U,硬件基本信息如下。需要注意的是,BIOS 类型应为 UEFI。

型号 Device ID Vendor ID
CPU Intel Core i7-8550U(Kaby-Lake) / /
核心显卡 Intel UHD Graphics 620 5917 8086
独立显卡 NVIDIA GeForce 940MX 134D 10DE
声卡 Realtek ALC 294 0294 10EC
有线网卡 Realtek RTL8111 / /
无线网卡 Atheros AR9565 0036 168C
键盘 PS2键盘 / /
触摸板 I2C触摸板 / /
蓝牙 Atheros Bluetooth 4.0 3018 04CA

硬盘分区

由于 macOS 只能以 EFI 方式引导,因此需确保分区表为 GPT 格式。

可在 Windows 下打开 DiskGenius,确认分区表为 GUID 格式,若不是,则在硬盘上单击右键,选择转换分区表类型为 GUID 格式

确保硬盘有一个 200-300M 的 EFI 分区,若没有则需要新建,一般新建到硬盘最前部。提前备份 EFI 内的文件至 U 盘,防止安装 Mac 时引导丢失。为 Mac 的安装划出 50G 以上的分区,格式化为 APFS。

若用 Mac 进行格式化,则格式化为 GUID 分区表时会自动生成一个 200MB 的 EFI 分区。

引导器下载

黑苹果需要特殊的引导器进行引导。此处使用 Clover,链接如下。

1
2
3
4
5
6
7
# 普通版
https://github.com/Dids/clover-builder/releases
https://sourceforge.net/projects/cloverefiboot/

# 特别版
https://github.com/chris1111/CloverBootloader/releases
https://drive.google.com/drive/folders/0B661P9Kp9bPAdUViMVFYRW9KWFE

建议下载 pkg 或 ISO 版本,其中对于 ISO 版本,可用解压软件打开,提取 Clover 启动所需要的完整 EFI 文件夹,以便于后续安装。该文件夹的目录层级如下。

1
2
3
4
5
6
7
8
└── EFI
├── Boot
└── CLOVER
├── ACPI
├── drivers
├── ...
├── CLOVERX64.efi
└── config.plist

安装盘制作

此处以 Majove 10.14.3 为例。插入容量大于 8G 的 U 盘,提前备份好 U 盘资料。以下方式选其一即可。

黑果小兵

通过以下链接下载,镜像带引导。

1
https://blog.daliansky.net/categories/%E4%B8%8B%E8%BD%BD/%E9%95%9C%E5%83%8F/

若为 Windows,且下载的镜像为带引导的 dmg 格式,则以管理员身份打开 TransMac,在插入的 U 盘上点击右键,选择 Restore with Disk Image,点击 Yes 以抹掉资料,选择 dmg 镜像,等待写入完成。也可通过 Etcher 完成以上操作。

由于黑果小兵的安装盘已带引导器,故可以直接进行安装步骤。

macrecovery

注意,该方法只可获取恢复分区,安装系统时需要互联网连接。

以 Windows 为例,下载 OpenCore,链接如下。

1
https://github.com/acidanthera/OpenCorePkg

解压后打开命令提示符,路径切换到解压文件夹内的Utilities/macrecovery,然后通过以下命令进行下载。

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
# Lion
python macrecovery.py -b Mac-2E6FAB96566FE58C -m 00000000000F25Y00 download
python macrecovery.py -b Mac-C3EC7CD22292981F -m 00000000000F0HM00 download

# Mountain Lion
python macrecovery.py -b Mac-7DF2A3B5E5D671ED -m 00000000000F65100 download

# Mavericks
python macrecovery.py -b Mac-F60DEB81FF30ACF6 -m 00000000000FNN100 download

# Yosemite
python macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVW00 download

# El Capitan
python macrecovery.py -b Mac-FFE5EF870D7BA81A -m 00000000000GQRX00 download

# Sierra
python macrecovery.py -b Mac-77F17D7DA9285301 -m 00000000000J0DX00 download

# High Sierra
python macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000J80300 download
python macrecovery.py -b Mac-BE088AF8C5EB4FA2 -m 00000000000J80300 download

# Mojave
python macrecovery.py -b Mac-7BA5B2DFE22DDD8C -m 00000000000KXPG00 download

# Catalina
python macrecovery.py -b Mac-00BE6ED71E35EB86 -m 00000000000000000 download

# Big Sur
python macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 download

完成后将USB格式化为GUID分区表下的FAT32。在USB根目录新建文件夹,名称为com.apple.recovery.boot,并将下载好的BaseSystem/RecoveryImage文件放入文件夹内。

下载完成后将获得 BaseSystem 或 RecoveryImage 文件。将 USB 格式化为 FAT32,在根目录新建名为 com.apple.recovery.boot 的文件夹并复制下载内容至该文件夹,注意.dmg 和.chunklist 文件都要复制。然后复制从 Clover 提取的 EFI 文件夹到根目录,保持与 com.apple.recovery.boot 文件夹同级。

GibMacOS

对于 10.13 及以上系统,可在 Mac 环境下通过 GibMacOS 下载原版镜像,注意不带引导。运行 gibMacOS.command 即可,链接如下。

1
https://github.com/corpnewt/gibMacOS

对于 Big Sur,下载后在 Mac 下打开 installAssistant.pkg,安装到当前系统盘,即可在应用程序中找到安装包程序。对于 Catalina 及更早版本,则应当运行 BuildmacOSInstallApp.command 以得到安装包,然后将安装包拖入应用程序文件夹。

将 USB 进行分区,分区表为 GUID,创建一个大小为 200-300MB 的 EFI 分区,剩余空间则用于安装程序。

打开终端并输入以下命令,注意将 MyVolume 替换为 USB 磁盘名称。完成后复制从 Clover 提取的 EFI 文件夹到 EFI 磁盘。

1
2
# 以Mojave为例
sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume

若为 Windows,则通过 MakeInstall.bat 进行制作,注意该脚本将默认创建 MBR 引导。

【进阶】用BaseSystem.dmg制作安装盘

不适用于 High Sierra 及以上系统。

BaseSystem.dmg可在安装包上点击右键,选择显示包内容,然后进入/Contents/Shared Support/即可找到。复制到桌面后,打开终端并输入以下命令以制作。

1
2
# disk1s2为USB设备路径,按照实际情况更改
sudo asr restore -source ~/Desktop/BaseSystem.dmg -target /dev/disk1s2 --erase

其他方式

官方下载

通过以下链接,通过 App Store 下载。

1
https://apps.apple.com/cn/app/macos-mojave/id1398502828?mt=12

也可通过以下链接。

1
2
链接 / https://cloud.189.cn/t/FFvIV3aeQZRz
提取码 / ps0j

InstallInstallMacOS

适用于在 Mac 环境下下载,打开终端并输入以下命令即可得到 dmg 文件。

1
mkdir ~/macOS-installer && cd ~/macOS-installer && curl -O https://raw.githubusercontent.com/munki/macadmin-scripts/main/installinstallmacos.py && sudo python installinstallmacos.py

BIOS 设置

全局设置

有 AHCI 的均选AHCI,开启支持 UEFI 启动。

选项 本机BIOS地址 设定值 设置 说明
Fast Boot 0xF7A 0x0 Disabled 快速启动
Secure Boot Disabled 安全启动
CFG Lock 0x527 0x0 Disabled CFG锁(MSR 0xE2写入保护)
Vt-d 0x7EC 0x0 Disabled 直接I/O访问的VT虚拟化技术
CSM 0x1032 0x0 Disabled 兼容性支持模块(如果看到乱码则启用)
Intel SGX 0x5DC 0x0 Disabled Intel架构新扩展
IO Serial Port Disabled 串行端口,打开可能会引起睡眠死机问题
LAN/WLAN switching Disabled LAN/WLAN切换
Extended Idle Power States Disabled 扩展空闲电源状态
Wake on LAN/WLAN/WWAN Disabled LAN/WLAN/WWAN唤醒
Wake on USB Disabled USB唤醒
Firewire/IEEE 1394 Disabled 火线/IEEE 1394设备
USB 3.0 Disabled 安装好系统后可以开启
TMP/Security Chips/Security modules Disabled 安全模块
VT-x / / Enabled 英特尔虚拟化技术
Above 4G decoding 0x7ED 0x1 Enabled 大于4G地址空间解码
Hyper Threading 0x4F0 0x1 Enabled 处理器超线程
Execute Disable Bit 0x4E9 0x1 Enabled 执行禁止位
EHCI Hand-off 0x2 0x1 Enabled 接手EHCI控制
XHCI Hand-off 0x1B 0x1 Enabled 接手XHCI控制
USB Hand-off Enabled 接手USB控制(打开后则无需ReleaseUsbOwnership/Fixownership)
Launch Hotkeys without Fn keypress Enabled 对于Skylake和KabyLake平台
USB Legacy support Enable 旧版USB支持
OS type / / Windows 8.1/10 操作系统类型Windows 8.1/10
Controller Mode AHCI mode 硬盘模式
Thunderbolt Support Disabled
Intel Platform Trust Disabled
Portable Device Charging Mode Disabled
Thunderbolt Security Level Legacy Mode
HPET Support Enabled
HPET Mode 64-bit mode
ACPI Suspend Type S3(STR)
Parallel Port Disabled
Serial Port Disabled

显卡设置

若有Nvidia/AMD的显卡,则主显示器应设置为PEG或PCIE,并禁用与Intel显卡有关的选项(Hybrid Graphics/Dual Graphics/DVMT size等)。

若有 Intel 的显卡,则将 DVMT 设置为 64MB 或更大,将 MAX TOLUD 设置为 Dynamic。

安装系统

BIOS 中启动顺序把 UEFI 启动的 U 盘设为第一,在弹出的 Clover 界面选择 Boot OS X Install from Install macOS Majove,稍等片刻进入安装界面。

【注意】关于安全启动

不要打开安全启动进行安装,因为 Mac 将使用安装程序生成的随机值进行个性化设置。由于随机值不同,将无法再用安全启动引导到系统。

在 macOS 实用工具中选择磁盘工具,点击左侧按钮选择显示所有设备,选择之前分好的 Mac 安装盘,点击抹掉,并选择格式为 APFS。返回安装界面,选择刚才格式化好的盘进行安装,等待安装完成。

重启时需继续从 U 盘启动,Clover 界面中选择 macOS 的安装盘,进入欢迎界面后注意用户密码不能为空且跳过 iCloud 设置。正常进入黑苹果桌面后不要登录 iCloud、iMessage、FaceTime。

若在跑代码的过程中发生错误,则根据常见问题进行排除。

引导本地系统

Clover 安装

在 Mac 下打开 Clover 的 pkg 安装包,同意协议后点击自定,勾选安装在 Clover 到 EFI 分区、UEFI Drivers。

安装完成后使用Clover Configurator挂载EFI分区,并打开EFI/CLOVER/kexts,只留Others文件夹,其余删除。打开Others文件夹,只留VirtualSMC.kext、WhatEverGreen.kext和Lilu.kext。

然后打开EFI/CLOVER/DRIVER64UEFI,删除SMCHelper-64.efi并复制VirtualSMC.efi到此目录下。

目录层级如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── ACPI
├── CLOVERX64.efi
├── config.plist
├── drivers
│ └── UEFI
│ ├── ApfsDriverLoader.efi
│ ├── AudioDxe.efi
│ ├── DataHubDxe.efi
│ ├── FSInject.efi
│ ├── HFSPlus.efi
│ ├── OpenRuntime.efi
│ └── VirtualSmc.efi
├── kexts
└── Other
├── Lilu.kext
├── VirtualSMC.kext
└── WhateverGreen.kext

Clover 配置

用 Clover Configurator 打开 config.plist,按下列设置进行修改。

ACPI

将 Fixs 下所有选项取消勾选(1 和 2 两个页面的选项都要取消),并添加以下更名补丁。

1
2
3
Comment: change _DSM to XDSM
Find: 5F44534D
Replace: 5844534D

Boot

Arguments 下勾选 Verbose(-v)、nv_disable=1、dart=0,其余不勾选。

Graphics

取消勾选 Inject Intel、Inject EDID。

Devices

在 Audio 的 Inject 下拉菜单选择 No,把下方 Arbitrary、Properties 和 Add Properties 所有内容删掉。

进入系统

退出 Clover Configurator,保存更改后拔出 U 盘并重启,在 BIOS 下应当多出一项 UEFI OS,进入后选择 macOS 安装盘启动。此时已完成 Clover 引导器的安装,可以脱离 U 盘引导。

若Windows引导丢失,将备份好的EFI/BOOT中的Microsoft文件夹复制到EFI分区中的EFI/BOOT,与Clover文件夹同级即可。

驱动修补

Mac的驱动以Kernel Extensions(kexts)形式存在。系统的kexts存放于/System/Library/Extentions(SLE)或/Library/Extentions(LE),其中SLE为系统kexts的主要放置路径,LE为系统拓展kexts放置路径。kexts内部的dsYM是签名文件,仅用于调试目的。

一般不建议修改 SLE 或 LE 目录。若需将驱动装入 SLE 或 LE,可通过 Kext Utility(在 Catalina 下需先解锁系统分区)或 Hackintool。以 Hackintool 为例,在 Hackintool 的工具选项卡下点击下方的小屋按钮即可。

显卡

默认情况下,Mac 对没有提供驱动程序的任何 GPU 都将运行非常基本的驱动程序,称为 VESA 驱动程序,提供了最少的显示输出,但在该情况下无法与这些设备正确交互。为了解决这个问题,需要让 Mac 认为显卡是一个通用的 PCIe 设备,或完全关闭显卡。

注意,VGA 在 Mac 中不可使用。驱动显卡前确保 kexts 文件夹内有 Lilu.kext 和 WhateverGreen.kext。

选择显卡

在 DSDT 的 PCI0 设备目录下,Intel 显卡拥有关键字Name (_ADR, 0x00010000)。Mac 原生支持 Intel 显卡,但需要进行缓冲帧修补。

对于笔记本而言,如果独显不与核显绑定,即独显本身可以独立工作,则不需要屏蔽独显,可从 BIOS 层面关闭核显,并寻找独显驱动。该情况能够存在的必要条件是 MUX 芯片存在,但大多数笔记本电脑都没有该芯片。包含该芯片的笔记本列表可参照以下表格。

设备 CPU dGPU直通 iGPU直通 eGPU直通 备注
Razer Blade 15 (2018 Basic) Intel Core i7-8750H GTX 1060 Mobile with Max-Q design (6GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
GTX 970
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
支持TB3 eGPU
Gigabyte P35X v4 Intel Core i7-5700HQ GTX 980M (8GB)
Windows下工作;Linux下未知
Intel HD Graphics 5600
Windows下工作;Linux下未知
需要修改的UEFI/BIOS(禁用Secure Boot)
MSI GF72 8RE-032 Intel Core i7-8750H GTX 1060 Mobile (6GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
HP Pavilion G6-2348SG Intel Core i7 3632QM AMD Radeon HD 7670M
Windows下不可能;Linux下不可能
Intel HD Graphics 4000
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
ASUS TUF Gaming FX505DY AMD Ryzen 5 3550H AMD Radeon RX 560X (4GB)
Windows下工作,但AMD驱动会遇到43错误;Linux下能工作
AMD Radeon Vega 8
Windows下大概能工作;Linux下大概能工作
ASUS ROG G751JY Intel Core i7-4710HQ GTX 980M (4GB)
Windows下不可能;Linux下不可能
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
iGPU被禁用,且没有UEFI选项开启
ASUS G752VS-BA329T Intel Core i7-7700HQ GTX 1070 Mobile (8GB)
Windows下不可能;Linux下不可能
Intel UHD Graphics 630
Windows下不可能;Linux下不可能
iGPU被禁用,且没有UEFI选项开启
ASUS ROG G551JW Intel Core i7-4720HQ GTX 960M (2GB/4GB DDR3)
Windows下工作;Linux下未知
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
ASUS G751JM Intel Core i7-4710HQ GTX 860M (2GB)
Windows下工作;Linux下未知
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
ASUS X550VX Intel Core i5-6300HQ GTX 950M (2GB)
Windows下工作;Linux下未知
Intel HD Graphics 530
Windows下未知;Linux下未知
MSI GS63VR 7RF REV:1.0 Intel Core i7-7700HQ GTX 1060 Mobile (6GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下能工作
Intel HD Graphics 630
Windows下大概能工作;Linux下大概能工作
MSI GS60-040XFR Intel Core i7-4720HQ GTX 970M (3GB)
Windows下工作;Linux下未知
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
MSI GS60 2PC Intel Core i7-4720HQ GTX 860M (2GB)
Windows下工作;Linux下未知
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
MSI GT70 2PE Dominator Pro Intel Core i7-4800MQ GTX 880M (GDDR5 8GB/4GB)
Windows下工作;Linux下大概能工作
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
dGPU直通需要SeaBIOS而不是UEFI(OVMF)
Gigabyte Aero 14 Intel Core™ i7-7700HQ GTX 1050 Ti (4GB)
Windows下工作;Linux下未知
Intel HD Graphics 630
Windows下工作;Linux下未知
Gigabyte Aero 15X v8 Intel Core i7-8750H GTX 1070 with Max-Q design (8GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
Lenovo ThinkPad P51 Intel Core i7-7700HQ NVIDIA Quadro M1200 (4GB)
Windows下未知;Linux下能工作
Intel UHD Graphics 630
Windows下未知;Linux下能工作
可使用Intel GVT-g以使两张卡同时通过,Bumblebee可在访客模式下使用
Lenovo Legion Y7000 Intel Core i7-8750H GTX 1060 Mobile (6GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
Dell XPS 15 9550 Intel Core i7-6700HQ GTX 960M (2GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel HD Graphics 530
Windows下大概能工作;Linux下大概能工作
Dell XPS 15 9570 Intel Core i7-8750H GTX 1050Ti (4GB)
Windows下工作;Linux下大概能工作
Intel UHD Graphics 630
Windows下工作;Linux下大概能工作
Dell Precision 7510 Intel Xeon E3-1200 v5 Nvidia Quadro M2000M
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel HD Graphics P530
Windows下大概能工作;Linux下大概能工作
OVERPOWERED Gaming Laptop 15+ Intel Core i7-8750H GTX 1060 (6GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
CLEVO P950ER Intel Core i7-8750H GTX 1070 with Max-Q design (8GB)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Intel UHD Graphics 630
Windows下大概能工作;Linux下大概能工作
XMG P505 (Clevo P650SG) Intel Core i7-4720HQ GTX 970M (4GB)
Windows下工作,但某些应用只能在RDP下运行;Linux下大概能工作
Intel HD Graphics 4600
Windows下不支持4代及更早的Intel CPU;Linux下不支持4代及更早的Intel CPU
需要Nvidia驱动(353.82)以在Windows 10下运行
CLEVO N957TP6 Unknown (Intel) Unknown (Nvidia)
Windows下工作,但Nvidia驱动会遇到43错误;Linux下大概能工作
Unknown
Windows下大概能工作;Linux下大概能工作

可使用以下脚本进行判断。

1
https://github.com/T-vK/MobilePassThrough

若没有该芯片,由于 Mac 不支持双显卡切换技术,为使显卡正常,需要屏蔽独显。大多数笔记本上的双显卡切换是让集显承担图像输出任务,所以不能屏蔽集显,屏蔽会导致黑屏。

可以通过外接显示器判断独显是否独立。外接显示器后在桌面右键,打开 NVIDIA 控制面板,然后看是否可以调节数字振动这类设置。如果可以,说明此独显可以被独立驱动。

对于本机而言,由于 BIOS 中有 External Gfx Card Primary Display Configuration,理论上可以屏蔽核显以驱动独显。考虑到 BIOS 中的设置会影响其他系统,此处采用屏蔽 Nvidia 独显而驱动 Intel 核显的方案。

对于旧版 Mac 的独显,可尝试通过 purge-wrangler 驱动,链接如下。

1
https://github.com/mayankk2308/purge-wrangler

查找设备路径

设备路径描述了设备在所有硬件中的具体位置,为类似_SB.PCI0.PEG0.PEGP的形式。

通过 gfxutil

下载gfxutil后打开终端,并切换到 gfxutil 所在路径,执行以下命令以输出显卡设备路径。

1
2
3
4
5
# 独显
gfxutil -f GFX0

# 核显
gfxutil -f IGPU

通过 Windows

打开 Windows 下的设备管理器,在独显设备上右键单击属性,在详细信息标签卡下拉菜单选择BIOS 设备名称即可。

通过 ACPI 表

在Clover引导界面按下F4,进入系统后打开EFI/CLOVER/ACPI/origin,可得到本机所有ACPI文件。复制到任一位置后打开终端,切换到复制到的位置并执行以下命令。

1
2
grep -l _OFF *.aml
grep -l _INI *.aml

检查输出并记录两个输出中均存在的文件。打开这些文件并查找_OFF 方法,如果这个方法在 PowerShell 宏中(即由 PowerShell 大括号括住),则舍弃。找到独立的_OFF 方法并记录其设备路径即可。

驱动 Nvidia 显卡

Nvidia 显卡一般免驱,部分显卡打开 Inject Nvidia 即可驱动成功。对于未受支持的显卡,则需要安装 Nvidia WebDriver。此驱动最新版只适用于 10.13,因此需要进行修补。

可使用 Benjamin-Dobell 的脚本,仓库如下。

1
https://github.com/Benjamin-Dobell/nvidia-update

在终端输入以下命令以启动安装脚本。

1
2
3
curl -O https://raw.githubusercontent.com/Benjamin-Dobell/nvidia-update/master/nvidia-update.sh
chmod 755 nvidia-update.sh
./nvidia-update.sh -f

安装完成后重启,在系统设置中已经能够看到 Nvidia 控制面板。若未驱动,则需要在 Clover 的 System Parameters 下勾选 NvidiaWeb。

若为笔记本,独显通常不可驱动。若为台式机,在 Catalina 上独显无法开启硬件加速。若该显卡正常驱动,可安装 WebDriver 和 CUDA Driver 获得更好的体验,下载链接如下。

1
2
3
4
5
6
7
8
9
10
11
# WebDriver
https://gfe.nvidia.com/mac-update
https://www.nvidia.com/download/driverResults.aspx/149652/
https://www.nvidia.com/download/driverResults.aspx/125379/en-us
https://www.insanelymac.com/forum/topic/324195-nvidia-web-driver-updates-for-macos-high-sierra-update-nov-13-2020/

# WebDriver Manager
https://hackintosher.com/forums/attachments/webdrivermanager-2-9-4-zip.1289/

# CUDA Driver
https://www.nvidia.com/en-us/drivers/cuda/mac-driver-archive/
【进阶】旧版Nvidia GPU用于Mojave/Catalina

部分旧版 GPU 最多仅支持到 High Sierra,可通过修改系统文件的方式实现驱动。下载链接如下。

1
https://www.insanelymac.com/forum/topic/339035-pre-release-macos-catalina/page/21/?tab=comments#comment-2677545

需要替换以下文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Frameworks
/System/Library/Frameworks/CoreDisplay.framework
/System/Library/Frameworks/OpenGL.framework
/System/Library/PrivateFrameworks/SkyLight.framework
/System/Library/PrivateFrameworks/GPUSupport.framework

# Patched Catalina Kexts
/System/Library/Extensions/IOHIDFamily.kext
/System/Library/Extensions/IOSurface.kext

# nVidia Kexts from 10.13.6 for Legacy Tesla Cards
/System/Library/Extensions/GeForceGA.bundle
/System/Library/Extensions/GeForceTesla.kext
/System/Library/Extensions/GeForceTeslaGLDriver.bundle
/System/Library/Extensions/GeForceTeslaVADriver.bundle
/System/Library/Extensions/IOGraphicsFamily.kext
/System/Library/Extensions/IONDRVSupport.kext
/System/Library/Extensions/NVDANV50HalTesla.kext
/System/Library/Extensions/NVDAResmanTesla.kext

并删除以下内容。删除后修复权限并重建缓存即可。

1
/System/Library/UserEventPlugins/com.apple.telemetry.plugin
【进阶】OC引导

OpenCore 需添加 EFI 字符串。在配置文件添加以下设备即可。

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>[DEVICEPATH]</key>
<dict>
<key>@0,compatible</key>
<string>NVDA,NVMac</string>
<key>@0,device_type</key>
<string>display</string>
<key>@0,name</key>
<string>NVDA,Display-A</string>
<key>@1,compatible</key>
<string>NVDA,NVMac</string>
<key>@1,device_type</key>
<string>display</string>
<key>@1,name</key>
<string>NVDA,Display-B</string>
<key>NVCAP</key>
<data>
[OUTPUTS]
</data>
<key>NVPM</key>
<data>
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</data>
<key>VRAM,totalsize</key>
<string>[MEMORYSIZE]</string>
<key>device_type</key>
<string>NVDA,GeForce</string>
<key>model</key>
<string>[MODELNAME]</string>
<key>name</key>
<string>NVDA,Parent</string>
<key>rom-revision</key>
<string>0x302e3176</string>
</dict>
</dict>
</plist>

注意需根据以下内容替换。

选项 内容
[DEVICEPATH] 设备路径
[MODELNAME] 设备名称
[MEMORYSIZE] 32 - 0x02000000
64 - 0x04000000
128 - 0x08000000
256 - 0x10000000
320 - 0x14000000
512 - 0x20000000
640 - 0x28000000
768 - 0x30000000
1024 - 0x40000000
[OUTPUTS] DVI-I / DVI-I - BAAAAAAAAwAMAAAAAAAABwAAAAA=
VGA / DVI-I - BAAAAAAAAQAGAAAAAAAAAAAAAAA=
DVI-I / VGA - BAAAAAAAAwAEAAAAAAAABwAAAAA=

驱动 Intel 显卡

Intel 显卡位于地址 0x00020000,在 DSDT 中可通过搜索Name (_ADR, 0x00020000)定位到显卡。

打开 Hackintool,在缓冲帧菜单项选择 macOS 10.14,在 IntelGen 菜单项选择显卡的次代。本机为 Intel HD Graphics 620,选择 Kaby Lake。然后选择 PlatformID,本机选择 0×59160000。具体对应架构和 PlatformID 参见附录。

点击应用补丁选项卡,进行以下设置。

1
2
3
4
5
6
# 通用
选择设备属性,勾选自动侦测变化、全部、接口、基本显存、EDID、图形卡、音频、PCI设备

# Advenced
勾选将DP映射到HDMI、使用英特尔HDMI、修复热插拔重启、HDMI无限循环修复、仿冒声卡ID、显存2048MB、启用HDMI20(4K)、缓冲帧接口数限制:3
勾选仿冒图形卡ID,选择对应显卡设备

点击Generate Patch生成显卡驱动补丁。点击File-Export-Clover config.plist,路径选择EFI/CLOVER并确认替换。注意,Hackintool会将原来的config.plist和生成的补丁进行合成,替换以后的config.plist为原有基础上添加了显卡补丁的配置文件,原有配置文件则被备份为config-backup.plist。

【进阶】DeviceProperties中显卡设备参数含义

framebuffer-unifiedmem 用于设置显存参数,可随意设置,仅在系统设置中显示,无实际作用。注意,UHD630 经测试最高只能修改到 4080MB,再往上会变成 0MB。

驱动 AMD 显卡

AMD 显卡大部分免驱,部分需要通过伪装 ID 的方式驱动。

【进阶】伪装ID

部分 GPU 需要将其欺骗为其它显卡以正常工作。列表如下。

1
2
3
4
5
6
R9 290/390
R9 280/380
R7 270/370
R9 260/360
R7 250
R7 240

以 R9 390 为例,最接近的可驱动卡为 390X,可得 vendor ID 为 1002,device ID 为 67B0。仅需将 device ID 进行处理,结果如下,注意遵循小端规则。

1
2
3
4
5
"device-id",
Buffer (0x04)
{
0xB0, 0x67, 0x00, 0x00
},

下载以下文件并用 MaciASL 打开。

1
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/decompiled/SSDT-GPU-SPOOF.dsl.zip

将以下内容修改为显卡的设备路径。

1
2
External (_SB_.PCI0, DeviceObj)
External (_SB_.PCI0.PEG0.PEGP, DeviceObj)

然后将前面修改过的 device ID 放入该 SSDT 中。同时修改 model,该部分仅为装饰性作用。

1
2
3
4
5
"model",
Buffer ()
{
"AMD Radeon R9 390"
}

另存为aml文件后放置在Clover的ACPI/patched即可。

可尝试 PyVega 以实现超频和电压调整。

1
https://github.com/corpnewt/PyVega

禁用显卡

必须在 BIOS 中关闭 CSM,才可使以下方法工作。

通过添加引导标志

保证 Whatevergreen 存在,在 Clover 引导标志中添加-wegnoegpu。此方法不能保证始终正常工作。

通过添加独显设备并禁用

注意,进入该设备路径的其它设备也将获得这些属性,从而失效,即会禁用同一品牌的所有显卡,也会禁用开普勒 GPU。其它 PCIe 驱动器也可用此法禁用。

查找到独显设备路径,对于 Nvidia 一般为\_SB.PCI0.PEG0.PEGP,对于 AMD 一般为\_SB.PCI0.PEGP.DGFX。找到后在 Clover 的 Device-Add Properties 下添加该独显路径,并填写以下内容。

对于 Nvidia 显卡采用以下内容。

Device Key Value Disabled Value Type
NVidia name 23646973706C6179 False DATA
NVidia IOName #display False STRING
NVidia class-code FFFFFFFF False DATA

对于 AMD 显卡则采用以下内容。

Device Key Value Disabled Value Type
ATI name 23646973706C6179 False DATA
ATI IOName #display False STRING
ATI class-code FFFFFFFF False DATA
ATI vendor-id FFFF0000 False DATA
ATI device-id FFFF0000 False DATA

通过 SSDT

查找到独显设备路径后,打开MaciASL并新建文件,复制以下代码并将_SB.PCI0.PEG0.PEGP修改为所找到的设备路径,保存为aml文件并放到EFI/CLOVER/ACPI/hotpatch,然后添加change _DSM to XDSM更名补丁。

对于 Nvidia 显卡采用以下 SSDT。

1
2
3
4
5
6
7
8
9
10
11
12
13
DefinitionBlock ("", "SSDT", 2, "hack", "spoof", 0)
{
Method(_SB.PCI0.PEG0.PEGP._DSM, 4)
{
If (!Arg2) { Return (Buffer() { 0x03 } ) }
Return (Package()
{
"name", Buffer() { "#display" },
"IOName", "#display",
"class-code", Buffer() { 0xFF, 0xFF, 0xFF, 0xFF },
})
}
}

对于 AMD 显卡采用以下 SSDT。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DefinitionBlock ("", "SSDT", 2, "hack", "spoof", 0)
{
Method(_SB.PCI0.PEG0.PEGP._DSM, 4)
{
If (!Arg2) { Return (Buffer() { 0x03 } ) }
Return (Package()
{
"name", Buffer() { "#display" },
"IOName", "#display",
"class-code", Buffer() { 0xFF, 0xFF, 0xFF, 0xFF },
"vendor-id", Buffer() { 0xFF, 0xFF, 0, 0 },
"device-id", Buffer() { 0xFF, 0xFF, 0, 0 },
})
}
}

通用版 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
DefinitionBlock ("", "SSDT", 2, "DRTNIA", "spoof", 0x00000000)
{
External (_SB_.PCI0.PEG0.PEGP, DeviceObj)

Method (_SB.PCI0.PEG0.PEGP._DSM, 4, NotSerialized)
{
If ((!Arg2 || !_OSI ("Darwin")))
{
Return (Buffer (One)
{
0x03
})
}

Return (Package (0x0A)
{
"name",
Buffer (0x09)
{
"#display"
},

"IOName",
"#display",
"class-code",
Buffer (0x04)
{
0xFF, 0xFF, 0xFF, 0xFF
}
})
}
}

仓库如下。

1
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/decompiled/SSDT-GPU-DISABLE.dsl.zip

屏蔽独显

查找到独显设备路径后,打开MaciASL并新建文件,复制以下代码并将_SB.PCI0.PEG0.PEGP修改为所找到的设备路径,保存为aml文件并放到EFI/CLOVER/ACPI/hotpatch。

【进阶】禁用原理

该 SSDT 通过调用显卡设备中的_OFF方法实现屏蔽独显。

1
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/decompiled/SSDT-dGPU-Off.dsl.zip

对于部分显卡,该方法无法使其正常关闭,则可通过发送 D3 state 的方式使显卡处于最低耗能状态。使用以下 SSDT 即可,操作同上。

1
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/decompiled/SSDT-NoHybGfx.dsl.zip

屏幕亮度

启用调节

对于笔记本,可使用 BrightnessKeys.kext,链接如下,

1
https://github.com/acidanthera/BrightnessKeys

对于台式机,打开Maciasl,新建文件并复制以下内容,保存为SSDT-PNLF.aml并放入Clover的ACPI/patched下。

对于 Coffee Lake 及更新 CPU,使用以下补丁。

1
https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/AcpiSamples/Source/SSDT-PNLFCFL.dsl

其它使用以下补丁。

1
https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/AcpiSamples/Source/SSDT-PNLF.dsl

或以下内容。

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
DefinitionBlock ("", "SSDT", 2, "hack", "_PNLF", 0x00000000)
{
External (_SB_.PCI0.IGPU, DeviceObj)
External (RMCF.BKLT, IntObj)
External (RMCF.FBTP, IntObj)
External (RMCF.GRAN, IntObj)
External (RMCF.LEVW, IntObj)
External (RMCF.LMAX, IntObj)

Scope (_SB.PCI0.IGPU)
{
OperationRegion (RMP3, PCI_Config, Zero, 0x14)
}

Device (_SB.PCI0.IGPU.PNLF)
{
Name (_ADR, Zero)
Name (_HID, EisaId ("APP0002"))
Name (_CID, "backlight")
Name (_UID, Zero)
Name (_STA, 0x0B)
Field (^RMP3, AnyAcc, NoLock, Preserve)
{
Offset (0x02),
GDID, 16,
Offset (0x10),
BAR1, 32
}

OperationRegion (RMB1, SystemMemory, (BAR1 & 0xFFFFFFFFFFFFFFF0), 0x000E1184)
Field (RMB1, AnyAcc, Lock, Preserve)
{
Offset (0x48250),
LEV2, 32,
LEVL, 32,
Offset (0x70040),
P0BL, 32,
Offset (0xC2000),
GRAN, 32,
Offset (0xC8250),
LEVW, 32,
LEVX, 32,
Offset (0xE1180),
PCHL, 32
}

Method (_INI, 0, NotSerialized)
{
Local4 = One
If (CondRefOf (\RMCF.BKLT))
{
Local4 = \RMCF.BKLT
}

If ((Zero == (One & Local4)))
{
Return (Zero)
}

Local0 = ^GDID
Local2 = Ones
If (CondRefOf (\RMCF.LMAX))
{
Local2 = \RMCF.LMAX
}

Local3 = Zero
If (CondRefOf (\RMCF.FBTP))
{
Local3 = \RMCF.FBTP
}

If ((Zero == Local3))
{
If ((Ones != Match (Package (0x10)
{
0x010B,
0x0102,
0x0106,
0x1106,
0x1601,
0x0116,
0x0126,
0x0112,
0x0122,
0x0152,
0x0156,
0x0162,
0x0166,
0x016A,
0x46,
0x42
}, MEQ, Local0, MTR, Zero, Zero)))
{
Local3 = One
}
Else
{
Local3 = 0x02
}
}

If ((One == Local3))
{
If ((Ones == Local2))
{
Local2 = 0x0710
}

Local1 = (^LEVX >> 0x10)
If (!Local1)
{
Local1 = Local2
}

If ((Local2 != Local1))
{
Local0 = ((^LEVL * Local2) / Local1)
Local3 = (Local2 << 0x10)
If ((Local2 > Local1))
{
^LEVX = Local3
^LEVL = Local0
}
Else
{
^LEVL = Local0
^LEVX = Local3
}
}
}
ElseIf ((0x02 == Local3))
{
If ((Ones == Local2))
{
If ((Ones != Match (Package (0x16)
{
0x0D26,
0x0A26,
0x0D22,
0x0412,
0x0416,
0x0A16,
0x0A1E,
0x0A1E,
0x0A2E,
0x041E,
0x041A,
0x0BD1,
0x0BD2,
0x0BD3,
0x1606,
0x160E,
0x1616,
0x161E,
0x1626,
0x1622,
0x1612,
0x162B
}, MEQ, Local0, MTR, Zero, Zero)))
{
Local2 = 0x0AD9
}
ElseIf ((Ones != Match (Package (0x04)
{
0x3E9B,
0x3EA5,
0x3E92,
0x3E91
}, MEQ, Local0, MTR, Zero, Zero)))
{
Local2 = 0xFFFF
}
Else
{
Local2 = 0x056C
}
}

If ((Zero == (0x02 & Local4)))
{
Local5 = 0xC0000000
If (CondRefOf (\RMCF.LEVW))
{
If ((Ones != \RMCF.LEVW))
{
Local5 = \RMCF.LEVW
}
}

^LEVW = Local5
}

If ((0x04 & Local4))
{
If (CondRefOf (\RMCF.GRAN))
{
^GRAN = \RMCF.GRAN
}
Else
{
^GRAN = Zero
}
}

Local1 = (^LEVX >> 0x10)
If (!Local1)
{
Local1 = Local2
}

If ((Local2 != Local1))
{
Local0 = ((((^LEVX & 0xFFFF) * Local2) / Local1) |
(Local2 << 0x10))
^LEVX = Local0
}
}

If ((Local2 == 0x0710))
{
_UID = 0x0E
}
ElseIf ((Local2 == 0x0AD9))
{
_UID = 0x0F
}
ElseIf ((Local2 == 0x056C))
{
_UID = 0x10
}
ElseIf ((Local2 == 0x07A1))
{
_UID = 0x11
}
ElseIf ((Local2 == 0x1499))
{
_UID = 0x12
}
ElseIf ((Local2 == 0xFFFF))
{
_UID = 0x13
}
Else
{
_UID = 0x63
}
}
}
}

重启电脑后进入系统偏好设置-显示器,若出现亮度调节滑块则已成功。

完成后可通过NativeDisplayBrightness,实现通过F1/F2控制显示器亮度。

1
https://github.com/Bensge/NativeDisplayBrightness

也可尝试 IntelBacklight,或 ACPIBacklight。

1
2
https://github.com/RehabMan/OS-X-Intel-Backlight
https://github.com/RehabMan/OS-X-ACPI-Backlight
【进阶】DSDT PNLF补丁

对于 SandyBridge 和 IvyBridge 如下。

1
2
3
4
5
6
7
8
9
10
11
into_all device label PNLF remove_entry;
into scope label _SB insert
begin
Device (PNLF)\n
{\n
Name (_HID, EisaId ("APP0002")) // _HID: Hardware ID\n
Name (_CID, "backlight") // _CID: Compatible ID\n
Name (_UID, 0x0E) // _UID: Unique ID\n
Name (_STA, 0x0B) // _STA: Status\n
}\n
end

对于 Haswell 和 Broadwell 如下。

1
2
3
4
5
6
7
8
9
10
11
into_all device label PNLF remove_entry;
into scope label _SB insert
begin
Device (PNLF)\n
{\n
Name (_HID, EisaId ("APP0002")) // _HID: Hardware ID\n
Name (_CID, "backlight") // _CID: Compatible ID\n
Name (_UID, 0x0F) // _UID: Unique ID\n
Name (_STA, 0x0B) // _STA: Status\n
}\n
end

对于 SkyLake 和 Kabylake 如下。

1
2
3
4
5
6
7
8
9
10
11
into_all device label PNLF remove_entry;
into scope label _SB insert
begin
Device (PNLF)\n
{\n
Name (_HID, EisaId ("APP0002")) // _HID: Hardware ID\n
Name (_CID, "backlight") // _CID: Compatible ID\n
Name (_UID, 0x10) // _UID: Unique ID\n
Name (_STA, 0x0B) // _STA: Status\n
}\n
end

对于 Coffeelake、WhiskeyLake、CometLake 和 Ice Lake 如下。

1
2
3
4
5
6
7
8
9
10
11
into_all device label PNLF remove_entry;
into scope label _SB insert
begin
Device (PNLF)\n
{\n
Name (_HID, EisaId ("APP0002")) // _HID: Hardware ID\n
Name (_CID, "backlight") // _CID: Compatible ID\n
Name (_UID, 0x13) // _UID: Unique ID\n
Name (_STA, 0x0B) // _STA: Status\n
}\n
end
【进阶】DSDT的相关代码

LMAX 变量代表 PWM 背光最大值,示例如下。若设置为 0 则在引导时使用 BIOS 寄存器值。

1
Name(LMAX, 0x56c)

亮度恢复

AppleBacklight.kext 将当前亮度级别存储在 NVRAM 中,以便在重新启动后进行恢复。

为了使恢复正常工作,必须正确实施 NVRAM。且 Clover 的配置文件中,SystemParameters-BacklightLevel 不应设值,ACPI-DSDT-Fixes-AddPNLF 应关闭

若电脑有环境光传感器,则可能会对亮度恢复造成干扰。可在 DSDT 中通过查找ACPI0008检查是否存在光传感器。若有,则可通过编辑其_STA 方法禁用,示例如下。

1
2
3
4
5
6
7
8
9
Device (ALSD)
{
Name (_HID, "ACPI0008") // _HID: Hardware ID
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0)
}
...
}

效果检验

重启后显卡正常情况下已经驱动,Dock 栏变为半透明。

点击左上角苹果按钮,选择关于本机,若图形卡一栏显示 2048MB 而不是 7MB,则核显驱动成功。在系统报告-图形卡中若不能看到所屏蔽的独显,则独显屏蔽成功。点击核显,若有Metal: 支持,功能集 macOS GPUFamily2 v1字样,则 metal 支持打开成功。

显卡驱动后需检验显卡硬件加速(QE/CI)是否已经打开。如果能够运行象棋游戏、屏幕保护程序正常工作、Grapher能看到三维图像、截屏功能正常,则硬件加速已打开。

也可使用 VDADecoderChecker 或 VideoProc 检测。对于 VideoProc,打开应用后进入设置,点击硬件加速引擎旁边的选项,查看检测结果即可。VideoProc 下载链接如下。

1
https://www.videoproc.com/

对于 VDADecoderChecker,下载链接如下。双击即可进行检查。若不正常,需保证 iGPU 注入正确,若无效则尝试更改 SMBIOS。

1
2
https://github.com/cylonbrain/VDADecoderCheck
https://i.applelife.ru/2019/05/451893_10.12_VDADecoderChecker.zip
【进阶】对于Catalina及更高版本

由于默认情况下不显示来自 AppleGVA 的调试信息,因此需要在系统日志查看结果。在终端输入以下命令。

1
2
defaults write com.apple.AppleGVA enableSyslog -boolean true
log stream --style compact --predicate 'eventMessage CONTAINS "GVA"'

输入后开启 VDADecoderChecker。完成后输入以下命令禁用 AppleGVA 调试。

1
defaults delete com.apple.AppleGVA enableSyslog
【进阶】Big Sur中的错误

若出现 VDADecoderCreate failed. err: -12473 错误,在有 AMD 独显的情况下,可在终端输入以下命令。

1
defaults write com.apple.AppleGVA gvaForceAMDAVCDecode -boolean yes

DRM 支持

若未开启 DRM,则 Apple TV+、Amazon Prime、Netflix 将无法正常观看。开启 DRM 需要支持的 dGPU。

【进阶】其它系统支持性

对于 Big Sur 和 Safari 14,系统不再提供软件 DRM 支持与传统硬件 DRM 支持,WhatEverGreen 目前未提供 DRM 支持。在 Catalina 中,对于 Intel,Haswell 及更新的核显不提供 DRM 支持。

iGPU 的 DRM 中断通过 WhatEverGreen 修复,在 10.12.2 及更低系统起作用。

DRM 类型如下。

类型 说明
FairPlay 1.x 基于软件的DRM,用于支持旧版Mac
FairPlay 2.x/3.x 基于硬件的DRM,用于Netflix和Amazon Prime,需Polaris+的AMD GPU以保证工作
FairPlay 4.x 混合DRM,用于AppleTV+,需无iGPU (Xeon)或有Polaris+的AMD GPU以保证工作

首先通过 VDADecoderChecker 保证硬件正常工作。然后通过以下视频检查各 DRM 类型。

1
2
3
4
5
6
7
8
9
# FairPlay 1.x
https://drive.google.com/file/d/12pQ5FFpdHdGOVV6jvbqEq2wmkpMKxsOF/view

# FairPlay 2.x/3.x
# 播放预告片
https://www.amazon.com/Spider-Man-Far-Home-Tom-Holland/dp/B07TP6D1DP

# FairPlay 4.x
打开Apple TV+并观看任意预告片

根据以下列表设置 SMBIOS,并添加启动参数或添加设备属性即可。以shikigva=80为例,设备属性如下。注意应当仅对一个显卡注入 shikigva 属性,否则 WhatEverGreen 将使用它首先找到的任何内容,并且不能保证一致。

Properties Key Properties Value Value Type
shikigva 80 Number

注意,IQSV 代表英特尔快速同步视频。这仅在 iGPU 存在并启用且设置正确时才有效。

1
https://github.com/acidanthera/WhateverGreen/blob/master/Manual/FAQ.Chart.md

显示修复

若出现屏幕花屏,可以尝试将 DVI 换为 HDMI,或注入 EDID。

平滑字体

在终端输入以下命令即可。

1
2
3
4
5
6
7
8
9
10
11
# 开启
defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO

# 设置字体样式
# 3为最粗,1为最细
defaults -currentHost write -globalDomain AppleFontSmoothing -int 3
# defaults -currentHost write -globalDomain AppleFontSmoothing -int 2
# defaults -currentHost write -globalDomain AppleFontSmoothing -int 1

# 关闭
defaults write -g CGFontRenderingFontSmoothingDisabled -bool YES

Hidpi

HiDPI 即 High Dots Per Inch,用四个硬件像素渲染一个图像像素。开启 Hidpi 可使显示更清晰。

通过脚本

在终端下输入以下命令打开一键 HiDPI 脚本,安装以获得原生屏幕缩放体验。

1
2
3
4
sh -c "$(curl -fsSL https://raw.githubusercontent.com/xzhih/one-key-hidpi/master/hidpi.sh)"

# 或以下命令
bash -c "$(curl -fsSL https://gitee.com/kirainmoe/static-files/raw/master/hidpi.sh)"
通过 RDM

打开 DarwinDumper,只勾选 EDID,点击左侧的 Run,会在桌面生成 EDID 文件夹。下载链接如下。

1
https://mac.softpedia.com/get/Utilities/DarwinDumper.shtml

下载 FixEDID,链接如下。

1
https://github.com/andyvand/FixEDID

打开并点击Open EDID binary file,选择桌面文件夹的EDID/EDID.bin。选择对应显示比例的显示器,此处为Apple MacBook Pro Display(16:10)。

在右侧输入想设置的分辨率,点击 Add Resolutions 添加分辨率,点击 Make 在桌面生成文件。参考分辨率如下。

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
3840×2160
3200×1800
2880×1620
2560×1600
2560×1440
1920×1080
1820×1200
1680×1050
1600×900
1440×810
1440×900
1440×810
1344×1008
1344×756
1280×960
1280×800
1280×720
1024×768
1024×576
960×600
960×540
840×525
840×524
800×600
800×450
720×450
640×480

将桌面的DisplayVendorID-xxx放到/System/Library/Displays/Contents/Resources/Overrides。安装RDM并重启电脑,即可在RDM看到需要的分辨率,链接如下。

1
http://avi.alkalay.net/software/RDM/RDM-2.2.dmg
通过手动设置
【进阶】对于Big Sur

该方法适用于Big Sur,将最后生成的文件放置于/Library/Displays/Contents/Resources/Overrides即可。

具体可在终端使用以下命令。

1
2
3
4
sudo mkdir -p /Library/Displays/Contents/Resources/Overrides/

# DisplayProductID-413c和DisplayVendorID-10ac根据显示器自行修改
sudo cp ~/Downloads/DisplayProductID-413c.plist /Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/DisplayProductID-413

打开终端并输入以下命令。

1
2
sudo defaults write /Library/Preferences/com.apple.windowserver.plist DisplayResolutionEnabled -bool true
ioreg -lw0 | grep IODisplayPrefsKey

输出类似如下信息,其中所有外部监视器由 AppleDisplay 标识,内部监视器由 AppleBacklightDisplay 标识。在行末可识别出 DisplayVendorID 和 DisplayProductID,此处为10acd06e

1
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@2/display0/AppleDisplay-10ac-d06e"

打开以下网页并输入刚才得到的 DisplayVendorID 和 DisplayProductID,DisplayProductName 可以随意。注意一个分辨率需填写两个 Scale Resolutions,其中第一个是原分辨率,另一个是长宽均为两倍后的分辨率,如添加 1920×1080,则需填入 3840×2160 和 1920×1080。注意相近的分辨率将会被系统过滤。

1
https://codeclou.github.io/Display-Override-PropertyList-File-Parser-and-Generator-with-HiDPI-Support-For-Scaled-Resolutions/

调整完成后下载plist文件,去掉扩展名并放在DisplayVendorID-10ac文件夹,其中10ac更改为自己的VendorID。将文件夹复制到/System/Library/Displays/Contents/Resources/Overrides并重启即可。

注入 EDID

注入 EDID 可修复笔记本显示器内屏黑屏或花屏的问题。若前面选择采用 Hidpi 一键脚本,则无需进行此步。

通过 patch-edid.rb

打开终端并输入以下命令以下载脚本。

1
curl -O https://gist.github.com/ejdyksen/8302862/raw/patch-edid.rb

打开脚本文件并查找AppleDisplay,其代表外接显示器,若为内接显示器则需修改为AppleBacklightDisplay。然后继续在终端输入以下命令以运行并生成配置文件。

1
sudo ruby patch-edid.rb

将生成的配置文件复制到/System/Library/Displays/Contents/Resources/Overrides/DisplayVendorID-xxx(对于El Capitan及以前版本为/System/Library/Displays/Overrides/DisplayVendorID-xxx),若已存在配置文件,则将两个文件的内容合并,重启即可。

通过 Clover

在终端分别输入以下命令并记录其输出。其中第一个输出为 EDID 信息,另外两个分别为屏幕设备的 VendorID 和 ProductID。

1
2
3
ioreg -lw0 | grep -i "IODisplayEDID" | sed -e 's/.*<//' -e 's/>//'
ioreg -l | grep "DisplayVendorID"
ioreg -l | grep "DisplayProductID"

打开 Clover 的 config.plist,切换到 Graphics,将三者分别粘贴到对应的位置,注意 VendorID 和 ProductID 需要转换为十六进制。勾选Inject EDID,保存并重启即可。

通过 Hackintool

打开 Hackintool,进入显示器,选择要编辑的显示器,可添加或修复监视器范围,以及修改分辨率。

点击导出,将DisplayVendorID-x和Icons.plist复制到/System/Library/Displays/Contents/Resources/Overrides(对于El Capitan及以前版本为/System/Library/Displays/Overrides)即可。

也可将 DisplayEDID-x-x.kext 复制到 Clover 的 kexts 文件夹。

常见问题

部分 iGPU 唤醒中断

Apple 对 AppleGraphicsPowerManagement.kext 中进行的修改导致。需要添加启动参数 igfxonln=1 以强制所有显示器联机。

NVMe 内核崩溃

部分配备iGPU的系统(Sandy Lake/Coffee Lake等)可能会导致系统在低功耗状态下不稳定。需要添加启动参数forceRenderStandby=0以禁用RC6渲染待机。

Ice Lake 笔记本出现 panic,为 Cannot allow DC9 without disallowing DC6

状态转换问题,需要添加启动参数-noDC9 或-nodisplaysleepDC6。

带有 AMD dGPU 的 4k 显示器无法随机唤醒

AGDC 设置引起。在配置文件中定位到该设备的设备属性,添加以下项即可。

选项 类型 内容
CFG,CFG_USE_AGDC Data 00

有线网卡

几乎所有的有线网卡都受支持。

Realtek

Realtek L8200A 不受支持。

以Realtek RTL8111有线网卡为例,网络上寻找对应驱动的kext,并放入Clover的kexts/Others即可驱动。

驱动后进入系统偏好设置-网络,可看到有线网卡。或点击左上角苹果按钮,选择关于本机-系统报告…,在以太网卡中可以看到有线网卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Realtek RTL810X(RTL8101E/8102E/8103E/8401E/8105E/8402/8106E/8106EUS)
http://www.insanelymac.com/forum/topic/296190-driver-for-realteks-rtl810x-fast-ethernet-series

# Realtek RTL8111X/8168X(X=无/B/C/D/E/F/G)[Gigabit Ethernet]
http://www.insanelymac.com/forum/topic/287161-new-driver-for-realtek-rtl8111
https://github.com/Mieze/RTL8111_driver_for_OS_X
https://code.google.com/p/os-x-realtek-network/downloads/list
https://github.com/SergeySlice/RealtekLANv3
http://lnx2mac.blogspot.com/p/realtekrtl81xx-osx-driver.html

# Realtek RTL8125 [2.5Gb Ethernet]
https://github.com/Mieze/LucyRTL8125Ethernet

# Realtek RTL8100
https://github.com/Mieze/RealtekRTL8100

Intel

Intel 有线网卡驱动下载链接如下。不支持 Intel I225 2.5Gb NIC、Intel I225 2.5Gb NIC、Intel 10Gb server NICs、Mellanox and Qlogic server NICs。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 新版,支持82578LM/82578LC/82578DM/82578DC/82579LM/82579V/I217LM/I217V/I218LM/I218V/I218LM2/I218V2/I218LM3/I219V/I219LM/I219V2/I219LM2/I219LM2
https://github.com/Mieze/IntelMausiEthernet
https://github.com/acidanthera/IntelMausi

# 旧版
https://github.com/chris1111/AppleIntelE1000e

# 支持82575/82576/82580/dh89xxcc/i350/i210/i211
https://www.tonymacx86.com/resources/appleigb.323/

# 支持I211/I350
https://github.com/khronokernel/SmallTree-I211-AT-patch

# 支持I211
https://github.com/suxiaogang/asrock-deskmini-110-hackintosh/tree/master/EFI/CLOVER/kexts/Other/Backup/SmallTree-Intel-211-AT-PCIe-GBE.kext
https://cdn.discordapp.com/attachments/390417931659378688/556912824228773888/SmallTree-Intel-211-AT-PCIe-GBE.kext.zip

# 支持82546EB/82545EM/82546EB/82545GM/82571EB
https://small-tree.com/smalltreeintel8254x-3-9-0-dmg/

# 支持82598EB/82599EB/82599ES
https://small-tree.com/smalltreeintel8259x-3-5-0-dmg/

Intel i225-V需要欺骗为被支持的i225LM,具体为在Clover的设备属性下添加路径PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0),其中具有键device-id,类型为Data,值为F2150000。完成欺骗后通过AppleIntelI210Ethernet驱动即可。若出现panic,则设备路径应改为类似PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x0)

Broadcom

对于BCM5722 NetXtreme/NetLink,可用BCM5722D,链接如下。适用于10.6及更高版本。

1
https://github.com/chris1111/BCM5722D

其它则需要 FakePCIID+FakePCIID_BCM57XX_as_BCM57765。

AMD

I211-AT 驱动下载链接如下。

1
https://github.com/khronokernel/SmallTree-I211-AT-patch/releases

Atheros

Atheros 有线网卡驱动下载链接如下。

1
2
3
4
5
6
7
8
9
10
# Qualcomm Atheros E2200
# 支持AR816x/AR817x/Killer E220x/Killer E2400/Killer E2500
https://github.com/Mieze/AtherosE2200Ethernet

# Qualcomm Atheros AR813x/815x
https://github.com/al3xtjames/AtherosL1cEthernet

# Atheros(R) AR81(31/32/51/52/61/62/71/72) PCI-E
# 适用于10.7-10.8
https://www.insanelymac.com/forum/topic/284119-experimental-atheros-ar813132515261627172-driver-for-107108/

也可尝试使用 ALXEthernet。

Aquantia

Aquantia 有线网卡驱动下载链接如下。

1
2
https://www.insanelymac.com/forum/topic/330614-aquantia-10-gb-ethernet-support-thread-10132-upwards/
https://www.insanelymac.com/forum/topic/330614-marvell-aquantia-10-gb-ethernet-support-thread/

无实际网卡

因为 Mac App Store、iCloud、FaceTime 和 iMessage 的正常工作要求在 en0 处具有内置以太网,因此,若无有线网卡,需将 NullEthernet.kext 放到 Clover 的 kexts 以模拟出一个有线网卡设备。下载链接如下。

1
https://bitbucket.org/RehabMan/os-x-null-ethernet/downloads/

网络端口重置

若以太网端口不在 en0,则需进入网络偏好设置,删除所有接口并应用。

然后删除/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist,重新启动后进入网络偏好设置,重新添加网络端口。

有线网卡内建

在 Clover 的 Devices 选项卡中选择 Properties,添加一个新设备,路径为通过 Hackintool 找到的有线网卡设备,并添加条目 built-in,数值为 01,类型为 DATA,重启即可。

如果用的是NullEthernet.kext,则打开Maciasl,复制以下内容并保存为SSDT-RMNE.aml,然后放入Clover的ACPI/patched中即可。

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
DefinitionBlock ("", "SSDT", 2, "RehabM", "RMNE", 0x00001000)
{
Device (RMNE)
{
Name (_ADR, Zero)
Name (_HID, "NULE0000")
Name (MAC, Buffer (0x06)
{
0x11, 0x22, 0x33, 0x44, 0x55, 0x66
})
Method (_DSM, 4, NotSerialized)
{
If ((Arg2 == Zero))
{
Return (Buffer (One)
{
0x03
})
}

Return (Package (0x0A)
{
"built-in",
Buffer (One)
{
0x00
},

"IOName",
"ethernet",
"name",
Buffer (0x09)
{
"ethernet"
},

"model",
Buffer (0x15)
{
"RM-NullEthernet-1001"
},

"device_type",
Buffer (0x09)
{
"ethernet"
}
})
}
}
}

免驱卡

免驱卡列表如下。

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
## Aquantia Series
# AppleEthernetAquantiaAqtion.kext
# 可能需要在Linux/Windows更新固件,保证Mac支持
pci1d6a,1 = Aquantia AQC107
pci1d6a,d107 = Aquantia AQC107
pci1d6a,7b1 = Aquantia AQC107
pci1d6a,80b1 = Aquantia AQC107
pci1d6a,87b1 = Aquantia AQC107
pci1d6a,88b1 = Aquantia AQC107
pci1d6a,89b1 = Aquantia AQC107
pci1d6a,91b1 = Aquantia AQC107
pci1d6a,92b1 = Aquantia AQC107
pci1d6a,c0 = Aquantia AQC113
pci1d6a,4c0 = Aquantia AQC113

## Intel Series
# AppleIntel8254XEthernet.kext
pci8086,1096 = Intel 80003ES2LAN
pci8086,100f = Intel 82545EM
pci8086,105e = Intel 82571EB/82571GB

# AppleIntelI210Ethernet.kext
pci8086,1533 = Intel I210
pci8086,15f2 = Intel I225LM (Added in macOS 10.15)

# Intel82574L.kext
pci8086,104b = Intel 82566DC
pci8086,10f6 = Intel 82574L

## Broadcom Series
# AppleBCM5701Ethernet.kext
pci14e4,1684 = Broadcom BCM5764M
pci14e4,16b0 = Broadcom BCM57761
pci14e4,16b4 = Broadcom BCM57765
pci14e4,1682 = Broadcom BCM57762
pci14e4,1686 = Broadcom BCM57766

无线网卡

Atheros

本机无线网卡为 Atheros AR9565,可用驱动由 corecapture.kext、CoreCaptureResponder.kext 和 IO80211Family.kext 组成,下载链接如下。

1
http://www.mediafire.com/file/2rjm76vro8ha28l/9565.zip/file

对于 macOS 10.14,把它们放入 Clover 的 kexts 中,重启电脑后无线网卡可用。

【进阶】更高版本系统

上述 kexts 在 Catalina 中需要放到 SLE 才能正常工作,在 Big Sur 中已不适用。Big Sur 中需要使用 HS80211Family.kext 和 AirPortAtheros40.kext,下载网站如下。

1
https://www.longzc.cn/index.php/archives/330

在 Catalina 中,也可尝试以下 kexts。

1
2
https://github.com/tj320442/AR9565-DW1707-macOS-10.15-Catalina
https://gitee.com/i320442/AR9565_DW1707/tree/master

对于 AR946X(AR9462&AR9463)、AR9485、AR9565,也可尝试 ATH9KFixup。

1
2
https://github.com/chunnann/ATH9KFixup
https://www.olarila.com/topic/9229-guide-wifi-atheros-ar9565-ar9462-ar9463-ar9485-on-mojave-and-catalina/

对于 AR242x、AR542x、AR5416、AR5418、AR9280-AR5BHB92、AR9285-AR5B95、AR9287-AR5B97、AR9380-AR5BXB112,可尝试 High Sierra 的 IO80211Family。

1
https://github.com/khronokernel/IO80211-Patches/blob/main/10.13.6-High-Sierra-Kexts/IO80211HighSierra.kext.zip
【过时】低版本系统

对于AR5B95/195/97/197,在High Sierra中可用以下kext。下载后解压并将kexts/ProbookAtheros.kext放置到引导器即可。

1
https://github.com/RehabMan/HP-ProBook-4x30s-DSDT-Patch/archive/master.zip

Intel

可尝试 Itlwm,支持 10.13 及更高版本。注意应当使用 itlwm.kext 或 AirportItlwm.kext,两者不能同时使用。推荐使用 itlwm.kext。

1
https://github.com/OpenIntelWireless/itlwm

支持列表如下。

1
https://openintelwireless.github.io/itlwm/Compat.html

该 kexts 会使 Intel 无线网卡识别为有线网卡,因此需要配合 HeliPort 客户端使用。

1
https://github.com/OpenIntelWireless/HeliPort
【进阶】使用AirportItlwm

若使用 AirportItlwm,则需要开启安全启动,具体可查看黑苹果的进阶操作中 OpenCore 的相关处理方法。

Broadcom

可尝试 AirportBrcmFixup,适用于 10.10 及更高版本,链接如下。

对于DW1820A/DW1830/DW1560,需添加启动参数brcmfx-country=#a和brcmfx-aspm。安装前先于BIOS中禁用WLAN/WIFI和Bluetooth,待安装系统成功后再行开启。

对于DW1820A,还需要在config.plist添加以下设备属性。如果想体验Sidecar/Apple Watch解锁功能,compatible可为pci14e4,43a0或者pci14e4,4353,以便驱动AirPortDriverBrcmNIC并开启相应功能。

Properties Key Properties Value Value Type
AAPL,slot-name WLAN STRING
compatible pci14e4,4353 STRING
device_type Airport Extreme STRING
model DW1820A (BCM4350) 802.11ac Wireless STRING
name Airport STRING

如果插上网卡后进入系统直接卡住,可添加引导参数-brcmfxoff 以暂时跳过网卡驱动的加载。

1
https://github.com/acidanthera/AirportBrcmFixup
【注意】BCM94350ZAE芯片组

BCM94350ZAE 芯片组在 macOS 中不正确支持电源管理,因此需要通过属性注入禁用。在引导器的设备部分添加无线网卡设备,并添加以下属性。

属性 类型
pci-aspm-default Data 00
【进阶】AirportBrcmFixup与BrcmWLFixup

BrcmWLFixup 已被整合到 AirportBrcmFixup。

【进阶】OC引导

对于OpenCore,kext注入顺序为AirportBrcmFixup-AirportBrcmFixup/Contents/Plugins/AirPortBrcm4360_Injector-AirportBrcmFixup/Contents/Plugins/AirPortBrcmNIC_Injector。

对于BCM94352z/DW1560,需使用AirportBrcmFixup和BrcmPatchRAM。BrcmPatchRAM链接如下。该方法适用于10.11至10.14系统。

1
https://github.com/acidanthera/BrcmPatchRAM

若蓝牙失效,则将BrcmFirmwareData.kext、BrcmPatchRAM2.kext、AirportBrcmFixup.kext复制到/Library/Extensions目录下,以解决睡眠唤醒后可能引起的蓝牙失效的问题。重启前需要重建系统的缓存。

也可尝试 BroadcomWiFiInjector。

【进阶】OC引导

对于 OpenCore,kext 注入顺序为 Injector-Data-RAM。

Realtek

对于 RTL8192CU,可采用以下链接。

1
https://drive.google.com/file/d/1ZtdMqlvKBbHULJhl1u9omuLOy6j0vx48/view

免驱卡

列表如下。

无线网卡型号 蓝牙型号 连接器型号 使用的Mac产品型号
BCM943602CDP 20703A1 U.FL Connector iMac16,x
iMac17,1
iMac18,x
BCM94360CD 20702B0 U.FL Connector iMac14,x
iMac15,x
MacPro6,1
BCM94331CD BRCM20702(05AC:828b) U.FL Connector iMac13,x
BCM94360CS2 BRCM20702(05AC:821f) MHF4 Connector MacBookAir5,x
MacBookAir6,x
MacBookAir7,x
BCM943224PCIEBT
BCM943602CS 20703A1 MHF4 Connector MacBookPro12,x
BCM94360CS 20702B0 MHF4 Connector Macmini7,x
MacBookPro11,x
BCM94360CSAX BRCM20702(05AC:828c) MHF4 Connector MacBookPro10,x
BCM94350 4350C1 MHF4 Connector MacBook8,1
BCM94350 20703A2 MHF4 Connector MacBookPro13,x
BCM94350 4350 MHF4 Connector MacBookPro14,x
BCM4364 4364B0 iMac19,x
Macmini8,1
MacBookPro15,x
iMacPro1,1 - 4364
MacPro7,1- 4364B3
BCM4355 MacBookAir8,1
以下为传统无线网卡
BCM4328 iMac5,1-9,1
MacBook3,1-4,1
MacBookAir1,1-2,1
BCM4321 MacPro2,1
Macmini4,1
BCM4322 MacBook5,1
MacBookPro5,1 and 7,1
MacBookAir3,1-5,1
MacPro5,1
BCM43224 MacBook6,1
MacBookPro6,1
BCM4331 Macmini5,x
MacBookPro8,x-10,x
AR242X/AR542X MacBook1,1
Macmini1,1-2,1
AR5418 MacBook2,1
AR928X iMac10,1-11,x
MacPro3,1
AR93XX iMac12,x

其它

对于 MT7610,可使用以下 kext。

1
https://d86o2zu8ugzlg.cloudfront.net/mediatek-craft/drivers/MT7612_7610U_D5.0.1.25_SDK1.0.2.18_UI5.0.0.27_20151209.zip

对于 RT5370,可使用以下 kext。

1
https://d86o2zu8ugzlg.cloudfront.net/mediatek-craft/drivers/RTUSB_D2870-4.2.9.2_UI-4.0.9.6_2013_11_29.zip

替代方法

对于无解的网卡,可以更换网卡、购买黑苹果 USB 网卡或者将手机作为热点。

USB 网卡可尝试以下驱动。

1
2
3
4
5
https://github.com/chris1111/WirelessAdapterCloverBigSur
https://github.com/chris1111/Wireless-USB-Adapter-Clover
https://github.com/chris1111/Wireless-USB-OC-Big-Sur-Adapter
https://github.com/chris1111/USB-Wireless-Utility
https://github.com/chris1111/WIFI-Dlink-Catalina-Panel-V2

对于 iPhone 用户,将手机接入电脑,手机开启个人热点功能,即可使用手机热点。对于 Android 用户,可安装hoRNDIS,然后将手机连接到电脑,开启安卓手机的 USB 网络共享即可。下载链接如下。

1
https://github.com/jwise/HoRNDIS

声卡

通过 AppleALC 驱动

寻找 Layout ID

保证系统SLE下有AppleHDA.kext,在Clover的kexts文件夹中放入AppleALC.kext。注意,该kext不能与VoodooHDA、RealtekALC、CloverALC、HDA Blocker、HDAEnabler1/2/3共用。下载链接如下。

1
https://github.com/acidanthera/AppleALC/releases

打开 Hackintool,切换到 Audio,通过下拉列表可查看该硬件支持的 Layout ID。在启动参数中添加以下参数,其中#为所查询到的 Layout ID 之一。

1
alcid=#

若为Windows/Linux与macOS双引导,则打开Clover的config.plist,在Devices选项卡勾选Audio项下的ResetHDA选项。

重启后检查声卡是否被驱动,可在终端运行以下命令。若三者都存在,则驱动成功。

1
kextstat | grep -E "AppleHDA|AppleALC|Lilu"

若无声,则可更换不同的 Layout ID。本机使用的 Layout ID 为 12。打开 IORegistryExplorer 并搜索 HDEF,若存在该设备,其下有 AppleHDAController,右侧属性中的 alc-layout-id 不是修补前默认的 07000000,且包含 AppleHDAInput 设备,则 AppleALC 已成功修补。

如果睡眠后机器无声,则还需要在 Clover 的 kexts 中放入 CodecCommander.kext。注意,尽管 Hackintool 提示该 kexts 已被合并到 AppleALC 中,但不放置时仍会出现问题。

1
https://github.com/Sniki/EAPD-Codec-Commander

写入 Layout ID

确保该Layout ID可用后,可将该配置写入Clover的配置文件中。打开Hackintool,切换到Audio,通过下拉列表选择Layout ID。切换到Intel-Patch,选择Devices/Properties,勾选Auto Detect Changes、Audio,点击Generate Patch生成声卡驱动补丁。完成后保存以替换。

也可手动生成设备信息。打开 Clover 的 config.plist,在 Devices 选项卡下选择 Properties。

先在左侧栏添加声卡的设备路径。可在 Hackintool 中查找,也可通过 gfxutil,命令如下。

1
2
3
gfxutil -f HDEF
gfxutil -f HDAS
gfxutil -f HDAU

然后右侧栏添加以下条目即可。

Properties Key Properties Value Value Type
alc-layout-id 21 NUMBER
hda-gfx onboard-1 STRING
AAPL,slot-name Internal STRING
【进阶】十进制与十六进制

若将 alc-layout-id 设置为 Data 类型,则为十六进制模式,且遵循小端规则。如 256 为 FF010000。

实现顺序

对于AppleALC,指定Layout ID的优先级顺序为启动参数alcid=#->配置文件Device Properties中的alc-layout-id属性(仅适用Apple硬件)->配置文件Device Properties中的layout-id属性(适用Apple/非Apple硬件)。

常见问题

【进阶】对于OC
同一布局在 Clover 起作用而 OpenCore 不起作用

一般是由于 IRQ 冲突,可尝试使用 SSDTTime 中的 SSDT-HPET 热补丁,链接如下。

1
https://github.com/corpnewt/SSDTTime
10.15 中由于电源状态更改导致的 kernel panic

在 OpenCore 的配置文件中设置 Kernel-Quirks-PowerTimeoutKernelPanic 为 True。

AppleALC 工作不一致

由于硬件没有及时初始化,可能会导致没有声音输出。添加以下启动参数即可,注意 ALC 延迟不能超过 3000 毫秒。

1
alcdelay=1000

或在设备属性中添加以下项。

Properties Key Properties Value Value Type
alc-delay 1000 NUMBER
双声卡时无声

需要让 AppleALC 忽略外部音频控制器。在外部音频控制器的设备属性中添加以下项即可。

Properties Key Properties Value Value Type
external-audio 01 Data
从 Windows 重启到 Mac 后无声

可添加启动参数alctsel=1,或在设备属性中添加以下项。

Properties Key Properties Value Value Type
alctsel 01000000 Data

通过 VoodooHDA 驱动

在 AMD 上运行 AppleALC 可能会不起作用,则可使用 VoodooHDA。下载 kext 并放到 Clover 中即可,链接如下。

1
2
https://sourceforge.net/projects/voodoohda/
https://github.com/chris1111/VoodooHDA-2.9.2-Clover-V14/releases

插孔检测

使用 JackFix 即可,支持 ResetHDA 和 3.5mm 耳机接口类型切换。

1
https://github.com/fewtarius/jackfix

键盘与鼠标

驱动

对于一般的 PS2 键盘,在 Clover 的 kexts 放入VoodooPS2Controller.kext,重启即可驱动。下载链接如下。

1
2
3
4
5
# 10.11及以上系统
https://bitbucket.org/RehabMan/os-x-voodoo-ps2-controller/downloads/

# 10.6及以上系统
https://github.com/acidanthera/VoodooPS2

对于 MSI GK-701 键盘,可用以下 kext。

1
https://github.com/osy/GK701HIDDevice

键位映射

安装Karabiner Elements,链接如下。

1
https://github.com/pqrs-org/Karabiner-Elements

打开后选择 Complex Modifications,点击 Add rule-Import more rules from the Internet,在网页中搜索并安装PC-Style ShortcutsPC-Style ModifiersAdobe Photoshop,并在添加的类别上点击 Enable All,完成键位映射调整。

USB

USB3 端口为九针,USB2 端口为四针。

端口限制解除补丁

macOS 规定 USB 端口的数量应少于 15 个,其中一个 USB3.0 的接口应按两个端口的配额计算。若端口数量大于 15 个,可能会导致系统无法启动,需用以下 kexts 补丁解除,在引导器的 config.plist 中添加即可。

注意,完成以下端口定制后,应当及时取消该补丁。

El Capitan

1
2
3
4
Comment: change 15 port limit to 26
Name: AppleUSBXHCIPCI
Find: 83BD8CFE FFFF10
Replace: 83BD8CFE FFFF1B

Sierra

1
2
3
4
Comment: Port limit increase
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83BD74FF FFFF10
Replace: 83BD74FF FFFF1B

或使用以下补丁。

1
2
3
4
Comment: change 15 port limit to 26
Name: AppleUSBXHCIPCI
Find: 83BD74FF FFFF10
Replace: 83BD74FF FFFF1B

High Sierra

对于 10.13.6,应使用以下补丁。

1
2
3
4
Comment: USB 10.13.6+ by PMHeart
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 837D880F 0F83A704 0000
Replace: 837D880F 90909090 9090

对于 10.13.4-10.13.5,应使用以下补丁。

1
2
3
4
Comment: USB 10.13.4+ by PMHeart
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 837D940F 0F839704 0000
Replace: 837D940F 90909090 9090

对于 10.13-10.13.3,应使用以下补丁。

1
2
3
4
Comment: change 15 port limit to 24
Name: com.apple.driver.usb.AppleUSBXHCIPCI
Find: 837D8C10
Replace: 837D8C1B

Mojave

对于 10.14.5-10.14.6,应使用以下补丁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Comment: USB Port Limit Patch 1 PMHeart/DalianSky
Name: com.apple.iokit.IOUSBHostFamily
Find: 83FB0F0F
Replace: 83FB3F0F

Comment: USB Port Limit Patch 2 PMHeart/DalianSky
Name: com.apple.iokit.IOUSBHostFamily
Find: 83E30FD3
Replace: 83E33FD3

Comment: USB Port Limit Patch 3 PMHeart/DalianSky
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83FB0F0F
Replace: 83FB3F0F

Comment: USB Port Limit Patch 4 PMHeart/DalianSky
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83FF0F0F
Replace: 83FF3F0F

对于 10.14.4,应使用以下补丁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Comment: USB Port Limit Patch 1 ©PMHeart
Name: com.apple.iokit.IOUSBHostFamily
Find: 83FB0F0F 870B0400 00
Replace: 83FB3F0F 870B0400 00

Comment: USB Port Limit Patch 2 ©PMHeart
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 4183FF0F 0F839404 0000
Replace: 4183FF3F 0F839404 0000

Comment: USB Port Limit Patch 3 ©PMHeart
Name: com.apple.iokit.IOUSBHostFamily
Find: 83E30FD3 E34109DF
Replace: 83E33FD3 E34109DF

对于 10.14-10.14.3,应使用以下补丁。

1
2
3
4
Comment: Port limit increase (Ricky)
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83FB0F0F 838F0400 00
Replace: 83FB0F90 90909090 90

Catalina

对于 10.15-10.15.1,应使用以下补丁。

1
2
3
4
5
6
7
8
9
Comment: USB port limit patch #1 10.15.x modify by DalianSky(credit ydeng)
Name: com.apple.iokit.IOUSBHostFamily
Find: 83FB0F0F
Replace: 83FB3F0F

Comment: USB Port limit patch #2 10.15.x modify by DalianSky
Name: com.apple.driver.usb.AppleUSBXHCI
Find: 83F90F0F
Replace: 83F93F0F

端口定制

在 Clover 下放置 USBInjectAll.kext,下载链接如下。

1
https://bitbucket.org/RehabMan/os-x-usb-inject-all/downloads/

确保cofig.pilst的ACPI更名中已应用EHC1->EH01、EHC2->EH02以及XHCI/XHC1->XHC_补丁。然后通过以下方法之一处理。

【进阶】USBInjectAll适用范围及驱动原理

USBInjectAll 在桌面版 Skylake 及更新平台上无需使用,但在 Coffee Lake 及更旧平台的笔记本上则推荐使用。AsRock 主板也推荐使用。注意,该 kext 完全不支持 AMD CPU,需要 10.11 及以上版本。

USBInjectAll.kext以数据驱动方式进行编码。在kext代码本身中没有任何硬编码,所有数据都包含在Info.plist中。USBInjectAll.kext启动时,会在EH01/EH02/XHC或连接到EH01/EH02端口1的内部集线器上进行匹配,查询Info.plist中与它所连接的设备相关的配置数据,并注入找到的数据。

通过 Hackintool

打开 Hackintool,点击 USB,确保芯片组已被正确识别。把所有端口删除后刷新,然后分别取 USB3 与 USB2 的可移动设备对每一个接口进行插拔,每插拔一次设备将出现一个条目的改变,记录对应端口名称及 USB 类型,如下表所示。注意,TypeC 接口需要正反各插拔一次。

注意,USB2(HSxx)占用一条 USB 线路,USB3、TypeC、TypeC+Sw(SSxx)占用两条 USB 线路。Mac 最多支持占用 15 条 USB 线路,若超过则需要取舍。

设备类型 端口类型
永久连接设备的USB端口(如蓝牙) Internal
与USB3端口相连的HSxx端口(USB2) USB3
内部集线器(通常连接到端口PR11和PR21) Internal
TypeC正反插端口一致 TypeC+Sw
TypeC正反插端口不一致 TypeC

完成后导出,将SSDT-EC.aml、SSDT-UIAC.aml和SSDT-USBX.aml放到Clover的ACPI/patched下。或将SSDT-EC.aml和USBPorts.kext分别放置到ACPI/patched和kexts/Other下。若放置的是SSDT,则需保留USBInjectAll.kext,若为SSDT+kext则需删除。

重启后若需检测是否成功,可插入USB3.0设备,通过系统报告查看速率是否为5G/s。或使用IOregistryExplorer,搜索XHC,可查看所有端口是否都已正常工作。

通过 USBMap

打开终端并运行以下命令以打开脚本。

1
2
3
git clone https://github.com/corpnewt/USBMap
cd USBMap
chmod +x USBMap.command

脚本打开后会核查 USBInjectAll 是否被正确加载、USB 控制器是否被正确识别。脚本需要 USBInjectAll 的版本在 0.70 以上。若已完成放置但无法识别,则可能还需要 XHCI_unsupported.kext。

若端口数量大于 15 个,则需要应用端口解除补丁或在脚本主菜单上选择S. Exclude SSxx PortsH. Exclude HSxx Ports端口以禁用 SSxx(一般为 USB3.0)或 HSxx(一般为 USB2.0)端口,完成后重启。若需要取消禁用,则选择C. Clear Exclusions

选择D. Discover Ports,脚本将读取默认 USB 列表。依次将每个端口用 USB 设备插拔,过程与使用 Hackintool 相同。每发现新的端口会有提示,直接忽略即可。完成后按Q并回车,返回主菜单。

选择P. Edit Plist & Create SSDT/Kext,可以看到刚才所识别的结果。需根据实际情况修改端口类型,数字代号与端口类型对应关系如下。设置要求与使用Hackintool一致。

数字 含义
0 (0x0) (USB2.0)Type A connector
1 Mini-AB connector
2 ExpressCard
3 (0x3) (USB3.0)USB 3 Standard-A connector
4 USB 3 Standard-B connector
5 USB 3 Micro-B connector
6 USB 3 Micro-AB connector
7 USB 3 Power-B connector
8 Type C connector - USB2-only
9 (0x9) (TypeC+Sw)Type C connector - USB2 and SS with Switch
10 Type C connector - USB2 and SS without Switch
11-254 Reserved
255 (0xFF) (Internal)Proprietary connector

若需要将编号为 5 和 7 的端口改为 USB2.0 接口,则输入以下命令并回车。

1
2
# T表示现在要更改端口的类型(Type),0表示端口类型
T:5,7:0

也可直接用plist编辑器打开脚本编辑,一般在用户目录/USBMap/Scripts中。

设置完成后可选择K. Build USBMap.kextS. Build SSDT-UIAC,其中第一种需把生成的kext复制到Clover的kexts目录下且删除USBInjectAll,而第二种需把生成的SSDT复制到Clover的ACPI/patched下且保留USBInjectAll。推荐第二种。

注意,在按下创建SSDT之前,可以调节SSDT的形式,默认为三个SSDT,可设置为一个SSDT。生成的所有文件都在USBMap/Results中。

通过 SSDT

打开 IORegistryExplorer 并查找 XHC、EHC、EUSB 或 USBE,查看端口情况。

若设备不为XHC/EHC,则需要先在Clover中写入重命名。以设备为XHC1为例,需要change XHC1 to XHC_重命名,即58484331->5848435F。

打开 MaciASL 并新建文件,复制以下代码模版。其中 8086_a12f 需替换为 USB 总线的VendorID_DeviceID,可在关于本机-硬件报告的 USB 一项查看,如 Device ID 为 0xa2af,Vendor ID 为 0x8086,则应当修改为 8086_a2af。

“ports”以下的大括号需填写所有的端口,其中数字 255 表示 Internal,10 表示正反插时端口不同的 USBC,9 表示正反插时端口相同的 USBC,3 表示 USB3,0 表示 USB2。

"port", Buffer() { 0xNN, 0, 0, 0 },中的 0xNN 表示端口地址,可在 IORegistryExplorer 中点击相应端口并查找 Data,查看 port 一项即可。"port-count", Buffer() { 0xNN, 0, 0, 0},中的 0xNN 应当修改为使用的最高 SS 端口地址。

注意,SS 端口的地址开始于最后一个 HS 端口地址之外。因此 HS 地址为0x01,0,0,0的物理 USB 端口将在0x11,0,0,0处具有等效的 SS 端口。

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
DefinitionBlock ("SSDT-USB.aml", "SSDT", 1, "sample", "USBFix", 0x00003000)
{
Device(UIAC)
{
Name(_HID, "UIA00000")
Name(RMCF, Package()
{
// 修改为VendorID_DeviceID
// 以下填写所有的端口
"8086_a12f", Package()
{
// 0xNN修改为使用的最高SS端口地址
"port-count", Buffer() { 0xNN, 0, 0, 0},
"ports", Package()
{
"HS01", Package()
{
// 0-USB2,3-USB3,255-Internal
"UsbConnector", 255,
// 0xNN修改为该端口地址
"port", Buffer() { 0xNN, 0, 0, 0 },
},

"SS01", Package()
{
"UsbConnector", 3,
"port", Buffer() { 0xNN, 0, 0, 0 },
},
},
},
})
}
}

完成后保存文件为 SSDT_USB.aml,并放置在引导器的 ACPI 部分。重启系统后打开 IORegistryExplorer,检查端口是否正确显示,其中小三角形表示插入的设备。

【进阶】对于ASUS 100系列的处理

该系列主板也可不使用 USBInjectAll,直接使用 SSDT。提取主机 SSDT 并打开包含 xh_rvp 的文件,开头修改为如下。

1
DefinitionBlock ("SSDT-4", "SSDT", 2, "INTEL", "xh_rvp08", 0x00000000)

Name (USSD, Package (0x10)下定义了所有的端口,其中每一行代表一个端口,One 表示启用,Zero 表示禁用。同理,在Name (UHSD, Package (0x10)下,One 表示活动,Zero 表示非活动。

禁用端口需要修改_UPC 的返回值。以 HS11 为例,源代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
Scope (\_SB.PCI0.XHC.RHUB.HS11)
{
Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities
{
Return (GUPC (One))
}

Method (_PLD, 0, NotSerialized) // _PLD: Physical Location of Device
{
Return (GPLD (DerefOf (Index (UHSD, 0x0A)), 0x0B))
}
}

修改如下。

1
2
3
4
5
6
7
8
9
10
11
12
Scope (\_SB.PCI0.XHC.RHUB.HS11)
{
Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities
{
Return (GUPC (Zero))
}

Method (_PLD, 0, NotSerialized) // _PLD: Physical Location of Device
{
Return (GPLD (DerefOf (Index (UHSD, 0x0A)), 0x0B))
}
}

完成后保存SSDT为SSDT-4.aml,放置到Clover的ACPI/patched目录下。Clover需要将该SSDT与当前的SSDT合并,并将修改部分替换,该工作被称为Automerge。在r4428及更新版本,Automerge已被正确设置,在旧版本则需要以文本方式打开config.plist,并添加以下内容。

若放置了 USBInjectAll,则将其删除。

1
2
3
4
5
6
7
8
<dict>
<key>ACPI</key>
<dict>
<key>AutoMerge</key>
<true/>
<key>DSDT</key>
<dict>
...

修复唤醒断线

在 Clover 的 kexts 文件夹放入 USBPower.kext,下载链接如下。

1
https://blog.xjn819.com/wp-content/uploads/2019/10/USBPower.kext_.zip

在kext上右键选择显示包内容,打开Contents/Info.plist,展开IOKitPersonalities_x86_64,将iMac19,1改成正在使用的机型,保存并重启即可。

修复 USB 导致的关机

下载以下文件,放置到引导器的ACPI/hotpatch部分即可。

1
https://github.com/khronokernel/Opencore-Vanilla-Desktop-Guide/blob/master/extra-files/FixShutdown-USB-SSDT.dsl

蓝牙

Atheros

本机蓝牙为与无线网卡 Atheros AR9565 共建的 Bluetooth 4.0。打开以下链接并下载,直接放到 Clover 的 kexts 文件夹即可。

1
https://github.com/zxystd/AthBluetoothFirmware
【进阶】OC引导

对于 OpenCore,放置到 Kexts 文件夹后需要在 config.plist 中添加对应条目,注意 Ath3kBTInjector 必须加载在 Ath3kBT 后面。

Intel

可尝试 IntelBluetoothFirmware,支持 10.13 及更高版本。

1
https://github.com/OpenIntelWireless/IntelBluetoothFirmware

Broadcom

对于 USB 蓝牙,可尝试 BrcmPatchRAM。

1
https://github.com/acidanthera/BrcmPatchRAM

对于 DW1820A,可使用以下 kexts。如果蓝牙睡眠唤醒后无法工作,需要添加引导参数 bpr_probedelay=100、bpr_initialdelay=300、bpr_postresetdelay=300。

1
2
3
4
5
# 10.14及以下
https://images.daliansky.net/d/YmBXVA8q/blog/DW1820A/DW1820A_BT_for_Mojave_v2.5.5.zip

# 10.15及以上
https://images.daliansky.net/d/YmBXVA8q/blog/DW1820A/DW1820A_BT_for_Catalina_and_BigSur_v2.5.5.zip
【进阶】OC引导

对于 OpenCore,kext 注入顺序为 BrcmBluetoothInjector-BrcmFirmwareData-BrcmPatchRAM3。

启用蓝牙关闭按钮

已过时。

找到SLE下的IOBluetoothFamily.kext,复制到桌面后右键单击显示包内容,进入Contents/PlugIns,在BroadcomBluetoothHostControllerUSBTransport.kext上右键单击显示包内容,打开Contents/info.plist。用搜索功能搜索2652,修改idProduct和idVendor为自己的ID,注意需进行进制转换。从Windows上得到的是十六进制,需转换为十进制,可利用下面的进制转换工具。

1
http://tool.oschina.net/hexconvert/

将修改好的 IOBluetoothFamily.kext 用 Kext Utility 进行安装,重启即可。注意,此法可以实现蓝牙关闭,但需要从 Windows 重启进入 Mac 后才可用。

冷启动与热启动

冷启动指从关机状态下进入系统,热启动指从一个系统重启至另一个系统。

少数蓝牙设备中嵌入了蓝牙所需的固件,因此它们开机即可直接使用。但是许多设备依靠固件上载器才能正常运行,此过程中,系统启动蓝牙设备的电源,固件上传器检测到该设备已打开电源,然后将固件发送(上传)到缓冲区中。

由于Mac无法加载相关蓝牙固件,即使设备被正确识别,也无法与任何其他外围设备配对。热启动时,Windows/Linux已完成固件上传,重启时缓冲区固件仍存在,因此蓝牙能够起作用。而冷启动时将重置蓝牙设备,导致上载固件的丢失。

蓝牙无法驱动的替代方案

可通过 Linux 虚拟机完成蓝牙固件上传操作。

从Clover的kexts文件夹删除BrcmPatchRAM.kext和BTFirmwareUploader.kext。以Ubuntu为例,下载镜像后打开Vmware Fusion,新建虚拟机并选择Ubuntu系统,CD/DVD驱动器选择刚才的镜像,完成配置。

关闭虚拟机,切换到虚拟机设置页。选择USB和蓝牙首选项,取消选中与Linux共享蓝牙设备,列表中将出现一个蓝牙设备。返回主界面并点击启动磁盘,选择CD/DVD为启动项,退出设置并启动虚拟机。

镜像引导成功后,选择试用 Ubuntu。待开机完成后,点击虚拟机的蓝牙选项以将蓝牙设备连接至 Ubuntu。等待 4-5 秒钟后取消蓝牙连接,固件已由虚拟机上传完成,蓝牙将正常运行。关闭虚拟机,VMware 将保存计算机状态,只要不让机器进入睡眠或重启状态,就可以使用蓝牙。

如果在睡眠/重新启动后失去了蓝牙功能,重新打开虚拟机,连接再断开蓝牙即可。

也可通过以下 TinyCore 虚拟机,使用方法同 Ubuntu。

1
https://drive.google.com/file/d/1Ydm7Hd0d5XOKQkb02EMpm-6E-WQFiMkh/view

传感器

在 Clover 的 kexts 下放入 VirtualSMC 包内的SMCLightSensor.kextSMCProcessor.kextSMCSuperIO.kext即可。

电池

【进阶】对于Big Sur

Big Sur 可能已经无须进行以下修补。

环境配置

在 Clover 的 kexts 中放入 VirtualSMC 包的 SMCBatteryManager.kext。打开 Maciasl,若出现错误提示,则检查 Clover 的 config.plist,Acpi-Fixs 下所有选项都应取消勾选。若仍然不行,则换另一个版本的 MaciASL。

修改 DSDT

查找字段

打开 MaciASL,正常情况下自动打开系统的 DSDT。搜索EmbeddedControl。可能会有一到多个,注意包含 EC 字样的那一个,记住其名称,本机为EC0R

搜索Field ([EC名称],本机为Field (EC0R。查看Field里所有大于8的元素,全部进行记录后,逐个搜索它们的名字。若查找结果只有一处,表明此变量仅被定义但未被使用,因此可以将此字段从记录结果中删除,否则将此字段保留。记录时需注明每个字段的对应位数(16位/32位/大于32位)。

点击Patch,复制下列代码,确认下面 Change(s)处的数字不为零后点击Apply-Close

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加B1B2方法,用于16位字段拆分
into method label B1B2 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B2, 2, NotSerialized)\n
{\n
Return(Or(Arg0, ShiftLeft(Arg1, 8)))\n
}\n
end;

# 添加B1B4方法,用于32位字段拆分
into method label B1B4 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B4, 4, NotSerialized)\n
{\n
Store(Arg3, Local0)\n
Or(Arg2, ShiftLeft(Local0, 8), Local0)\n
Or(Arg1, ShiftLeft(Local0, 8), Local0)\n
Or(Arg0, ShiftLeft(Local0, 8), Local0)\n
Return(Local0)\n
}\n
end;
【拓展】方法原理

对于 B1B2,Arg0 和 Arg1 为拆分后的两个 8 位寄存器。取 Arg0 作为低 8 位,将 Arg1 运用左移运算变成 16 位数据,此时它的的低 8 位全是 0,再运用或运算拼接成完整的 16 位数据。B1B4 同理。

【进阶】其它方法

W16B 方法如下,将拆分后的两个 8 位寄存器 Arg0 和 Arg1 合并后写入到 Arg2。

1
2
3
4
5
Method (W16B, 3, NotSerialized)
{
Arg0 = Arg2
Arg1 = (Arg2 >> 0x08)
}

16/32位的字段需要拆分成多个8位的字段,而大于32位的字段需要修改其偏移地址。

【提示】注意事项

如果某个寄存器被全局定义过,例如在根路径\\_SB路径下的 Field 里面有相同名字的寄存器,那么搜索该寄存器被调用情况时应注意区分此处的调用是不是 EC 下的这一个,如果不是,说明此处调用使用的是全局定义,对 EC 没有影响,不需要记录下来。

16/32 位字段处理

对于16/32位的字段,需要拆分成2/4个8位字段。

HWAK, 16为例。这是个 16 位的字段,可以拆分成两个 8 位的字段,分别命名为AK00AK01。命名可以随意,但是要确保命名为 4 个字符,且这个命名没有出现过,如下。

1
2
3
4
5
6
# 拆分前
HWAK, 16

# 拆分后
AK00, 8
AK01, 8

然后需要写出以下类似正则表达式的代码,以替换 DSDT 里的字段。

1
into device label EC code_regex HWAK,\s+16, replace_matched begin AK00,8,AK01,8, end;

相关含义解释如下,内容均根据自己的 DSDT 代码替换。

内容 含义
EC 搜索EmbeddedControl,在其上方的Device(不是Field里的参数)
HWAK,\s+16, 拆分前的字段(\s+表示多个空格,故此句含义为搜索HWAK, 16,)
AK00,8,AK01,8, 拆分后的字段

把写好的正则表达式复制到Patch里,在中间的Before/After和下面的Patch/Change两个地方都显示内容后,点击Apply-Close即完成一个变量的替换。

再以SBCH, 32为例。

1
2
3
4
5
6
7
8
# 拆分前
SBCH, 32

# 拆分后
CH00, 8
CH01, 8
CH02, 8
CH03, 8

正则表达式如下。

1
into device label EC code_regex SBCH,\s+32 replace_matched begin CH00,8,CH01,8,CH02,8,CH03,8 end;

注意,所替换的AK00,8,AK01,8,逗号前后均无空格。若所替换的字段为列表中的最后一个,则 Patch 时会提示 0 change(s),此时应该把正则表达式中的XSN1,\s+16,改为XSN1,\s+16,因最后一个字段没有逗号。

点击 Compile,此时会出现报错,除 Errors 以外的不需要理会。对于报错内容为 Object does not exist 的情况,主要是替换字段名后,没有替换访问该字段的位置所导致。

双击报错信息以定位至错误位置,向上检索以找到该段代码包含在哪个 method 里。

对于 16 位的字段,使用下面的正则表达式。

1
into method label \_WAK code_regex \(HWAK, replaceall_matched begin (B1B2(AK00,AK01), end;

相关含义解释如下,内容均根据自己的 DSDT 代码替换。注意,名字首位为_时,需要手动添加起始符\,如_WAK应写为\_WAK

内容 含义
\_WAK 代码对应的method
\(HWAK, 替换前的字段
(B1B2(AK00,AK01), 替换后的字段

对于 32 位的字段则使用下列表达式。

1
into method label GBIF code_regex \(SBCH, replaceall_matched begin (B1B4(CH00,CH01,CH02,CH03), end;

若出现\_SB.PCI0.LPC.EC.HWAK调用的特殊情况,修改替换字段即可。

1
into method label \_WAK code_regex \(\\\_SB.PCI0.LPC.EC.HWAK replaceall_matched begin \(\\_SB.B1B2(\\_SB.PCI0.LPC.EC.AK00, \\_SB.PCI0.LPC.EC.AK01) end;
【进阶】16/32位寄存器拆分读取/写入

修改 16 位寄存器拆分读取的语法如下,其中 Arg0、Arg1 为拆分后的两个 8 位寄存器名称。

1
B1B2 (Arg0, Arg1)

示例如下。

1
2
3
4
5
# 修改前
If ((^^PCI0.LPCB.EC0.BADC < 0x0C80))

# 修改后
If ((B1B2 (^^PCI0.LPCB.EC0.ADC0, ^^PCI0.LPCB.EC0.ADC1) < 0x0C80))

修改 16 位寄存器拆分写入的语法如下,其中 Arg0、Arg1 为拆分后的两个 8 位寄存器名称,Arg2 为被写入的数值或数据对象。

1
W16B (Arg0, Arg1,Arg2)

示例如下。

1
2
3
4
5
# 修改前
SMW0 = Arg3

# 修改后
W16B (MW00, MW01, Arg3)

修改 32 位寄存器拆分读取的语法如下,其中 Arg0、Arg1、Arg2、Arg3 为拆分后的四个 8 位寄存器名称。

1
B1B4 (Arg0, Arg1, Arg2, Arg3)

示例如下。

1
2
3
4
5
# 修改前
If ((B1CH == 0x0050694C))

# 修改后
If ((B1B4 (BC0H, BC1H, BC2H, BC3H) == 0x0050694C))

修改 32 位寄存器读取的语法如下,其中 Offset 为原寄存器的偏移量,Length 为原寄存器的长度。

1
RECB (Offset, Length)

示例如下。

1
2
3
4
5
6
7
8
9
# 原始定义
Offset (0x8F),
B1MA, 64,

# 修改前
IFMN = B1MA

# 修改后
IFMN = RECB (0x8F, 0x40)

修改 32 位以上寄存器写入的语法如下,其中 Offset 为原寄存器的偏移量,Length 为原寄存器的长度,Obj 为被写入的值或者数据对象。

1
WECB (Offset, Length, Obj)

示例如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 原始定义
Offset (0x18),
SMPR, 8,
SMST, 8,
SMAD, 8,
SMCM, 8,
SMD0, 256,

# 修改前
SMD0 = FB4

# 修改后
WECB (0x1C, 0x0100, FB4) // 0x1C=0x18+0x04

超过 32 位字段处理

先 Patch 下面的两段代码,其中 H_EC 改成计算机的 Device。

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
// 改的字段挨着左括号时所用代码(读操作)
into method label RE1B parent_label H_EC remove_entry;
into method label RECB parent_label H_EC remove_entry;

into device label H_EC insert
begin
Method (RE1B, 1, NotSerialized)\n
{\n
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
Return(BYTE)\n
}\n
Method (RECB, 2, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
{\n
ShiftRight(Arg1, 3, Arg1)\n
Name(TEMP, Buffer(Arg1) { })\n
Add(Arg0, Arg1, Arg1)\n
Store(0, Local0)\n
While (LLess(Arg0, Arg1))\n
{\n
Store(RE1B(Arg0), Index(TEMP, Local0))\n
Increment(Arg0)\n
Increment(Local0)\n
}\n
Return(TEMP)\n
}\n
end;

// 改的字段挨着右括号时所用代码(写操作)
into method label WE1B parent_label H_EC remove_entry;
into method label WECB parent_label H_EC remove_entry;
into device label H_EC insert
begin
Method (WE1B, 2, NotSerialized)\n
{\n
OperationRegion(ERAM, EmbeddedControl, Arg0, 1)\n
Field(ERAM, ByteAcc, NoLock, Preserve) { BYTE, 8 }\n
Store(Arg1, BYTE)\n
}\n
Method (WECB, 3, Serialized)\n
// Arg0 - offset in bytes from zero-based EC\n
// Arg1 - size of buffer in bits\n
// Arg2 - value to write\n
{\n
ShiftRight(Add(Arg1,7), 3, Arg1)\n
Name(TEMP, Buffer(Arg1) { })\n
Store(Arg2, TEMP)\n
Add(Arg0, Arg1, Arg1)\n
Store(0, Local0)\n
While (LLess(Arg0, Arg1))\n
{\n
WE1B(Arg0, DerefOf(Index(TEMP, Local0)))\n
Increment(Arg0)\n
Increment(Local0)\n
}\n
}\n
end;
【拓展】方法原理

对于左括号的代码如下。对于 RECB,Arg0 是原寄存器的偏移量(即 Offset),Arg1 是原寄存器的长度。对于 RE1B,Arg0 是偏移量。

RECB 通过 Arg1 确定需要拆分的 8 位寄存器个数,通过 While 循环及偏移量自增方法调用 RE1B 从 Field 中循环读取出每个 8 位数据,并拼接成原始寄存器定义长度的数据返回结果。

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
Method (RE1B, 1, NotSerialized)
{
OperationRegion (ERM2, EmbeddedControl, Arg0, One) // 作用域为EmbeddedControl,Arg0定义起始偏移量
Field (ERM2, ByteAcc, NoLock, Preserve)
{
BYTE, 8 // 指定一个8位寄存器映射对应区域数据
}

Return (BYTE) // 返回结果
}

Method (RECB, 2, Serialized)
{
Arg1 = ((Arg1 + 0x07) >> 0x03) // 计算Arg1除8并向上取整,位移运算更快
Name (TEMP, Buffer (Arg1){}) // 初始化作为返回值的Buffer
Arg1 += Arg0 // 加上偏移量,即循环终止值
Local0 = Zero // 定义Buffer索引为0
While ((Arg0 < Arg1)) // 进行循环,循环次数为初次计算的Arg1
{
TEMP [Local0] = RE1B (Arg0) // 调用RE1B依次返回8位数据
Arg0++ // 偏移量自增
Local0++ // 索引自增
}

Return (TEMP) // 返回最终结果
}

对于右括号的代码如下。对于 WECB,Arg0 是原寄存器的偏移量(即 Offset),Arg1 是原寄存器的长度,Arg2 为被写入的数据或对象。对于 WE1B,Arg0 是偏移量,Arg1 为从 Buffer 取出的一个字节数据(即 8 位长度数据)。

WECB 通过 Arg1 确定需要拆分的 8 位寄存器个数,创建 Buffer 对象将 Arg2 转化为若干个字节的数据(一个字节等于 8 位),通过 While 循环以及偏移量自增方法调用 WE1B,向 Field 中循环写入每个 8 位数据。

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
Method (WE1B, 2, NotSerialized)
{
OperationRegion (ERM2, EmbeddedControl, Arg0, One) // EmbeddedControl为EC作用域,Arg0定义起始偏移量
Field (ERM2, ByteAcc, NoLock, Preserve)
{
BYTE, 8 // 指定一个8位寄存器映射对应区域数据
}

BYTE = Arg1 // 将Arg1通过寄存器间接写入对应区域
}

Method (WECB, 3, Serialized)
{
Arg1 = ((Arg1 + 0x07) >> 0x03) // 计算Arg1除8并向上取整,位移运算更快
Name (TEMP, Buffer (Arg1){}) // 初始化作为写入值的Buffer
TEMP = Arg2 // 将被写入的数据或对象赋值给TEMP
Arg1 += Arg0 // 加上偏移量,即循环终止值
Local0 = Zero // 定义Buffer索引为0
While ((Arg0 < Arg1)) // 进行循环,循环次数为初次计算的Arg1
{
WE1B (Arg0, DerefOf (TEMP [Local0])) // 调用WE1B依次写入8位数据
Arg0++ // 偏移量自增
Local0++ // 索引自增
}
}

有些笔记本的 EC 使用 SystemMemory 作用域,则 EC、RE1B 和 WE1B 的 Field 起始偏移量也需要加上原始定义数值,可参照如下所示代码进行修改。

1
2
3
4
5
6
7
8
9
10
Scope (_SB.PCI0.LPCB.EC0)
{
OperationRegion (ERAX, SystemMemory, 0xFE708300, 0x0100)
Field (ERAX, ByteAcc, Lock, Preserve)
{
···
Method (RE1B, 1, NotSerialized)
{
Local0 = (0xFE708300 + Arg0)
OperationRegion (ERM2, SystemMemory, Local0, One)

计算大于 32 位字段的偏移量,逢八进一,从起始值往下算。以下面的代码为例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Offset (0x04),
CMCM, 8, // 0x04
CMD1, 8, // 0x05=0x04+1(8位是1字节)
CMD2, 8, // 0x06
CMD3, 8, // 0x07
Offset (0x18), // 这里空了一些,按开头所给出的偏移量计算
Offset (0x19),
SMST, 8, // 0x19
MBMN, 80, // 0x1A
MBPN, 96, // 0x25=0x1A(上一个的起始地址)+A(80/8=10,上一个占了10个字节,16进制表示即为A)+1
GPB1, 8, // 0x32=0x25+C(96位占了12个字节,16进制表示即为C)+1
GPB2, 8, // 0x33
GPB3, 8, // 0x34
GPB4, 8, // 0x35

搜索DSDT中该字段被调用的地方。不同于16/32位字段的处理,超过32位的字段只需用偏移量和该字段位数代替字段本身。

若所替换字段挨着左括号,需要使用 RECB,即处理读操作。以Store(MBMN, XXXX) 改为Store(RECB(0x1A, 80), XXXX)为例,利用下列正则表达式进行替换,Patch 即可。

1
into method label XXXX code_regex \(SBMN, replaceall_matched begin (RECB(0xA0,128), end;

相关含义解释如下,内容均根据自己的 DSDT 代码替换。

内容 含义
XXXX 代码对应的method
\(SBMN, 替换前的字段
(RECB(0xA0,128), 替换后的字段,其中0xA0为所计算出来的偏移量,128为位数

若所替换字段挨着右括号,需要使用 WECB,即处理写操作。以Store (Arg3, \_SB.PCI0.LPCB.EC0.SMD0)改为Store (Arg3, \_SB.PCI0.LPCB.EC0.WECB(0x1C,264,Arg3)为例,则利用下列正则表达式进行替换。

1
into method label SMRW code_regex Store\s\(Arg3,\s\\_SB.PCI0.LPCB.EC0.SMD0\) replaceall_matched begin \\_SB.PCI0.LPCB.EC0.WECB(0x1C,264,Arg3) end;

应用修改

再次点击Compile,确认无Error后,点击菜单File-Save As,类型选ACPI Machine Language Binary,名称为DSDT.aml。保存后复制到CLOVER/ACPI/patched,重启即可。

说明

正则表达式写法

16 位和 32 位的区别在于,16 位会调用 B1B2 方法,而 32 位会调用 B1B4 方法。因此正则表达式的基本格式如下。

1
2
3
4
5
6
7
8
9
// 16位字段
into method label [代码对应method] code_regex [替换前的字段,需要包含逗号] replaceall_matched begin (B1B2[替换后的字段,需要包含逗号] end;

// 32位字段
into method label [代码对应method] code_regex [替换前的字段,需要包含逗号] replaceall_matched begin (B1B4[替换后的字段,需要包含逗号] end;

// 特殊字段的处理(把整个地址复制进去即可)
B1B2(特殊字段1,特殊字段2)
B1B4(特殊字段1,特殊字段2,特殊字段3,特殊字段4)

补丁结构

将前面所有 Patch 过的代码放到一起,即称为本机的电量补丁,示例如下。

注意,前面所有通过正则表达式的操作,其实可以直接在原文件上修改,而不必通过 Patch 的方式。通过 Patch 方式主要是便于补丁整合与传播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 字段拆分
into device label EC0 code_regex B0C3,\s+16, replace_matched begin C3HG,8,C3HF,8, end;
into device label EC0 code_regex B0SN,\s+16, replace_matched begin BSVN,8,BSVM,8, end;
into device label EC0 code_regex B1SN,\s+16 replace_matched begin SBUY,8,SBUP,8 end;

// 替换调用方法
into method label _BIX code_regex \(B0C3, replaceall_matched begin (B1B2(C3HG,C3HF), end;
into method label BIFA code_regex \(B0SN, replaceall_matched begin (B1B2(BSVN,BSVM), end;
into method label BIFA code_regex \(B1SN, replaceall_matched begin (B1B2(SBUY,SBUP), end;

// 数据处理方法
into method label B1B2 remove_entry;
into definitionblock code_regex . insert
begin
Method (B1B2, 2, NotSerialized)\n
{\n
Return(Or(Arg0, ShiftLeft(Arg1, 8)))\n
}\n
end;

Mutex 置零检查及修复

检查

有些机器的 Mutex(互斥体,用于处理多线程同步)对象的 SyncLevel(同步等级)不为 0,这种情况下 macOS 无法正常执行多线程同步,造成的结果是电池状态等可能无法获取(如果电池相关的 Method 处于不同的同步等级,在 macOS 下会造成数据获取的异常,出现 0%的情况),此时应打上 Mutex 置 0 补丁来解决。

绝大多数笔记本 ACPI 的 Mutex 都是默认置 0 的,但是一些联想品牌的笔记本往往有几个 Mutex 的 SyncLevel 并不是 0。因此,在完成电池补丁后应检查 Mutex 是否属于这种情况。

在 DSDT 中搜索 Mutex,看出现的几个对象的 SyncLevel 是否为 0 即可。

修复

可通过 ACPI 更名的方式。以 Mutex (BATM, 0x07)为例,先转换 BATM 为十六进制代码,得到 42 41 54 4D。在前后加上完整定义的十六进制代码,最终得到 01 42 41 54 4D 07,其中 01 代表 Mutex,07 代表 SyncLevel 的 0x07。目的是使 Mutex 对象置 0,因此更名如下。

1
2
3
Comment: Set Mutex BATM, 0x07 to 0x0
Find: 01424154 4D07
Repalce: 01424154 4D00

也可通过 Fix Mutex with non-zero SyncLevel 补丁。打开 MaciASL,点击 Patch,在左侧资源树中选择_RehabMan Laptop-[sys]Fix Mutex with non-zero SyncLevel,点击 Apply-Close 即可。

若没有该资源,则需要在偏好设置中添加补丁来源。常见补丁来源如下。

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
# _RehabMan Laptop
http://raw.github.com/RehabMan/Laptop-DSDT-Patch/master

# _OS-X-ACPI-Debug
http://raw.github.com/RehabMan/OS-X-ACPI-Debug/master

# _VoodooI2C-Patches
http://raw.github.com/alexandred/VoodooI2C-Patches/master

# Sourceforge
http://maciasl.sourceforge.net

# Gigabyte
http://maciasl.sourceforge.net/pjalm/gigabyte

# ASUS
http://maciasl.sourceforge.net/pjalm/asus

# Audio HDMI 5 Series
https://raw.github.com/toleda/audio_hdmi_5series/master

# Audio HDMI HD3000/Sandy Bridge/6 Series
https://raw.github.com/toleda/audio_hdmi_hd3000/master

# Audio HDMI HD4000/Ivy Bridge/7 Series
https://raw.github.com/toleda/audio_hdmi_hd4000/master

# Audio HDMI UEFI Audio dsdt edits - Desktop/Laptop/Intel NUC
https://raw.github.com/toleda/audio_hdmi_uefi/master

# Audio Realtek ALC injection
https://raw.github.com/toleda/audio_ALCInjection/master

# Airport PCIe Half Mini
https://raw.github.com/toleda/airport_pcie-hm/master

# Audio HDMI HD4600/Haswell/8 Series
https://raw.github.com/toleda/audio_hdmi_8series/master

# PJALM General
http://pjalm.info/repos/general/

# PJALM Graphics
http://pjalm.info/repos/graphics/

# PJALM Intel Series 6
http://pjalm.info/repos/intel6/

# PJALM Intel Series 7
http://pjalm.info/repos/intel7/

# PJALM ASUS
http://pjalm.info/repos/asus/

# PJALM Gigabyte
http://pjalm.info/repos/gigabyte/

# PJALM MSI
http://pjalm.info/repos/msi/

# PJALM ASRock
http://pjalm.info/repos/asrock/

# PJALM Zotac
http://pjalm.info/repos/zotac/

# Gigabyte
http://www.tonymacx86.com/DSDT/

# HP ProBook 4x30s
https://raw.githubusercontent.com/RehabMan/HP-ProBook-4x30s-DSDT-Patch/master

# HP Probook patch
http://raw.github.com/RehabMan/HP-ProBook-4x30s-DSDT-Patch/master

充电/放电状态的逻辑错误

某些华硕笔记本电脑的 DSDT 存在逻辑错误,容量达到 100%(电池充满电)时,_BST 返回错误的状态。使用以下补丁程序即可。

1
2
3
4
5
6
7
8
9
10
into method label FBST code_regex If\s\(CHGS\s\(Zero\)\)[\s]+\{[\s]+Store\s\(0x02,\sLocal0\)[\s]+\}[\s]+Else[\s]+\{[\s]+Store\s\(One,\sLocal0\)[\s]+\} replaceall_matched begin
If (CHGS (Zero))\n
{\n
Store (0x02, Local0)\n
}\n
Else\n
{\n
Store (Zero, Local0)\n
}
end;

触控板

以下的所有操作对软件版本均有要求。MaciASL 需为 RehabMan 编译版,IORegistryExplorer 需为 2.1 版本。

判断触控板类型

在 Windows 下打开设备管理器,若在人体学输入设备下存在 I2C HID 设备,则一般为 I2C HID 触摸板。查看触摸板设备的属性,若显示位置是在 I2C HID 设备 上,则得证。否则触控板一般为 PS2 类型。

PS2 触控板

用 VoodooPS2Controller.kext 驱动即可。

I2C 触控板

记录 IRQ

在 Windows 下打开设备管理器,在I2C HID 设备上右键选择属性,点击详细信息,选择位置路径并记录。然后切换到资源选项卡,记录 IRQ 后面的数字,该数字代表的是 APIC Pin。本机示例如下。

1
2
3
4
5
# IRQ
0x0000006D (109)

# 位置路径,其中ETPD为触控板BIOS名称
ACPI(_SB_)#ACPI(PCI0)#ACPI(I2C1)#ACPI(ETPD)

也可在 Mac 下查看 APIC Pin。打开 IORegistryExplorer,右上角搜索触控板 BIOS 名称,本机即为 ETPD,在详细页中记录 IOInterruptSpecifiers 的值即可。

确定工作原理

I2C 触控板均用 VoodooI2C 驱动,支持轮询模式或中断模式。

轮询模式是Voodoo的安全模式,每隔一个特定的时间扫描一次触摸板的状态,然后改变鼠标指针坐标。中断模式是触摸板在Windows/Linux等其他系统的正常工作方式。

在 DSDT 中定义如下。

定义 含义 适用范围 效率 驱动难度
APIC中断 使用APIC控制器 无IOInterruptSpecifier,或APIC Pin<2F 最高 能否以该模式驱动由硬件决定
GPIO中断 DSDT在SBFG中存在有效GPIO Pin,CRS方法中返回(SBFB,SBFG),并应用启用GPIO控制器的补丁 有IOInterruptSpecifier且APIC Pin>2F 较高 较难
轮询 CRS方法中只返回SBFB或者(SBFB,SBFI) / 较低 较易

也就是说,对于原始 DSDT,以 APIC Pin 为判断依据,若小于 2F 则默认使用 APIC 中断,若大于 2F 则默认使用 GPIO 控制器。但由于 GPIO 控制器默认不工作,因此系统会采用轮询模式,如下图所示。

【进阶】DSDT中的相关代码

找到触摸板的相关代码后,查看 SBFI 方法,该方法用于实现 APIC 中断。该方法中的数值即为 APIC Pin,当 APIC Pin 大于 2F 时,可判断为轮询模式。

1
2
3
4
5
6
7
Name (SBFI, ResourceTemplate ()
{
Interrupt (ResourceConsumer, Level, ActiveLow, ExclusiveAndWake, ,, _Y25)
{
0x00000000,
}
})

查看 SBFB 方法,该方法可被轮询或中断调用。部分 DSDT 中不含 SBFB 而含 I2CM,两者基本一致,I2CM 相比 SBFB 具有更多的内容。

1
2
3
4
5
6
7
Name (SBFB, ResourceTemplate ()
{
I2cSerialBusV2 (0x004C, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C1",
0x00, ResourceConsumer, _Y2A, Exclusive,
)
})

查看 SBFG 方法,该方法中的数值即为 GpioInt,用于中断处理。

1
2
3
4
5
6
7
8
9
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})

轮询模式驱动

下载 VoodooI2C,按照以下规则将驱动放入 Clover 的 kexts 中(一个核心驱动+一个目标驱动)并重启。

1
2
3
4
5
6
7
8
9
10
# 必放核心驱动
VoodooI2C.kext

# 根据情况选择目标驱动
VoodooI2CELAN.kext - ELAN触摸板
VoodooI2CHID.kext - I2C触摸板
VoodooI2CFTE.kext - FTE触摸板
VoodooI2CSynaptics.kext - Synaptics触摸板
VoodooI2CAtmelMXT.kext - MXT触摸屏
VoodooI2CUPDDEngine.kext - UPDD多点触控引擎

对于小部分机型(如华硕笔记本),触控板已被驱动。若未被驱动,则需要对 DSDT 应用Windows 补丁,根据出厂时随附的操作系统应用对应的补丁,一般用 Windows 10 Patch。

【非必要不使用】操作系统补丁

以下方法选择一种即可。

DSDT 修改法如下。

打开MaciASL,保证有VoodooI2C的补丁源。点击Patch,选择VoodooI2C下的Windows 10 Patch补丁,Apply-Close后保存DSDT,并将新的DSDT放入Clover文件夹的ACPI/patched下即可。

若 MaciASL 无法加载出补丁源,可直接在 Patch 界面复制以下代码内容。根据操作系统自行选择。

1
2
3
4
5
6
7
8
9
10
11
# Windows 10 DSDT Patch for VoodooI2C
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2015\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2015"))) end;

# Windows 8.1 DSDT Patch for VoodooI2C
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2013\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2013"))) end;

# Windows 8 DSDT Patch for VoodooI2C
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2012\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2012"))) end;

# Windows 7 DSDT Patch for VoodooI2C
into_all method code_regex If\s+\([\\]?_OSI\s+\(\"Windows\s2009\"\)\) replace_matched begin If(LOr(_OSI("Darwin"),_OSI("Windows 2009"))) end;

SSDT 热补丁法如下。

打开 MaciASL,新建文件并复制以下内容,保存为 SSDT-XOSI.aml。

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
DefinitionBlock ("", "SSDT", 2, "DRTNIA", "XOSI", 0x00001000)
{
Method (XOSI, 1, NotSerialized)
{
Store (Package (0x11)
{
"Windows 2001",
"Windows 2001.1",
"Windows 2001 SP1",
"Windows 2001 SP2",
"Windows 2001 SP3",
"Windows 2006",
"Windows 2006 SP1",
"Windows 2009",
"Windows 2012",
"Windows 2013",
"Microsoft Windows NT",
"Microsoft Windows",
"Microsoft WindowsME: Millennium Edition"
}, Local0)
If (_OSI ("Darwin"))
{
Return (LNotEqual (Ones, Match (Local0, MEQ, Arg0, MTR, Zero, Zero)))
}
Else
{
Return (_OSI (Arg0))
}
}
}

将SSDT-XOSI.aml放置在Clover文件夹的ACPI/patched目录下,然后在config.plist下添加以下改名补丁即可。

1
2
3
Comment: change _OSI to XOSI
Find: 5F4F5349
Replace: 584F5349

中断模式驱动

查看 APIC Pin 值

不放置 VoodooI2C 驱动,并应用 Windows 补丁。打开 IORegistryExplorer,搜索前面保存的 BIOS 设备名称,然后定位到IOInterruptSpecifiers,最前面的两位数即为APIC Pin值。

若无 IOInterruptSpecifiers 项或 APIC Pin 值不大于2F,则直接跳到安装步骤,否则继续下列步骤。

移除 APIC 中断控制器

用 MaciASL 打开设备的 DSDT,搜索BIOS 设备名称(此处为 ETPD),定位到触控板设备的代码块下。注意,以下操作全部在触控板设备的代码块下进行,请勿跳到其他设备下的代码操作。

在触控板设备的代码块下寻找类似以下的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
{
Name (SBFI, ResourceTemplate ()
{
I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C1",
0x00, ResourceConsumer, , Exclusive,
)
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000006D,
}
})
Return (SBFI)
}

在此段代码中,需将SBFI改为SBFB,并删除以下内容。

1
2
3
4
Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, )
{
0x0000006D,
}

以上面代码为例,修改后变为如下。

1
2
3
4
5
6
7
8
9
10
11
Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
{
Name (SBFB, ResourceTemplate ()
{
I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C1",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (SBFB)
}
确定触控板固定类型

在触控板的 DSDT 下寻找以下代码块。

1
2
3
4
5
6
7
8
9
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})

若此段代码出现在设备的根目录,则称为触控板设备已经root 固定。若出现在 CRS 方法中,则称为触控板设备已经CRS 固定。如果 Pin list 对应非零值,称为well-root 固定well-CRS 固定。若此段代码未出现,则称为触控板设备未固定

若未固定,则先将以上代码段复制到设备根目录下,示例如下。复制完成后跳到 GPIO 固定步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Scope (_SB.PCI0.I2C0)
{
Device (ETPD)
{
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, Exclusive, PullUp, 0x0000,
"\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0000
}
})
......

若为 root 固定或 CRS 固定,需在触控板代码块下查找_CRS方法,并确定以下代码是否存在。若存在,则证明设备已固定好,可直接跳到安装步骤,否则需继续 GPIO 固定步骤。

1
Return (ConcatenateResTemplate (SBFB, SBFG))

若为 well-root 固定或 well-CRS 固定,则直接跳到安装步骤。

GPIO 固定

定位到代码块的_CRS 方法,删除此方法的 Return 语句并用以下 Return 语句替换,以确保 DSDT 通知系统设备已固定好 GPIO。

1
Return (ConcatenateResTemplate (SBFB, SBFG))
驱动安装

驱动的安装包括驱动放置、禁用系统驱动、应用补丁,其中放置驱动操作与轮询模式完全一致。对于系统驱动,需禁用 AppleIntelLpssI2C.kext 和 AppleIntelLpssI2CController.kext,方法见说明。应用补丁需应用 Windows 补丁和 GPIO 补丁。

Windows 补丁的应用与轮询模式完全一致,GPIO 补丁的应用提供以下两种形式。

热补丁法应用 GPIO 补丁

在OC-little包中取SSDT-GPIO.aml并放置在Clover文件夹的ACPI/patched目录下,然后在config.plist下添加以下改名补丁即可。注意,在补丁无效时,可尝试删除Tgtbridge值。

1
2
3
4
Comment: change _STA to XSTA in GPI0 
Find: 5F535441
Replace: 58535441
TgtBridge: 47504930
DSDT 修改法应用 GPIO 补丁

在MaciASL下点击Patch,选择VoodooI2C下的GPIO ControllerSKL I2C Controller补丁,Apply-Close后保存DSDT,并将新的DSDT放入Clover文件夹的ACPI/patched下即可。

若 MaciASL 无法加载出补丁源,可直接在 Patch 界面复制以下代码内容。

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
// GPI0 Controller
into method label _STA parent_label GPI0 replace_content begin
Return (0x0F)
end;


// Skylake controller patches for VoodooI2C
into_all device label I2C0 remove_entry;
into_all device label I2C1 remove_entry;
into_all device label I2C2 remove_entry;
into_all device label I2C3 remove_entry;
into_all device label I2C4 remove_entry;
into_all device label I2C5 remove_entry;

into scope label _SB.PCI0 insert begin

Device (I2C0)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C0")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB10))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB10)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB10)\n
}\n
}\n
\n\n
Device (I2C1)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C1")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB11))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB11)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB11)\n
}\n
}\n
\n\n
Device (I2C2)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C2")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB12))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB12)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB12)\n
}\n
}\n
\n\n
Device (I2C3)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C3")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB13))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB13)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB13)\n
}\n
}\n
\n
Device (I2C4)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C4")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB14))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB14)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB14)\n
}\n
}\n
\n
Device (I2C5)\n
{\n
Name (LINK, "\\_SB.PCI0.I2C5")\n
Method (_PSC, 0, NotSerialized) // _PSC: Power State Current\n
{\n
Return (GETD (SB15))\n
}\n
\n
Method (_PS0, 0, NotSerialized) // _PS0: Power State 0\n
{\n
LPD0 (SB15)\n
}\n
\n
Method (_PS3, 0, NotSerialized) // _PS3: Power State 3\n
{\n
LPD3 (SB15)\n
}\n
}\n
\n
end;

into scope label _SB.PCI0.I2C0 replace_content begin

Name (_HID, "INT3442") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB10))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD0, SB00, SIR0))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD0))\n
}\n
}\n
end;

into scope label _SB.PCI0.I2C1 replace_content begin

Name (_HID, "INT3443") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB11))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD1, SB01, SIR1))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD1))\n
}\n
}\n
end;

into scope label _SB.PCI0.I2C2 replace_content begin

Name (_HID, "INT3444") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB12))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD2, SB02, SIR2))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD2))\n
}\n
}\n
end;
into scope label _SB.PCI0.I2C3 replace_content begin

Name (_HID, "INT3445") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB13))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD3, SB03, SIR3))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD3))\n
}\n
}\n
end;

into scope label _SB.PCI0.I2C4 replace_content begin

Name (_HID, "INT3446") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB14))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD4, SB04, SIR4))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD4))\n
}\n
}\n
end;

into scope label _SB.PCI0.I2C5 replace_content begin

Name (_HID, "INT3447") // _HID: Hardware ID\n
Method (_HRV, 0, NotSerialized) // _HRV: Hardware Revision\n
{\n
Return (LHRV (SB15))\n
}\n
\n
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings\n
{\n
Return (LCRS (SMD5, SB05, SIR5))\n
}\n
\n
Method (_STA, 0, NotSerialized) // _STA: Status\n
{\n
Return (LSTA (SMD5))\n
}\n
}\n
end;
确认驱动情况

所有步骤完成后重启。若触控板未驱动或开机卡 Busy timeout,则考虑更换不同的 Pin list 值。

对于本机而言,APIC Pin 值为 0x6D。

特殊处理

华硕笔记本

华硕笔记本的 DSDT 会有一个 TPD0 设备,该设备具有 GPIO 中断的模板,但并不是真实的设备。应当修补 ETPD 设备。

三星笔记本

使用轮询模式驱动时,需在应用补丁的同时在 DSDT 的以下代码中删除If (_OSI ("Windows 2012")) {及对应的},如下。

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
If (_OSI ("Windows 2012"))
{
Scope (_SB.PCI0.I2C0.SPTP)
{
}

Scope (_GPE)
{
Method (_L04, 0, NotSerialized) // _Lxx: Level-Triggered GPE
{
Notify (\_SB.PCI0.I2C0.SPTP, 0x02)
Notify (\_SB.PWRB, 0x02)
}
}

Scope (_SB.PCI0.I2C0.ATFU)
{
Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (SBFB, ResourceTemplate ()
{
I2cSerialBusV2 (0x0026, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C0",
0x00, ResourceConsumer, , Exclusive,
)
I2cSerialBusV2 (0x0027, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.PCI0.I2C0",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (SBFB)
}
}
}

若仍未解决,则在 DSDT 中进入设备 SPTP 的_INI 方法,搜索以下代码并将其内容更改为SHPO (Local0, One),如下。

1
2
3
4
If (LEqual (SDM0, Zero))
{
SHPO (Local0, One)
}

其它

对于Thinkpad T480s/L380/P52的I2C-I801设备,为ELAN触控板,可用VoodooSMBus,适用于10.14及以上系统。

1
https://github.com/VoodooSMBus/VoodooSMBus

对于Synaptic的I2C HID/SMBus触控板,可用VoodooRMI,适用于10.11及以上系统。

1
https://github.com/VoodooSMBus/VoodooRMI

对于 Alps T4 USB 触摸板,可用 AlpsT4USB。

1
https://github.com/blankmac/AlpsT4USB

TouchID

笔记本的指纹传感器一般都无法被驱动。但由于 SMBIOS 设置的机型具有 TouchID,因此在输入密码或进行认证时,系统会等待指纹的反馈,导致键盘输入卡顿。

在 Clover 的 kexts 文件夹下放置NoTouchID.kext,重启后即可修复。

1
https://github.com/al3xtjames/NoTouchID/releases

SMBIOS 与三码设置

正确设置SMBIOS并注入正确的三码,可开启HWP功能,并正常登录iCloud等苹果服务。系统的SMBIOS支持列表可在安装盘的/System/Library/CoreServices/PlatformSupport.plist查看。

选择

选择 SMBIOS 应考虑 CPU 类型、GPU 类型、操作系统支持、USB 设备等。一般而言,应当先尽可能找到合适的 CPU,然后选择仅 iGPU 或仅 dGPU 的 SMBIOS,最后决定其它因素。

CPU

SMBIOS 的 CPU 决定了是否能使用 XCPM 进行电源管理修复,以及能否开启 HWP。XCPM 支持的 SMBIOS 如下。

1
2
3
4
5
6
7
MacBook8,1+
MacBookAir6,x+
MacBookPro11,x+
Macmini7,1+
iMac14,x+
iMacPro1,1
MacPro7,1+

打开终端并输入以下命令以查询支持 HWP 的机型,在输出内容中选择台式机机型或笔记本机型。注意需挑选带 HWP 字样的机型,且尽可能选最新的机型,2017 年及以后机型支持 Sidebar 功能。若机型为 Unknown,可用搜索引擎搜索其代码以确认机型。

1
cd /tmp && curl -s https://raw.githubusercontent.com/Piker-Alpha/freqVectorsEdit.sh/master/freqVectorsEdit.sh > /tmp/freqVectorsEdit.sh && chmod +x freqVectorsEdit.sh && /tmp/freqVectorsEdit.sh && sudo rm -rf /tmp/freqVectorsEdit.sh && sudo rm -rf /tmp/Mac-*.bin

GPU

Mac Mini 为移动端硬件,与台式机硬件不匹配。

由于 Apple 总是假设当 SMBIOS 存在 dGPU 时,所有显示输出都将通过 dGPU 路由,因此若 Optimus 笔记本电脑的外部显示器通过 iGPU 连接,将可能出现黑屏问题。

对于没有 iGPU 的 CPU,若 SMBIOS 需要 iGPU(如 iMac),则 Quicklook 等功能将被破坏。可使用 iMac Pro 或 Mac Pro 替代 iMac。

iMacPro1,1 和 MacPro7,1 是仅有的 2 个允许 dGPU 处理所有工作负载的 SMBIOS,需要 Polaris、Vega 或 Navi GPU。

iMac20,2 仅适用于 Apple 的定制 i9-10910 CPU。

除非运行没有内置显示器的移动硬件,否则应避免使用 MacMini SMBIOS,除了 Intel NUC。

操作系统支持

Mac 可能仍然支持 CPU,但不再支持那个时代的 SMBIOS。如 Arrandale,但在 10.13.6 之后没有 iGPU 支持。

配置

在进行之前通过以下命令清除旧配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bash
sudo rm -rf ~/Library/Caches/com.apple.iCloudHelper*
sudo rm -rf ~/Library/Caches/com.apple.Messages*
sudo rm -rf ~/Library/Caches/com.apple.imfoundation.IMRemoteURLConnectionAgent*
sudo rm -rf ~/Library/Preferences/com.apple.iChat*
sudo rm -rf ~/Library/Preferences/com.apple.icloud*
sudo rm -rf ~/Library/Preferences/com.apple.imagent*
sudo rm -rf ~/Library/Preferences/com.apple.imessage*
sudo rm -rf ~/Library/Preferences/com.apple.imservice*
sudo rm -rf ~/Library/Preferences/com.apple.ids.service*
sudo rm -rf ~/Library/Preferences/com.apple.madrid.plist*
sudo rm -rf ~/Library/Preferences/com.apple.imessage.bag.plist*
sudo rm -rf ~/Library/Preferences/com.apple.identityserviced*
sudo rm -rf ~/Library/Preferences/com.apple.ids.service*
sudo rm -rf ~/Library/Preferences/com.apple.security*
sudo rm -rf ~/Library/Messages

正常登录 iCloud 等苹果服务,需本机的 NVRAM 正常工作。部分主板需 Clover 的 Drivers64UEFI 文件夹中有EmuVariableUefi-64.efi才可使 NVRAM 正常工作。

打开 Clover 的 config.plist,选择左侧 SMBIOS,使用右侧上下箭头选择上面所确定的机型。也可通过 GenSMBIOS 生成 SMBIOS。

1
https://github.com/corpnewt/GenSMBIOS

前往以下网站(需要翻墙环境),复制 Clover 中的 Serial Number 到文本框进行查询。若出现具体机型,则说明此序列号可用。若提示无效,则此序列码不可使用,需点击 Generate New 生成新的 Serial Number。

1
https://everymac.com/ultimate-mac-lookup/ 

前往以下 Apple 官网查询序列号。如果显示有购买日期和机型等保修信息,则此序列码不可使用,需返回 Clover 生成新的 Serial Number。直到出现提示很抱歉,这个序列号无效。请检查您的信息并再试一次,则可使用。

1
https://checkcoverage.apple.com/cn/zh

点击左侧 System Parameters,生成一个 UUID,系统生成或随机生成都可以,并勾选 Inject System ID。复制生成的 UUID 到 SMBIOS 的 SmUUID 里,复制 SMBIOS 里的 Board Serial Numbe 到 Rt VariablesMLB 里。点击获取 ROM,确保下方三码正常匹配,退出并重启。

重启后打开 Hackintool,转到工具选项卡,点击 Intel 图标,在工具输出中查看 enableHWP 的值,若为 1 则已成功开启 HWP。同时,iCloud、iMassage、FaceTime 应已可正常登录。

若出现问题,可打开 iMessageDebug 提取 Mac 的三码,查看 MLB 和 ROM 是否正常显示。若为 Failed,则应在 Clover 中加上 EmuVariableUefi-64.efi。若正常显示,可把结果保存,重启电脑后再打开 iMessageDebug,若两次结果一致,则黑苹果已成功洗白。

CPU 与电源管理

【进阶】Power Management State

通常为 0。X86PlatformPlugin.kext 能读取的已知 bit 如下。

bit 含义 说明
0x00000001 PWROK事件导致关机 与GEN_PMCON_2 bit 0含义相同
0x00000002 SYS_PWROK事件导致关机 与GEN_PMCON_2 bit 1含义相同
0x00000004 THRMTRIP#事件导致关机 与GEN_PMCON_2 bit 3含义相同
0x00000008 SYS_RESET#事件导致重启 与GEN_PMCON_2 bit 4含义相同
0x00000010 电源失败 与GEN_PMCON_3 bit 1 PWR_FLR含义相同
0x00000020 RTC电源丢失 与GEN_PMCON_3 bit 2 RTC_PWR_STS含义相同
0x00000040 一般重置状态 与GEN_PMCON_3 bit 9 GEN_RST_STS含义相同
0xffffff80 SUS电源丢失 与GEN_PMCON_3 bit 14含义相同
0x00010000 ME唤醒事件导致唤醒 与PRSTS bit 0 ME_WAKE_STS含义相同
0x00020000 ME引发事件导致冷重启 与PRSTS bit 1 ME_HRST_COLD_STS含义相同
0x00040000 ME引发事件导致热重启 与PRSTS bit 2 ME_HRST_WARM_STS含义相同
0x00080000 ME引发事件导致关机 与PRSTS bit 3 ME_HOST_PWRDN含义相同
0x00100000 全局重置Watchdog计时器事件 与PRSTS bit 6含义相同
0x00200000 全局重置电源管理Watchdog计时器事件 与PRSTS bit 15含义相同

原生电源管理

正常休眠需要启用原生电源管理,未启用时无法正确休眠。

启用

对于Haswell和更新的消费级Sandy/Ivy Bridge,可通过启用XCPM内核的方式实现启用原生电源管理。打开IORegistryExplorer并查找AppleACPICPU,若其下附有X86PlatformPlugin,证明原生电源管理已经启用。

由于 Sierra 放弃了对 Ivy Bridge 和 Ivy Bridge-E 的 XCPM 支持,因此 XCPM 方法仅在 10.8.5-10.11.6 之间受支持。较新的操作系统将需要 ssdtPRgen 方法。

确保在 BIOS 下开启以下设置。

选项 设置
C States True
P States Coordination SW_ALL
【注意】AMD CPU

对于 AMD CPU,可使用 SMCAMDProcessor,链接如下。注意需要在 VirtualSMC 之后加载。

1
https://github.com/trulyspinach/SMCAMDProcessor

通过 XCPM

【注意】旧版操作系统

要在较旧的操作系统(10.11 及更早版本)中启用 XCPM,只需在引导参数添加-xcpm,无需进行以下操作。

打开MaciASL,复制以下链接下的内容,另存为SSDT-PLUG.aml,并放置到Clover的ACPI/patched下即可。

1
https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/AcpiSamples/Source/SSDT-PLUG.dsl

也可对以上 SSDT 进行清理。在 DSDT 中搜索 Processor,查看第一个处理器的名称。以SB.PR00为例,在 SSDT 中删除除 SB.PR00 意外以外的条目即可,最后应保留一个 External、一个 Method、一个 If。

【旧版】Haswell-E和Broadwell-E

XCPM 不支持 Haswell-E 和 Broadwell-E,但可通过设置 Fake CPUID 的方式实现。

对于 OpenCore,在 Kernel-Emulate 使用以下补丁。

1
2
3
4
5
6
7
# Haswell-E
Cpuid1Data: C3060300 00000000 00000000 00000000
Cpuid1Mask: FFFFFFFF 00000000 00000000 00000000

# Broadwell-E
Cpuid1Data: D4060300 00000000 00000000 00000000
Cpuid1Mask: FFFFFFFF 00000000 00000000 00000000

通过 ssdtPRgen

在 Sandy Bridge 和 Ivy Bridge 采用新版系统(10.8.2 及以上)时使用。也可用于 Core 2、Haswell、Nehalem 或 Westmere。

对于Haswell,需要将SMBIOS设置为iMac14,x/MacBookAir6,x/MacBookPro11,x。对于Core 2,需要将SMBIOS设置为MacPro3,1。对于Nehalem或Westmere,需要将SMBIOS设置为iMac11,x/MacBookPro6,x/MacPro5,1。对于Sandy Bridge,需要将SMBIOS设置为iMac12,x/MacMini5,x/MacBookPro8,x。对于Ivy Bridge,需要将SMBIOS设置为iMac13,x/MacMini6,x/MacBookPro9,x/MacBookPro10,x。

以 OpenCore 为例,在配置文件的 ACPI-Delete 添加以下配置,以暂时删除 CpuPm 和 Cpu0Ist 表。

Key Type Value
All Boolean YES
Comment String Drop CpuPm
Enabled Boolean YES
OemTableId Data 437075506d000000
TableLength Number 0
TableSignature Data 53534454
Key Type Value
All Boolean YES
Comment String Drop Cpu0Ist
Enabled Boolean YES
OemTableId Data 4370753049737400
TableLength Number 0
TableSignature Data 53534454

重启后使用 ssdtPRGen.sh 脚本,命令如下。

1
2
3
cd ~
curl -o ./ssdtPRGen.sh https://raw.githubusercontent.com/Piker-Alpha/ssdtPRGen.sh/master/ssdtPRGen.sh
chmod +x ./ssdtPRGen.sh

脚本仓库如下。

1
https://github.com/Piker-Alpha/ssdtPRGen.sh

完成后得到 ssdt.aml,复制到引导器的 ACPI 目录并重命名为 SSDT-PM.aml。重启后将以上添加的两个条目禁用即可。

【注意】对于三代/HD4000,无Ivy Bridge电源管理的处理

应使用 Sandy Bridge 的 SMBIOS,运行 Sandy Bridge 电源管理。

可忽略IOPlatformPluginUtil : getCPUIDInfo: this is an unknown CPU model 0x3a错误消息。

若出现ACPI Error: Method parse/execution failed [\_SB._INI] , AE_ALREADY_EXIST错误,则需要修改SSDT格式,如下。主要修改为将Processor物体移至外置,且将所有方法移至CPU设备之内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DefinitionBlock ("ssdt.aml", "SSDT", 1, "APPLE ", "CpuPm", 0x00021500)
{
External (\_PR_.CPU0, DeviceObj) // External Processor definition
External (\_PR_.CPU1, DeviceObj) // External Processor definition

Scope (\_PR_.CPU0) // Processor's scope
{
Name (APLF, Zero)
Name (APSN, 0x04)
Name (APSS, Package (0x20)
{
/* … */
})

Method (ACST, 0, NotSerialized)
{
/* … */
}

/* … */
}

然后使用 ssdtPRGen.sh 脚本,同上。

对于 Haswell 以前,可在 Clover 配置文件设置 KernelAndKextPatches-AppleIntelCPUPM=true。有可能需要删除 OEM 表,即设置 ACPI-SSDT-DropOem=true,非必要不使用。

对于 Haswell 及以后,可在 Clover 的配置文件中设置 ACPI-SSDT-Generate-PluginType=true,以及 KernelAndKextPatches-KernelLapic=true。也可使用 OC-Little 中的 X86 注入,链接如下。

1
https://github.com/daliansky/OC-little/tree/master/05-%E6%B3%A8%E5%85%A5%E8%AE%BE%E5%A4%87/05-1-%E6%B3%A8%E5%85%A5X86

对于 AMD Radeon 笔记本,可能需要删除 MCFG 表,通过 Clover 配置文件的 ACPI-DropTables 即可。

【进阶】OC对于Haswell + low-end的电源管理XCPM补丁

需要使用以下 CPUID 补丁以仿冒为 Ivy Bridge。

1
2
Cpuid1Data: <A9 06 03 00 00 00 00 00 00 00 00 00 00 00 00 00>
Cpuid1Mask: <FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00>

对于 10.11 及更早版本,再在启动参数添加-xcpm即可。对于 10.12 及更高版本,则根据 CPU 类型选用以下补丁。

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
# 通用AVX补丁,均需使用
Base: [EMPTY]
Comment: Haswell+ low-end Celeron/Pentium cpuid_set_info_rdmsr (c) vit9696
Count: 1
Enabled: YES
Find: B9A00100000F32
Identifier: kernel
Limit: 0
Mask: [EMPTY]
MatchKernel: [EMPTY]
Replace: B9A001000031C0
ReplaceMask: [EMPTY]
Skip: 0

# 根据CPU类型选用
# _xcpm_bootstrap, Haswell+ low-end Celeron/Pentium 10.12
Base: _xcpm_bootstrap
Comment: _xcpm_bootstrap (Haswell+ low-end Celeron/Pentium) 10.12
Count: 1
Enabled: YES
Find: C4830022
Identifier: kernel
Limit: 0
Mask: FFFF00FF
MatchKernel: 16.
Replace: C6830022
ReplaceMask: FFFF00FF
Skip: 0

# _xcpm_bootstrap, Haswell+ low-end Celeron/Pentium 10.13+(10.13-10.15 at least)
Base: _xcpm_bootstrap
Comment: _xcpm_bootstrap (Haswell+ low-end Celeron/Pentium) 10.13+
Count: 1
Enabled: YES
Find: 00C43C22
Identifier: kernel
Limit: 0
Mask: 00FFFFFF
MatchKernel: 16.
Replace: 00C63C22
ReplaceMask: 00FFFFFF
Skip: 0

完成后还可使用性能修复补丁,注意非必要不使用。

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
# XCPM performance fix (10.8.5 - 10.13.3)
Base: [EMPTY]
Comment: XCPM performance fix (c) okrasit 10.8.5 - 10.13.3
Count: 0
Enabled: YES
Find: 89D8C1E0 08000000
Identifier: kernel
Limit: 0
Mask: FFFFFFFF FF000000
MatchKernel: [EMPTY]
Replace: B800FF00 00000000
ReplaceMask: FFFFFFFF FF000000
Skip: 0

# XCPM performance fix (10.13.4+)
Base: [EMPTY]
Comment: XCPM performance fix (c) okrasit & vit9696 10.13.4+
Count: 0
Enabled: YES
Find: C1E3084863D389D048C1EA20B99901
Identifier: kernel
Limit: 0
Mask: [EMPTY]
MatchKernel: [EMPTY]
Replace: C1E308B800FF000031D29090B99901
ReplaceMask: [EMPTY]
Skip: 0

变频

基本知识

LFM

即 Low Frequency Mode,表示空闲时的最低值。LFM 值仅适用于 Broadwell 和更新的 SMBIOS。

可通过以下网站查看 TDP-down Frequency 以确定。

1
https://ark.intel.com/content/www/us/en/ark.html

也可使用以下值。

CPU次代 LFM值 说明
Broadwell+ Laptops 08 相当于800Mhz
Broadwell+ Desktops 0A 相当于1000Mhz
Haswell/Broadwell HEDT/Server(如X99) 0D 相当于1300Mhz
Skylake+ HEDT/Server(如X299) 0C 相当于1200Mhz
EPP

即 Energy Performance Preference,表示将 CPU 加速到其完整时钟的速度。EPP 值仅适用于 Skylake 和更新的 SMBIOS。

00 表示最快,FF 表示最慢。设置列表如下。

EPP 说明
0x00-0x3F 最大性能
0x40-0x7F 平衡性能
0x80-0xBF 平衡省电
0xC0-0xFF 最大省电
Perf-Bias

即 Performance Bias,确定 CPU 的期望整体性能。

通过 CPUFriendFriend

下载以下包,解压后运行 CPUFriendFriend.command。运行完成后将获得 CPUFriendDataProvider.kext 和 ssdt_data.aml,二者选其一放置即可。

建议放置CPUFriendDataProvider.kext。若放置ssdt_data.aml,则不再需要SSDT-PLUG。但此SSDT的设置在X99/X299等HEDT平台上已损坏。

1
https://github.com/corpnewt/CPUFriendFriend
【进阶】CPUFriend的注意事项

在 OpenCore 中无需考虑 CPUFriendDataProvider 的注入顺序,因为它仅为一个 plist-only kext。

CPUFriend 导致的唤醒问题可能是由于不正确的频率设置,需要修改生成配置以达到稳定效果。该问题主要表现为出现Sleep Wake failure in efi的 panic。

通过 one-key-cpufriend

不推荐,会创建不良频率向量。

在终端下输入以下命令以执行一键 CPU 变频脚本。

1
bash -c "$(curl -fsSL https://raw.githubusercontent.com/stevezhengshiqi/one-key-cpufriend/master/one-key-cpufriend_cn.sh)"

完成后把桌面的 CPUFriend.kext 和 CPUFriendDataProvider.kext 放到 Clover 的 kexts 中即可。

通过 kexts

放置 CPUFriend.kext 即可。

1
https://github.com/acidanthera/CPUFriend

锁频

通过 Clover

打开 Clover 的配置文件,进入 Cpu,开启 HWPEnable 和 UseARTFrequency,并修改 HWPValue 为频率值,如 i5 10400 可设为 002B2B2B,其中 2B 化为十进制为 43,即 4.3GHz,保存即可。

HWPValue 即为 CPU 的 IA32_HWP_REQUEST 寄存器,以 002B2B2B 为例说明如下。

位置 说明
00 00代表高性能,94代表节能
2B
2B 最高频率(十六进制)
2B 最低频率(十六进制)

通过 kexts

下载HWPEnable.kext,修改HWPEnabler.kext/Contents/Info.plist中的HWPDeaultVal为频率值,同上。修改完成后放置到引导器即可。

硬盘配置

不支持三星PM981/PM991、Micron 2200S、Intel 660p以及任何基于eMMC的硬盘。

Samsung 970 EVO Plus NVMe SSD 可通过固件更新修复相关问题。

对于所有 NVMe SSD,建议使用以下 kext 修复功率和能耗。

1
https://github.com/acidanthera/NVMeFix

SSD 开启 TRIM

在终端输入以下命令以打开 TRIM。

1
sudo trimforce enable

若执行后 TRIM 仍未开启,则需要通过 Clover 打 kext 补丁。打开 Clover 的 config.plist,选择 Kernel and Kext Pathches-Kext Pathches,添加以下补丁。

1
2
3
Name*: IOAHCIBlockStorage
Find*[HEX]: 4150504C452053534400
Replace*[HEX]: 00000000000000000000

屏蔽三星 PM981 NVMe SSD

PM981 可能会引起系统死机。放置以下 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
DefinitionBlock ("", "SSDT", 2, "hack", "NVMe-Pcc", 0x00000000)
{
External (_SB_.PCI0.RP09.PXSX, DeviceObj)

Method (_SB.PCI0.RP09.PXSX._DSM, 4, NotSerialized)
{
If (!Arg2)
{
Return (Buffer (One)
{
0x03
})
}

Return (Package (0x02)
{
"class-code",
Buffer (0x04)
{
0xFF, 0x08, 0x01, 0x00
}
})
}
}

睡眠相关

打开

在终端输入以下命令,可打开 Clover 为黑苹果修补的休眠功能。

1
sudo pmset -a hibernatemode 29(或21)

在 Clover 的 kexts 文件夹放置 HibernationFixup.kext,并在启动参数中加-hbfxbeta,即可实现 hibernatemode 3 休眠,下载链接如下。

1
https://github.com/acidanthera/HibernationFixup

关闭

黑苹果不支持挂起到磁盘的休眠或 S4 睡眠。

首先需要打开 Clover 配置文件,将 NeverHibernate 设置为 true,并添加启动参数swd_panic=1,以避免进入睡眠后重启的问题,并给出相应的 panic 日志。然后在终端输入以下命令以禁止。

【进阶】对于OpenCore

还需在配置文件中设置 Misc-Boot-HibernateMode 为 None,以避免 S4 睡眠。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设置睡眠模式为3
sudo pmset -a hibernatemode 0

# 禁用自动关机(一种休眠形式)
sudo pmset -a autopoweroff 0

# 禁用powernap(定期唤醒机器以保持网络和进行更新)
sudo pmset -a powernap 0

# 禁用待机
sudo pmset -a standby 0

# 禁用从iPhone/Watch唤醒
# 解决合盖后遇到偶发性的随机唤醒,如Thinkpad合盖后A面红色指示灯开始闪烁(表示设备已经睡眠),但一会以后指示灯进入常亮,而开盖屏幕不会点亮
sudo pmset -a proximitywake 0

# 禁用TCP Keep Alive机制
# 以防止每2小时唤醒一次
sudo pmset -a tcpkeepalive 0

# 删除睡眠映像并防止再次生成
sudo rm /var/vm/sleepimage
sudo mkdir /var/vm/sleepimage

以上终端操作也可由 Hackintool 完成。在 Hackintool 里切换到电源选项卡,点击最下方的齿轮按钮即可。

修复

若睡眠后无法唤醒,如合盖后系统死机,则可能是设备不正确导致。因为当设备收到 S3 调用(或 S0 用于唤醒)时,驱动程序需要关闭设备电源并进入低状态模式(唤醒时反之亦然)。当此类设备不与驱动程序配合,就会出现问题。

首先需要关闭睡眠,放置 HibernationFixup,并按以下配置 BIOS。

选项 配置 说明
Wake on LAN Disabled
Trusted Platform Module Disabled 若在Windows中使用BitLocker,禁用此功能将导致所有加密密钥丢失
Wake on USB Disabled 大多数主板会通过该功能执行随机唤醒
Wake on Bluetooth Disabled 需要使用蓝牙设备唤醒(如键盘)则可开启

设置 Clover 配置文件的 FixDSDTMask=0x30DF 可能会解决问题。

网卡检查

检查系统是否有两个有线网卡,一般为 NullEthernet 与有线网卡驱动共同使用造成的。若是,则删除 NullEthernet 后查看是否已经恢复正常。

显卡检查

检查显卡驱动是否正常、注入 EDID 并开启 Hidpi。可能需要禁用独显。

也可能是背光设置不正确,更换 SSDT-PNLF 即可。也可能是合盖唤醒检测损坏,在终端输入以下命令禁用即可。

1
sudo pmset lidwake 0

也可能是 PS2 键盘在唤醒时发送了垃圾内容,导致唤醒错误。使用 SSDT-HP-FixLidSleep,并将 ACPI 路径修改为键盘路径即可。

1
https://github.com/acidanthera/VoodooPS2/blob/master/Docs/ACPI/SSDT-HP-FixLidSleep.dsl

声卡检查

错误的音频设备也可能会导致睡眠问题。

SMBus 检查

SMBus 未正确加载将可能导致睡眠问题。

TSC 检查

TSC(Time Stamp Counter,时间戳计数器)确保硬件以正确速度运行,某些固件可能不会将 TSC 写入内核的某部分而出现问题。TSC 出错时常伴随登录界面输入密码后立即卡住冻结的错误,也会导致屏幕残影。

对于笔记本电脑,可直接使用 CpuTscSync。CpuTscSync 结合了 VoodooTSCSync 的功能并在 TSC 不同步的情况下禁用 xcpm_urgency。

1
https://github.com/acidanthera/CpuTscSync

对于大多数HEDT硬件,可使用VoodooTSCSync。VoodooTSCSync校正华硕HEDT/Server主板上的TSC,改善时间、音频和视频的同步。

1
2
https://bitbucket.org/RehabMan/VoodooTSCSync/downloads/
https://github.com/IOIIIO/AMDVanilla/raw/master/files/VoodooTSCSyncAMD.zip

打开终端并输入以下命令,记录输出。

1
echo $(($(sysctl -n hw.ncpu) - 1))

在kext上右键点击显示包内容,打开Contents/Info.plist,搜索#CORE并替换为刚才所得的值,保存即可使用该kext。

放置VoodooTSCSync后还需要放置TSCAdjustReset。下载后在kext上右键点击显示包内容,打开Contents/Info.plist,将IOKitPersonalities-IOPropertyMatch-IOCPUNumber更改为从0开始的CPU线程数,保存即可使用该kext。

1
https://github.com/khronokernel/Opencore-Vanilla-Desktop-Guide/blob/master/extra-files/TSCAdjustReset.kext.zip

RTC 检查

RTC 可能被禁用,或 RTC 与系统不兼容。可尝试在 Clover 的配置文件勾选 FixRTC。

对于第一个问题,可使用 SSDT-AWAC 或 SSDT-RTC0-RANGE-HEDT,如下。

1
2
3
4
5
6
7
# SSDT-AWAC
# 适用于大多数主板
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/compiled/SSDT-AWAC.aml

# SSDT-RTC0-RANGE-HEDT
# 适用于Intel的X99和X299平台
https://github.com/dortania/Getting-Started-With-ACPI/blob/master/extra-files/compiled/SSDT-RTC0-RANGE-HEDT.aml

对于第二个问题,一般会在启动时出现BIOS Restarted in Safemode错误。

对于 OpenCore,可在配置文件开启 DisableRtcChecksum 以防止写入主校验和(0x58-0x59)。

然后设置 UEFI-ProtoclOverride-AppleRtcRam 和 NVRAM-Add-rtc-blacklist,将某些区域列入黑名单。

同时需要使用 RTCMemoryFixup,添加rtcfx_exclude=启动参数,将某些区域列入黑名单。该参数的范围为 0x00-0xFF,其中 0x00-0x0D 的偏移不会引起任何冲突,0x80-0xAB 的偏移用于存储休眠信息(IOHibernateRTCVariables),0xB0-0xB4 的偏移用于 PowerManagement 功能。

RTCMemoryFixup 下载链接如下。

1
https://github.com/acidanthera/RTCMemoryFixup
【旧版】对于Z68主板

可能需要修复 DSDT。打开 DSDT 并查找 RTC 设备,然后替换为以下内容,保存后放置到引导器的 ACPI 目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00")) // _HID: Hardware ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x00, // Alignment
0x02, // Length
)
})
}

NVMe 检查

检查 NVMe 是否已经完成修复。

CPU 电源管理检查

检查 CPU 电源管理是否正常工作。

Thunderbolt 检查

可在 BIOS 禁用 Thunderbolt 3,以保证 Thunderbolt 与睡眠可同时工作。

或尝试修补 Thunderbolt。

1
2
3
https://osy.gitbook.io/hac-mini-guide/details/thunderbolt-3-fix/
https://github.com/osy/ThunderboltReset
https://github.com/al3xtjames/ThunderboltPkg

USB 检查

可尝试进行 USB 定制。

也有可能是 USB3 导致的问题,向 DSDT 打以下补丁即可。

对于 0x0d 使用以下补丁。

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
114
115
116
117
118
119
120
121
122
#Maintained by: RehabMan for: Laptop Patches
#usb_prw_0x0d_xhc.txt

# remove _PRW methods to prevent instant wake

# delete any existing XHC1 device
into device label XHC1 name_adr 0x00140000 remove_entry;
# delete any existing USB2 device
into device label USB2 name_adr 0x001D0000 remove_entry;

# if _PRW objects are methods
into method label _PRW parent_adr 0x001D0000 remove_entry;
into method label _PRW parent_adr 0x001A0000 remove_entry;
into method label _PRW parent_adr 0x00140000 remove_entry;
into method label _PRW parent_adr 0x001B0000 remove_entry;
# some other LAN cards use 0x00190000
into method label _PRW parent_adr 0x00190000 remove_entry;

# if _PRW methods are stuffed into a separate scope
into method label _PRW parent_label _SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label _SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label _SB.PCI0.XHC remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label \_SB.PCI0.XHC remove_entry;

# if _PRW objects are names
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
# some _PRW have three entries in the Package
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;

# seems to work better if _PRW is present, but returns 0 (original was 3) for sleep state
into device name_adr 0x001D0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x001A0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x00140000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x001B0000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;
into device name_adr 0x00190000 insert begin Name(_PRW, Package() { 0x0D, 0 }) end;

# rename XHC to XHC1
# rename is not a good idea for 10.11, maybe not for prior versions
# disabled for now

#into device label XHC set_label begin XHC1 end;
#into_all all code_regex XHC\. replaceall_matched begin XHC1. end;
#into_all all code_regex XHC_\. replaceall_matched begin XHC1. end;
#into_all all code_regex \.XHC, replaceall_matched begin .XHC1, end;

#Maintained by: RehabMan for: Laptop Patches
#usb_USB_7-series.txt

# USB property injection for 7-series boards (originally HM76)

# Insert Apple USB properties into EHC1
into method label _DSM parent_adr 0x001D0000 remove_entry;
into device name_adr 0x001D0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# Insert Apple USB properties into EHC2
into method label _DSM parent_adr 0x001A0000 remove_entry;
into device name_adr 0x001A0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# Insert Apple USB properties into USB 3.0 XHC
into method label _DSM parent_adr 0x00140000 remove_entry;
into device name_adr 0x00140000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# special cases... (not in u430 DSDT)
#into scope label _SB.PCI0.XHC.RHUB.HS05 set_label begin _SB.PCI0.XHC1.RHUB.HS05 end;

对于 0x6d 使用以下补丁。

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
114
115
116
117
118
119
120
121
122
#Maintained by: RehabMan for: Laptop Patches
#usb_prw_0x6d_xhc.txt

# remove _PRW methods to prevent instant wake

# delete any existing XHC1 device
into device label XHC1 name_adr 0x00140000 remove_entry;
# delete any existing USB2 device
into device label USB2 name_adr 0x001D0000 remove_entry;

# if _PRW objects are methods
into method label _PRW parent_adr 0x001D0000 remove_entry;
into method label _PRW parent_adr 0x001A0000 remove_entry;
into method label _PRW parent_adr 0x00140000 remove_entry;
into method label _PRW parent_adr 0x001B0000 remove_entry;
# some other LAN cards use 0x00190000
into method label _PRW parent_adr 0x00190000 remove_entry;

# if _PRW methods are stuffed into a separate scope
into method label _PRW parent_label _SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label _SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label _SB.PCI0.XHC remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC1 remove_entry;
into method label _PRW parent_label \_SB.PCI0.EHC2 remove_entry;
into method label _PRW parent_label \_SB.PCI0.XHC remove_entry;

# if _PRW objects are names
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\}\) remove_matched;
# some _PRW have three entries in the Package
into device name_adr 0x001D0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001A0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00140000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x001B0000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;
into device name_adr 0x00190000 code_regex Name.*_PRW.*\n.*\n.*\n.*\n.*\n.*\}\) remove_matched;

# seems to work better if _PRW is present, but returns 0 (original was 3) for sleep state
into device name_adr 0x001D0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x001A0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x00140000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x001B0000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;
into device name_adr 0x00190000 insert begin Name(_PRW, Package() { 0x6D, 0 }) end;

# rename XHC to XHC1
# rename is not a good idea for 10.11, maybe not for prior versions
# disabled for now

#into device label XHC set_label begin XHC1 end;
#into_all all code_regex XHC\. replaceall_matched begin XHC1. end;
#into_all all code_regex XHC_\. replaceall_matched begin XHC1. end;
#into_all all code_regex \.XHC, replaceall_matched begin .XHC1, end;

#Maintained by: RehabMan for: Laptop Patches
#usb_USB_7-series.txt

# USB property injection for 7-series boards (originally HM76)

# Insert Apple USB properties into EHC1
into method label _DSM parent_adr 0x001D0000 remove_entry;
into device name_adr 0x001D0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# Insert Apple USB properties into EHC2
into method label _DSM parent_adr 0x001A0000 remove_entry;
into device name_adr 0x001A0000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# Insert Apple USB properties into USB 3.0 XHC
into method label _DSM parent_adr 0x00140000 remove_entry;
into device name_adr 0x00140000 insert
begin
Method (_DSM, 4, NotSerialized)\n
{\n
If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }\n
Return (Package()\n
{\n
"subsystem-id", Buffer() { 0x70, 0x72, 0x00, 0x00 },\n
"subsystem-vendor-id", Buffer() { 0x86, 0x80, 0x00, 0x00 },\n
"AAPL,current-available", 2100,\n
"AAPL,current-extra", 2200,\n
"AAPL,current-extra-in-sleep", 1600,\n
"AAPL,device-internal", 0x02,\n
"AAPL,max-port-current-in-sleep", 2100,\n
})\n
}\n
end;

# special cases... (not in u430 DSDT)
#into scope label _SB.PCI0.XHC.RHUB.HS05 set_label begin _SB.PCI0.XHC1.RHUB.HS05 end;
【注意】Catalina的IOClass

对于Catalina上的USB睡眠问题,可能还需要将USBMap.kext(或/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostPlatformProperties.kext/Contents/Info.plist)的IOClass由AppleUSBMergeNub修改为AppleUSBHostMergeProperties。

IRQ 检查

IRQ 问题有可能导致睡眠不正常。

常见问题

修复休眠后摄像头失效

在终端输入以下命令即可。

1
sudo killall VDCAssistant

系统时间调整

Windows把系统硬件时间当作本地时间,即操作系统中显示的时间跟BIOS中显示的时间一致。而Linux/Mac把硬件时间当作UTC,操作系统中显示的时间是硬件时间经过换算得来的,比如说北京时间是 GMT+8,则系统中显示时间是硬件时间+8。因此两个系统的时间会出现差异。

在 Windows 以管理员身份打开命令提示符,输入下列命令并重启以修复两个系统时间不一致的问题。

1
Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1

若仍不一致,则在 Windows 下修改时间为自动获取,在 Mac 下把时区改成北京并开启自动获取,重新启动即可。

完成度检查

对于笔记本,可通过以下选项进行完成度检查。

变频测试

使用 CPU-S 进行变频测试,二档可用,八档以上优秀。下载链接如下。

1
http://bbs.pcbeta.com/viewthread-1698338-1-1.html

也可使用 DPCI Manager 查看。打开 DPCI Manager 并点击 P States 即可。

显示

分辨率和显存显示正常,支持 DP、HDMI 外接显示,风扇不持续高速旋转,原生亮度调节正常。

声音

通过 VoodooHDA 能有声音则可用,通过 AppleALC 能有声音则优秀。

网络

以太网需位于en0,无线支持2.4G/5G双频。支持AirDrop和Handoff则优秀。

USB

USB接口2.0/3.0/3.1均能识别,3.0及以上接口的识别速度应有5G/s。

电池

系统偏好设置正常识别电池电量状态。

睡眠

合盖睡眠,开盖唤醒后正常点亮不黑屏。

输入设备

自带键盘和触摸板都能正常使用。

固态硬盘

打开关于本机-系统报告,检查NVMExpress和SATA/SATA Express,均显示TRIM支持已开启则优秀。

常见问题

系统安装

系统安装过程中,可通过打开安装器日志查看当前进度和所遇到的问题。

提示 MediaKit reports not enough space on device for requested operation

EFI 分区不够大。

安装时停在 verifying installmacosx.pkg/installesd.dmg

等待一段时间后会重新启动,然后再去安装一次即可。

需要蓝牙连接键盘连接

主要是启动后显示鼠标和键盘的开关界面,一直循环切换。按空格即可跳过。

验证安装器数据时发生错误

断开网络后尝试拔掉无用外置硬盘、终端修改时间,或检查镜像是否损坏。

提示安装资源已过期,退出安装器以重新启动电脑,然后再次尝试

将安装 U 盘插入 USB2.0 接口,或重新制作安装盘。

安装卡在第一次走条的最后两分钟很久,而后提示安装器资源损坏

内存驱动问题。

安装时提示找不到安装器资源

可能是安装器损坏。若不行,则删除 EmuVariableUefi.efi。也有可能是 SMBIOS 设置错误。

引导启动

安装完成后无法进入 BIOS

出现了不正确的引导项。在 Windows 下可通过 EasyUEFI 删除多余的引导项,在 Mac 下可重置 NVRAM。

Clover 提示 Invalid Signature…

需要在 BIOS 关闭安全启动。

Clover 提示 X64 Exception Error

Drivers 中的驱动太新,删除或更换为旧版即可。如将 PartitionDxe 更换为 PartitionDxeLegacy。

Clover 检测不到启动项或任何 HFS/APFS 分区

可能是 Clover 版本太旧。

内置 kexts 错误导致无法进入系统

进入恢复模式后点击常用工具-终端,输入以下命令以重建缓存。也可进入单用户模式操作。

1
2
3
4
5
# MAC为系统盘卷标,需根据情况替换
rm -rf [错误的kexts路径]
rm -rf /Volumes/MAC/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache
rm -rf /Volumes/MAC/System/Library/PrelinkedKernels/prelinkedkernel
touch /Volumes/MAC/System/Library/Extensions/ && kextcache -u /Volumes/MAC

无法更改启动路径

在某些情况下,电脑的启动路径被硬编码为启动EFI/Microsoft/Boot/bootmgfw.efi而不是EFI/BOOT/BOOTX64.EFI,这将导致计算机启动系统的锁定。若遇到以上情况,则需将EFI分区里的EFI/Microsoft/Boot/bootmgfw.efi重命名为其他名称并将Clover的CLOVERX64.efi重命名为bootmgfw.efi,复制替换即可。注意,Windows的每次更新都会覆盖bootmgfw.efi,因此需要重新操作。

抹盘时提示 MediaKit 报告设备上的空间不足以执行请求的操作,或磁盘工具自动退出

根本原因是 EFI 分区小于 200MB。

出现 Welcome to Clover xxxx user settings 卡住不动

更换版本即可。

提示 This version of Mac OS X is not supported on this platform

更改 SMBIOS 即可。

卡在 Clover 引导界面不动

在引导器目录把无用的 plist 删除,仅保留 config.plist。

运行后导致 CMOS 重置

对于 Clover,可在配置文件中勾选 Apple RTC,以防止 CMOS 重置与有关 AppleALC 的错误。

啰嗦模式

提示 Panic

内核恐慌。可先尝试加-x 参数后再次启动,若无效则应当根据错误提示选择以下的解决方案。

AppleIntelCPUPowerManagement/AppleRTC

Mac 的 CPU 电源管理不起作用。

在 Clover 加入 NullCPUPowerManagement.kext,或删除 SLE 下的 AppleIntelCPUPowerManagement.kext 和 AppleIntelCPUPowerManagementClient.kext。

AppleTyMCEDriver

删除AppleTyMCEDriver.kext即可,可能在SLE或引导器目录。或SMBIOS不要设置MacPro4,1/MacPro5,1/Xserve3,1。

VoodooHDA

删除 VoodooHDA.kext 即可,可能在 SLE 或引导器目录。

ApplePolicyControl

删除AppleGraphicsControl.kext中的Contents/Plugins/ApplePolicyControl.kext即可。

Local APIC

可能是因为 Mac 不支持当前 CPU。可尝试使用 cpus=1 启动标志。

Unable to find driver for this platform: "ACPI\

在极少数情况下,这种恐慌只会在 AppleACPIPlatform.kext 损坏时发生。可尝试启动安全模式。

Thread 14 crash

可尝试将 BIOS 降级。

VTDecoderXPCServ

在 Clover 引导界面中选择 Graphics Injector,勾选 Inject Intel,并将*-platform-id 修改为 0x3E9B0000。

IOATAFamily

可尝试删除 SLE 下的 IOATAFamily.kext。

卡在 PCI configuration begin

可尝试添加启动参数 npci=0x2000 或 npci=0x3000。两者不要同时使用。

Still waiting for root device 并禁行

表示系统无法找到系统盘,一般分为 USB 引导和 SATA 硬盘引导两种情况。更新引导器到最新版本,若无效则按照以下内容修复。

如果是 USB 引导,代表系统无法识别到 USB,可在引导器的 kexts 下放置 USBInjectAll.kext,也可尝试在 Clover 的 config.plist 中勾选 FixOwnership。也可尝试插入 USB 2.0 端口而非 3.0 端口。启动后应当通过 USB 端口定制解决该问题。

如果是 SATA 硬盘引导,代表 Mac 不支持该 SATA 控制器。由于 Mac 不能正确支持 RAID、IDE 和 RST,因此需要在 BIOS 将 SATA 设置为 AHCI 模式,或使用 AHCI 补丁。若不起作用,则可尝试在引导器的 kexts 部分放置以下 kext,注意不要同时使用。

1
2
3
4
5
6
7
8
9
10
11
## SATA-unsupported.kext
https://github.com/khronokernel/Legacy-Kexts/blob/master/Injectors/Zip/SATA-unsupported.kext.zip

## AHCIPortInjector.kext
https://www.insanelymac.com/forum/files/file/436-ahciportinjectorkext/

## ATAPortInjector.kext
https://github.com/khronokernel/Legacy-Kexts/blob/master/Injectors/Zip/ATAPortInjector.kext.zip

## AppleAHCIPort.kext(从Catalina提取,主要用于Big Sur)
https://github.com/dortania/OpenCore-Install-Guide/blob/master/extra-files/CtlnaAHCIPort.kext.zip
【进阶】OC引导

可尝试打开 RealeasUSBOwnership、XhciPortlimit。

卡在 ApplelIntelLpssI2CController

在主机 Windows 下把 SLE 下的 AppleInteLpssI2CController.kext 删掉。若无效,再删 AppleIntelLpssI2C.kext。

或者在 Clover 配置中禁用。打开 Clover 的 config.plist,在 KextsToPatch 加入以下配置即可。

1
2
3
4
5
6
7
8
9
10
11
Name: com.apple.driver.AppleIntelLpssI2C
Find: 494F4B69 74
Replace: 494F4B69 73
Comments: Prevent Apple I2C kexts from attaching to I2C controllers, credit CoolStar
InfoPlistPatch: true

Name: com.apple.driver.AppleIntelLpssI2CController
Find: 494F4B69 74
Replace: 494F4B69 73
Comments: Prevent Apple I2C kexts from attaching to I2C controllers, credit CoolStar
InfoPlistPatch: true

卡在 IOConsoleUsers:gIOScreenLockState 3 或出现 Busy Timeout 或[IGPU] Hash data from ME never returned, status =1, doing retry

此错误是由于显卡驱动问题。如果为双显卡,需屏蔽独显,驱动集显。

更新 Whatevergreen 和 Lilu。若无效,则在 Clover 主页面中选择 Options,点击 Graphics injector,取消勾选InjectIntel并把platform-id修改为0×12345678,然后启动系统。若无效,则将 LE 下所有 kexts 备份并删除,再次启动。

若仍无效,则找到SLE下AppleIntel/AMD/ATI/Ge/NVD开头的所有显卡kexts,并将除核显外的其它所有kexts备份后删除。假设为Intel核显,则删除除AppleIntel开头外的其余所有显卡kexts。

也可尝试关闭 CSM,或强制 PCIe 3.0 链接速度,或添加启动参数 agdpmod=pikera。

卡在 IOBluetoothHCIController

真正的问题可能与蓝牙无关,而是在显卡。解决方法同上。

显示 This version of Mac OS X is not supported on this platform!

Clover 添加启动参数-no_compat_check,或更换 SMBIOS。若不行,则换用其他版本的系统镜像。

卡在 Service only ran for 0 seconds. Pushing respawn out by 10 second

使用 SSDT 而非 DSDT 进行独显屏蔽即可。

卡在 Attempting system restart…MACH Reboot

在 Clover 的 config.plist 配置文件 DropTables 下添加以下内容。

Signature Type/key String
MATS
DMAR
BGRT

卡在 Welcome to Clover xxxx user settings

Clover 的 config.plist 不适合该系统,替换即可。

卡在 ACPI:System State [S0 S3 S4 S5] (S3)

显卡无解,可能需要外接显卡。

卡在 apfs_module_start 或 VoodooPS2Controller,或安装时键盘无法使用

删除 VoodooPS2Controller.kext,替换为 AppleACPIPS2Nub.kext 和 ApplePS2Controller.kext。

显示 DSMOS has arrived 后重启

显卡问题,添加启动参数 nv_disable=1 禁用独显即可。若无效。可到 SLE 下删除所有显卡 kexts。

出现 DSMOS 错误

FakeSMC.kext 与 dsmos.kext 同时使用导致。删除 dsmos.kext 并使用 FakeSMC.kext。

出现 ATIRadeonX2000/ATIRadeonX3000 错误

删除 SLE 下 ATI 开头的显卡驱动。

出现 CHUDKernLib 错误

Xcode 用于调试核心的驱动。删除 SLE 下的 CHUDKernLib.kext 即可。

出现 FakeSMC 错误

替换一个不同版本的 FakeSMC.kext 即可。

停在 FakeSMC

可能是 USB 问题。可关闭 BIOS 中的 USB Legacy Support。

出现 FakeSMCRadeon 错误

替换一个不同版本的FakeSMC.kext,或删除FakeSMC.kext中的Contents/PlugIns/FakeSMCRadeon.kext即可。

出现 ElliottForceLegacyRTC 错误

删除 ElliottForceLegacyRTC.kext 并使用 LegacyAppleRTC.kext。

出现 AppleRTL8169Ethernet 错误

删除IONetworkingFamily.kext,或IONetworkingFamily.kext下的Contents/PlugIns/AppleRTL8169Ethernet.kext。

出现 AppleRTC 错误

放入NullCPUPowerManagement.kext。或删除/System/Library/Extensions/AppleIntelCPUPowerManagement.kext和AppleIntelCPUPowerManagementClient.kext。

出现 AppleFWOHCI 错误

删除SLE下的IOFireWireFamily.kext/Contents/PlugIns/AppleFWOHCI.kext即可。

出现 SleepEnabler 错误

删除 SleepEnabler.kext。

出现 Trying to change a collection in the registry 的 OScollection.cpp 错误

在 BIOS 开启 ACPI 2.0 Support 及 ACPI APIC support。

出现 failed to locate SMC driver 错误

更新 FakeSMC.kext 即可。

出现 ApplePolicyControl 错误

删除SLE下的AppleGraphicsControl.kext/Contents/PlugIns/ApplePolicyControl.kext即可。

白屏且鼠标在屏幕左上角出现无限彩色风火轮

更新 FakeSMC.kext 即可。

出现 IOMemoryDescriptor.cpp 错误

内存读取错误。

发生 lapic_native.c/lapic.c 的 Local APIC error 内核错误

添加启动参数 cpus=1,可能还需要 busratio=16。

出现 can’t perform kext scan: no kext summary 错误

尝试不使用 kexts 缓存。

发生 Should have 2 threads, but only found 3 for Die 0 的 cpu_threads.c 错误

重新提取修改正确的 DSDT.aml 即可。

发生 IOAPIC: Version 0x20 Vectors 64:87 错误

使用启动参数 cpus=1 或 cpus=2,或删掉 DSDT.aml 即可。

出现 NVClockX 错误

删除NVClockX.kext或FakeSMC.kext/Contents/PlugIns/NVClockX.kext。

出现 AppleIntelGMA950 错误

删除 SLE 下的 AppleIntelGMA950.kext。

出现 GeForce7xxx 错误

删除 SLE 下的 eForce7xxx.kext。

出现 IntelCPUMonitor 错误

删除IntelCPUMonitor.kext或FakeSMC.kext/Contents/PlugIns/IntelCPUMonitor.kext。

出现 Window Server Service only ran for 0 seconds 错误

禁用独显。

卡在灰屏

灰屏表示 FakeSMC 未加载。

出现 RTC:Only single RAM bank 错误

在引导器放置 RTCMemoryFixup.kext 即可。

1
https://github.com/acidanthera/RTCMemoryFixup

卡在 VoodooPS2Trackpad:idengtify TouchPad command failed

关闭 RAID 或改为其它模式。

出现 SMCReadKeyActionError 错误

禁用 VT-d,或在启动参数中添加 dart=0,或在 Clover 设置 Drop DMAR。

在 Ivy Bridge CPU 出现 PState Stepper 错误

CPU 的 SSDT 错误,进行原生电源管理修复即可。

出现 AppleLMUController::smcReadKey Error:received error 0×84 when reading key ‘MSLD’错误

使用了多余的 SSDT。

出现 Forcing CS_RUNTIME for entitlement:com.apple.rootless.restricted-block-devices

等待即可。

启用安全启动后无法启动

若安装时启用了安全启动,需要关闭安全启动后再次安装系统。

若无启用,则可启动到恢复分区并输入以下命令。注意确保未安装两个 SSD,且已连接到网络。

1
2
## Macintosh HD为安装有Mac的分区名称
bless --folder "/Volumes/Macintosh HD/System/Library/CoreServices" --bootefi --personalize

系统运行

内置 SATA 硬盘显示为橙色图标

打开 Clover 的 config.plist,在 Kernel and kext Patches 选项卡中的 KextsToPatch 加入以下代码即可。

1
2
3
4
Name: AppleAHCIPort
Find: 45787465 726E616C
Replace: 496E7465 726E616C
Comment: Define external drivers as internal to fix yellow drive icons

RTC 问题

打开终端并输入以下命令。

1
cat /private/var/log/system.log | grep rtc

输出示例如下。E00002C2 即为需要屏蔽的内存位置。

1
localhost kernel[0]: Lilu:     rtc @ rtc read failure 1 bytes from 180 E00002C2

下载 RTCmemoryfixup,并且在 boot args 中添加rtcfx_exclude=10-FF即可。其中 10-FF 为内存屏蔽区间,根据以上输出确定。

键盘/触控板不工作

可能是 EC 设备出现故障。对于笔记本,可关闭电脑后拔出电池,30 秒后装回,重新开机。

对于 ELAN 触控板,在键盘不工作时可尝试按 Escape。

App Store 无法登录

打开终端并输入以下命令以重置 NVRAM 即可。

1
sudo nvram -c

附录

Kexts

大部分 kexts 可在以下网站找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 新版kexts
https://dortania.github.io/builds/
https://kext.me/
https://bitbucket.org/RehabMan/
https://github.com/acidanthera
https://www.zdynb.cn/2020/hei-ping-guo-qu-dong.html
https://github.com/ClayMoreBoy/Hackintosh-Kext-Factory
https://github.com/corpnewt/Lilu-and-Friends

# 旧版kexts
https://github.com/khronokernel/Legacy-Kexts
https://onedrive.live.com/?authkey=%21APjCyRpzoAKp4xs&id=FE4038DA929BFB23%21455036&cid=FE4038DA929BFB23
https://olarila.com/files/
https://github.com/RehabMan/hack-tools/tree/master/kexts

可在终端输入以下命令查看kext支持的体系结构。其中二进制文件路径可通过在kext上右键点击显示包内容,然后在Contents/MacOS中找到。

1
lipo -archs [kext的二进制文件路径]

Lilu

Lilu 为其它 kext 提供接口支持,许多 kext 需要依赖 Lilu 才能运行。需要 10.8 或更高版本的系统,下载链接如下。

1
https://github.com/acidanthera/Lilu/

FakeSMC 包与 VirtualSMC 包

下载链接如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# FakeSMC包
# 主体与传感器驱动
https://bitbucket.org/RehabMan/os-x-fakesmc-kozlek/downloads/
https://github.com/CloverHackyColor/FakeSMC3_with_plugins

# 主体(32位)
https://github.com/khronokernel/Legacy-Kexts/blob/master/32Bit-only/Zip/FakeSMC-32.kext.zip?raw=true

# ACPIBatteryManager,电池驱动
https://bitbucket.org/RehabMan/os-x-acpi-battery-driver/downloads/

# VirtualSMC
# 主体、传感器与电池驱动
https://github.com/acidanthera/VirtualSMC

两者作用相同,均用于向 macOS 提供 SMC 信息,模拟白苹果启动环境。FakeSMC 早于 VirtualSMC,且已不再更新,因此推荐使用 VirtualSMC 替换 FakeSMC。注意,使用 VirtualSMC 时 Lilu 需为最新版本,否则将无法进入系统。VirtualSMC 包作用分别如下。

Kext名称 作用
VirtualSMC 替换FakeSMC.kext,需在Clover的driver64UEFI中删除SMCHelper-64.efi并复制VirtualSMC.efi到此目录
SMCProcessor 监控CPU温度,不适用于基于AMD CPU的系统
SMCSuperIO 监控风扇速度,不适用于基于AMD CPU的系统
SMCLightSensor 用于笔记本电脑上的环境光传感器,台式机可以忽略
SMCDellSensors 对支持系统管理模式(SMM)的戴尔机器上的风扇进行更精细的监视和控制
SMCBatteryManager 电源管理驱动,用于替换ACPIBatteryManager,台式机可以忽略

VirtualSMC 需要 10.8 或更高版本的系统,旧版本应当使用 FakeSMC。

【进阶】FakeSMC的Info.plist说明

REV 表示 SMC 版本,以 Base64 表示,转换为十六进制即可,对应关系如下。

型号 SMC版本 REV值
MacPro3,1 1.25f4 ASUPAAAE
MacPro4,1 1.39f5 ATkPAAAF
MacPro5,1 1.39f11 ATkPAAAR
iMac8,1 1.30f1 ATAPAAAB
iMac9,1 1.45f0 AUUPAAAA
iMac10,1 1.53f13 AVMPAAAT
iMac11,1 1.54f36 AVQPAAA2
iMac12,1 1.72f5 AXIPAAAF
MacBookPro5,1 1.33f8 ATMPAAAI
MacBookPro5,1 1.33f8 ATMPAAAI
MacBookPro6,1 1.58f16 AVgPAAAW
MacBookPro7,1 1.62f6 AWIPAAAG
MacBookPro8,1 1.68f96 AWgPAACW

smc-compatible 的值列表如下。

型号 smc-compatible值
MacPro3,1 smc-napa
MacPro4,1 smc-thurley
MacPro5,1 smc-thurley
iMac9,1 smc-napa
iMac10,1 smc-mcp
iMac11,1 smc-piketon
iMac12,1 smc-huronriver
MacBookPro5,1 smc-mcp
MacBookPro5,5 smc-mcp
MacBookPro6,1 smc-piketon
MacBookPro7,1 smc-mcp
MacBookPro8,1 smc-huronriver

tjmax 表示 CPU 可承受的最大温度,可通过 Aida64 等方式查到。

WebCamera

相机驱动。

1
https://i.applelife.ru/2019/03/448848_WebCamera.kext.zip

AnyiSightCam

在系统报告中添加相机信息。

1
https://github.com/tuiuVN/EFI_Clover/tree/13a94765f8c3f4a5c7138b2fcc1b9e8d091c65e8/K46CA/EFI/CLOVER/kexts/Other

AnyCardReader

在系统报告中添加读卡器信息(需更改为自己的 ID)。

1
https://github.com/holoto/ec-471g/tree/master/EFI/EFI/CLOVER/kexts/10.11

AnyiSightCam

在系统报告中添加相机信息。

1
https://github.com/tuiuVN/EFI_Clover/tree/13a94765f8c3f4a5c7138b2fcc1b9e8d091c65e8/K46CA/EFI/CLOVER/kexts/Other

DebugEnhancer

啰嗦模式下可输出更多内容。

1
https://github.com/acidanthera/DebugEnhancer

IOElectrify

为 Intel Thunderbolt 硬件提供始终开启的电源。

1
https://github.com/the-darkvoid/macOS-IOElectrify/releases

VoodooInput

提供 Magic Trackpad 2 仿真。

1
https://github.com/acidanthera/VoodooInput/releases

LiluFriend

确保 Lilu 及其插件被加载。

1
https://github.com/PMheart/LiluFriend

VoodooSDHCMod

读卡器驱动。

1
https://github.com/lvs1974/VoodooSDHCMod/releases

SASMegaRAID

1
https://github.com/dukzcry/osx-goodies

Legacy_USB3&Legacy_InternalHub-EHCx

1
https://applelife.ru/posts/537459

Sinetek-rtsx

读卡器驱动。

1
https://github.com/tsingui/Sinetek-rtsx-1

SerialMouse

串行鼠标驱动,在系统启动前需先将鼠标接入电脑。

1
https://github.com/Goldfish64/SerialMouse/releases

RTCMemoryFixup

解决部分 Z370 B360 新 BIOS 的 RTC 中 STA 函数导致卡 Apfs NVME 的问题。

1
https://github.com/acidanthera/RTCMemoryFixup

SidecarEnabler

删除 Sidecar 使用的所有 SMBIOS 检查。

1
https://github.com/hieplpvip/SidecarEnabler

ThunderboltReset

禁用 Alpine Ridge 中的 ICM,以便 OSX 接管 LC。

1
https://github.com/osy/ThunderboltReset

SystemProfilerMemoryFixup

在 MacBookAir 和 MacBookPro10,x 平台上显示内存选项卡。

1
https://github.com/Goldfish64/SystemProfilerMemoryFixup

DiskArbitrationFixup

禁用此计算机无法读取您插入的磁盘消息。

1
https://github.com/Goldfish64/DiskArbitrationFixup

AHCI_3rdParty_eSATA/SATA

第三方eSATA/SATA驱动,连接到这些接口的设备将会识别为内置磁盘。

1
2
3
4
5
# AHCI_3rdParty_eSATA
https://github.com/NTT123/Hackintosh-HP-Z420-MacOS-High-Sierra-10.13-10.14/tree/master/CLOVER/kexts/10.12

# AHCI_3rdParty_SATA
https://github.com/forumi0721/osx_clover/tree/master/OEM/Z77%20Extreme4/kexts/10.11

AHCI_Intel_Generic_SATA

英特尔 SATA 驱动。

1
https://github.com/NTT123/Hackintosh-HP-Z420-MacOS-High-Sierra-10.13-10.14/tree/master/CLOVER/kexts/10.12

FakePCIID

仿冒 PCI 设备核心驱动。与 IOPCIDevice 设备建立连接,以便当另一个驱动程序连接到同一设备时提供备用的 PCI ID。

必须放置 FakePCIID,然后根据需求放置以下 kexts 中的一个或多个。

名称 作用
FakePCIID_AR9280_as_AR946x 将PCI ID重新映射回AR9280(168c:002a),即使该设备本身报告的是168c:0034
FakePCIID_Broadcom_WiFi 模拟真正的Apple Airport(苹果无线网卡)
FakePCIID_Intel_GbX 与一些Intel以太网设备建立连接,以使基于Intel芯片组的驱动程序工作。不做单独使用,通常与SmallTreelntel8254x.kext、Applelntel8254XEthernet.kext、SmallTreelntel82576.kext、SmallTreelntel8259x.kext一起使用
FakePCIID_Intel_HD_Graphics 用于核显HD4200/HD4400/HD4600/P4600,Iris 540/550 Iris Pro 580、HD510 HD515 HD520 HD530 P530(多数530不需要这个)、P4000、P6300 – 162a、UHD620 KabyLake-R、UHD630 CoffeeLake
FakePCIID_Intel_HDMI_Audio 在Haswell以上的系统中提供HDMI-audio的设备,为不支持的HDAU提供支持(通常称为B0D3,但需要将其重命名为HDAU)
FakePCIID_XHCIMux 把USB3.0主控器XHC下的USB2.0 port转移(bypass)到USB2.0主控器EHC1/EHC2下
FakePCIID_BCM57XX_as_BCM57765 用于Broadcom无线网卡BCM5700/BCM5701/BCM5702/BCM5703/BCM5717/BCM5718/BCM5719/BCM5725/BCM5727/BCM5761/BCM5762/BCM57760/BCM57764/BCM57767/BCM57781/BCM57782/BCM57785/BCM57786/BCM57787/BCM57788/BCM57790/BCM57791/BCM57795/BCM5785/BCM5787M

AMFIExemption

将允许的 entitlements 添加到非 Apple 签名的应用程序。

1
https://github.com/osy/AMFIExemption

Innie

使 PCIe 驱动器显示为内部驱动器。

NightShiftEnabler

NightShiftUnlocker 已被整合到 NightShiftEnabler。

开启 Night Shift 功能。

1
https://github.com/cdf/NightShiftEnabler

ECEnabler

允许读取长度超过 1 个字节的 EC 字段,大大减少工作电池状态所需的 ACPI 修改量。

1
https://github.com/1Revenger1/ECEnabler

RestrictEvents

MacProMemoryNotificationDisabler 已被整合到 RestrictEvents。

阻止不需要的进程,避免在不同的硬件上引起兼容性问题,并解锁对仅限于其他硬件的某些功能的支持。

1
https://github.com/acidanthera/RestrictEvents

TSCAdjustReset

修复了在 x299 主板和 Skylake-X 平台的 cpu 启动 Mac 时同步 TSC 的衰退的问题。

TOSMotionSensor

东芝 hackintosh 设备的加速度计驱动程序。

1
https://github.com/jslegendre/TOSMotionSensor

AAAMouSSE

1
https://forums.macrumors.com/threads/mp3-1-others-sse-4-2-emulation-to-enable-amd-metal-driver.2206682/

Polaris22Fixup

修复Polaris22/VegaM的已知图形问题,支持10.14+。

1
https://github.com/osy/Polaris22Fixup

HWPEnable

1
https://cgithub.com/headkaze/HWPEnable

旧版 Kexts

名称 作用 下载 备注
OpenHaltRestart/EvOreboot 解决重启/关机时遇到无法断电问题 不可同时使用
ElliottForceLegacyRTC/LegacyAppleRTC 防止主板BIOS的CMOS重置错误 不可同时使用
PlatformUUID 解决Unable to determine UUID for host. Error:35的问题
IOAHCIBlockStorageInjector 修复将内置硬盘识别为外置硬盘的问题
ApplePS2SmartTouchPad 键盘鼠标触摸板万能驱动
SATA-100-series-unsupported Intel 100系列主板SATA磁盘识别驱动
SATA-200-series-unsupported Intel 200系列主板SATA磁盘识别驱动
SATA-RAID-unsupported SATA磁盘阵列驱动
XHCI-200-series-injector 200系列主板驱动
XHCI-300-series-injector 300系列主板驱动
XHCI-unsupported Intel X99系列主板驱动,可用于H370、B360、H310、Z390(Mojave及更新版本不需要)、X79、X99、AsRock(除B460/Z490+)
XHCI-x99-injector Intel X99系列主板驱动
BT4LEContiunityFixup 开启BT4LE蓝牙上的hotspot以及handoff
NVEnabler NVidia GeForce 9500GT驱动
AppleAC97Audio AC97音频驱动 适用于10.4-10.5
BCM5906MEthernet NetLink BCM5906M有线网卡驱动 https://github.com/vmatyushin/osx-bcm5906m/ 适用于10.6-10.7
ACPICPUThrottle 根据负载自动调整CPU时钟和电压 适用于10.4
MMInputFamily 多媒体输入设备驱动 http://defyne.org/dvb/driver.html 适用于10.2-10.4
Macam USB摄像头驱动 https://sourceforge.net/projects/webcam-osx/ 适用于10.4

Kext 禁用器

下载以下kext并右键显示包内容,打开Contents/Info.plist,将AppleUserUpstreamClient替换为需要禁用的kext名称,然后放到引导器的Kexts部分即可。

1
https://www.tonymacx86.com/attachments/disabler-kext-zip.18081/

WhateverGreen

修复显卡必备驱动,适用于 10.8 及更新版本,下载链接如下。

1
https://github.com/acidanthera/WhateverGreen/releases

若未指定帧缓冲区,则默认帧缓冲区将被注入。若未设置帧缓冲区且系统具有独立显卡,则空帧缓冲区(零个控制器)将被注入。空帧缓冲区如下。

平台 platform-id
SNB 0x00050000
IVY 0x01620007
HSW 0x04120004
SKL 0x19120001
KBL 0x59120003
CFL 0x3E910003
CML 0x9BC80003

在未确定帧缓冲区时,可通过启动参数igfxframe=进行设置,此时将忽略设备属性中的参数。

WhateverGreen 中已包含以下 kexts。

1
2
3
4
5
6
7
8
9
10
11
12
13
IntelGraphicsFixup
IntelGraphicsDVMTFixup
NvidiaGraphicsFixup
CoreDisplayFixup
Shiki
IntelGraphicsDVMTFixup
AzulPatcher4600
AppleBacklightFixup
EnableLidWake
NoVPAJpeg
FakePCIID
FakePCIID_Intel_HD_Graphics
FakePCIID_Intel_HDMI_Audio

注意需要关闭 Clover 的以下选项。

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
# DSDT
AddHDMI
FixDisplay
FixIntelGfx
AddIMEI
FixHDA
AddPNLF

# 显卡
UseIntelHDMI
SetIntelBacklight
SetIntelMaxBacklight

# 设备
Devices-Inject

# FakeID
IntelGFX
IMEI
ig-platform-id

# 重命名
GFX0 to IGPU
PEGP to GFX0
HECI to IMEI
MEI to IMEI
HDAS to HDEF
B0D3 to HDAU

# 启动参数
-disablegfxfirmware
-igfxnohdmi
【过时】IntelGraphicsDVMTFixup

macOS 的启动需要 DVMT 大于32MB,否则将导致内核崩溃。DVMT 的大小可在 BIOS 设置,若 BIOS 无相应选项,可通过 grub 中的setup_var修改。或者使用本 kext,但仅用于 macOS 10.13 及以下,在 macOS Mojave 下不适用。

在 Majove 及更新系统,需在 Clover 的 config.plist 应用以下补丁以修复。或者使用 Hackintool,应用补丁时勾选DVMT 32MB 预分配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<key>Properties</key>
<dict>
<key>PciRoot(0x0)/Pci(0x2,0x0)</key>
<dict>
<key>framebuffer-fbmem</key>
<data>
AACQAA==
</data>
<key>framebuffer-patch-enable</key>
<data>
AQAAAA==
</data>
<key>framebuffer-stolenmem</key>
<data>
AAAwAQ==
</data>
</dict>
</dict>

VoodooI2C

VoodooI2C 具有记忆性,由中断模式切换到轮询模式、在中断模式下修改有关触控板的 DSDT 等均不生效,需将 VoodooI2C 的相关驱动在 Clover 的 kexts 下删除再重新复制才能恢复初始设置。适用于 10.11 及以上系统,下载链接如下。

1
https://github.com/alexandred/VoodooI2C/releases

NullCPUPowerManagement

AMD CPU 无法使用英特尔的电源管理,因此我们需要取消它。

1
https://github.com/Goldfish64/SerialMouse/releases

Windows 读写 HFS

HFSExplorer

1
http://www.catacombae.org/hfsexplorer/

HFS+ driver

1
https://forums.macrumors.com/threads/apple-hfs-windows-driver-download.1368010/

UEFI 驱动

EmuVariableUefi

用于模拟 NVRAM,从而将黑苹果洗白。若主板有原生 NVARM,则无需放置。

ApfsDriverLoader

APFS 驱动。

1
https://github.com/acidanthera/ApfsSupportPkg

HFSPlus

HFS 驱动。

1
2
https://github.com/STLVNUB/CloverGrower/tree/master/Files/HFSPlus/x64
https://github.com/JrCs/CloverGrowerPro/tree/master/Files/HFSPlus/X64

CrScreenshotDxe

1
https://github.com/LongSoft/CrScreenshotDxe

硬件驱动

EMU-USB

1
https://github.com/Wouter1/EMU-driver

kXAudioDriver

Windows 和 macOS 的 kX 音频驱动程序。

1
https://github.com/kxproject/kx-audio-driver

liquid coolers

液体冷却器驱动。

1
https://github.com/liquidctl/liquidctl

黑苹果库

1
2
3
4
5
6
7
# 网站
https://images.daliansky.net/d/YmBXVA8q/blog

# FTP
主机名 / repo1.macintoshgarden.org
用户名 / macgarden
密码 / publicdl

OC-little 包

1
2
3
4
https://github.com/daliansky/OC-little

# 另附P-little包(较旧)
https://github.com/daliansky/P-little

工具

MountEFI

挂载 EFI 分区。

1
https://github.com/corpnewt/MountEFI

Hackintool

1
2
http://headsoft.com.au/download/mac/Hackintool.zip
https://github.com/headkaze/Hackintool

Kext Updater

1
https://bitbucket.org/profdrluigi/kextupdater/downloads/

MaciASL

1
2
3
4
5
# RehabMan版
https://bitbucket.org/RehabMan/os-x-maciasl-patchmatic/downloads/

# 最新版
https://github.com/acidanthera/MaciASL/releases

IORegistryExplorer

IORegistryExplorer 可用于查看硬件情况。2.1 版下载链接如下。

1
2
https://github.com/vulgo/IORegistryExplorer
https://github.com/khronokernel/IORegistryClone

判断设备存在情况

将左上角的模式选为IODeviceTree,查看左侧设备树。若显示类似为P0P5@1C,1,则表示存在该设备。若显示类似为P0P5@1c0001,且点进去后只有 acpi-device 与 acpi-path 两项,则表示不存在该设备。

判断设备驱动情况

将左上角的模式选为 IOService,查看左侧设备树。

若显示类似为P0P4@1C且可展开,展开后可查看相应 kexts,则该设备已驱动。部分设备可能无法展开,但也已经被驱动,如 Memory Controller Hub、SMBus Controller。

若显示类似为pci8086,266a@1F,3,则该设备未驱动。

查看 CPU 变频档次

搜索 ACPI_SMC_PlatformPlugin,查看其中的 PerformanceStateArray 即可。

gfxutil

1
https://github.com/acidanthera/gfxutil

iMessageDebug

1
https://github.com/YCSuperM/ImessageDebug

Clover Configurator

1
https://mackie100projects.altervista.org/download-clover-configurator/

Kext Utility

1
https://en.freedownloadmanager.org/Mac-OS/Kext-Utility-FREE.html

7z

1
http://www.7-zip.org/download.html

AW EDID Editor

1
https://www.analogway.com/apac/products/software-tools/aw-edid-editor/

HWMonitorSMC2

监控硬件运行状况。

1
https://github.com/CloverHackyColor/HWMonitorSMC2

Continuity-Activation-Tool

只能用在 Broadcom 无线网卡,用于启用接力功能。支持 10.10-10.13。

1
https://github.com/dokterdok/Continuity-Activation-Tool

一键安装系统工具

Ccmacos

1
http://www.ccmacos.cn/#

参考教程

黑苹果必备:Intel核显platform ID整理及smbios速查表

FIX BTFIRMWAREUPLOADER IN MACOS HIGH SIERRA

alexandred/VoodooI2C-Gitter
https://gitter.im/alexandred/VoodooI2C/archives/2018/08/30(搜索@Piero512)

Hackintool深度教程

修改DSDT实现电量显示教程
https://blog.gzxiaobai.cn/2020/05/16/%E4%B8%BA%E5%B0%8F%E7%99%BD%E8%AE%BE%E8%AE%A1%E7%9A%84%E7%94%B5%E6%B1%A0%E6%95%99%E7%A8%8B%EF%BC%88DSDT%EF%BC%89/

VoodooI2C驱动教程
https://www.penghubingzhou.cn/2019/07/24/VoodooI2C%20DSDT%20Edit%20FAQ/
https://voodooi2c.github.io/#GPIO%20Pinning/GPIO%20Pinning

英特尔®核芯显卡常见问答(WhateverGreen)

黑苹果精华必读:新手常见(五国)(-v图)错误解决

Disabling discrete graphics in dual-GPU laptops

/r/Hackintosh Vanilla Desktop Guide

SSDT GPU (Graphics Card) Injection

stevezhengshiqi/one-key-cpufriend

AR9565 MAC黑苹果Bluetooth蓝牙驱动教程

SSDT-RMNE.aml

SSDT-PNLF.aml

使用HIDPI解决睡眠唤醒黑屏、花屏及连接外部显示器的正确姿势

小米笔记本Pro安装10.13随手记及EFI分享

Notebook Compatibility List

Hackintosh won’t boot? How to use verbose mode to fix it

新手常见(五国)(-v图)错误解决(原版,破解kernel,补丁kext下载)

DW1820A/BCM94350ZAE/BCM94356ZEPA50DX插入的正确姿势

Broadcom BCM94352z/DW1560驱动新姿势[新方法]

OpenIntelWireless

VoodooI2C/VoodooI2C-Patches

OpenCorePkg/Kexts.md at master

启用CPU-HWP, 锁定CPU最高频率, 让CPU展示其真正实力吧! (OC可用)

Skylake HWP Enable

First time Hackintosh Stuck at Grey Screen after installation

Clover引导安装黑苹果卡各种问题的解决方法(内容较多)

El Capitan Install Demanding Bluetooth Mouse/Keyboard

[CLOVER] 折腾了半天终于找到唤醒重启问题的原因了。。。

List of Hackintosh USB Port Limit Patches (10.15 Updated)

Wireless Buyers Guide

Hackintosh Internet Install Gitbook

[Guide] Booting the OS X installer on LAPTOPS with Clover

Fix incorrect time in Windows + OSX dual boot

[教程] 【變色龍系列三】FakeSMC.kext 設定說明【08/05】

A Beginner’s Guide to Creating a Custom USB SSDT

[分享] 10.11 USB问题之下篇,一步一步教你解决USB问题

OpenCorePkg/Docs/Kexts.md

DSDT笔记本电池补丁教程-让黑苹果显示电池状态信息

New and Improved Mac OS Tutorial, Part 1 (The Basics)

【官方双语】让任何电脑都用上黑苹果!#linus谈科技

foxlet/macOS-Simple-KVM

Make a install USBstick, faster, better and Dualboot.

Hasee macOS Library

[Guide] How to patch DSDT for working battery status

[Guide] Native Power Management for Laptops

Creating a Custom SSDT for USBInjectAll.kext

[FIX] “Window Server Service only ran for 0 seconds” with dual-GPU

Leopard en un Raid por Software usando Chameleon

ASUS 100 Series and Later Custom SSDT for XHCI USB Port Control

[Guide] Laptop backlight control using AppleBacklightFixup.kext

Apple Backlight Injector Brightness not saved

Install Snow Leopard on AMD PC, Laptop

acidanthera/bugtracker
https://github.com/acidanthera/bugtracker/issues/1247
https://github.com/acidanthera/bugtracker/issues/1193

Intel® HD Graphics

Завод Intel® Quick Sync Video

dortania/bugtracker

macOS Big Sur 成功开启HiDPI正确姿势

Need CMOS reset after sleep, only after login

VMware15/16解鎖VMware安裝MacOS

分享UltraISO,转换你的iATKOS ML2.DMG为ISO,让它支持硬盘助手写入

Olarila
https://www.olarila.com/topic/4997-usb-raise-remove-limit-port-patch-el-capitan-sierra-high-sierra-mojave-catalina/
https://www.olarila.com/topic/6451-guide-generate-ssdt-for-power-management-with-ssdtprgen/