diff --git a/Resources/Build.py b/Resources/Build.py
index 06446da71..d1628dd74 100644
--- a/Resources/Build.py
+++ b/Resources/Build.py
@@ -588,22 +588,14 @@ class BuildOpenCore:
# Bluetooth Detection
if not self.constants.custom_model and self.computer.bluetooth_chipset:
- if self.computer.bluetooth_chipset == "BRCM2070 Hub":
- print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
- self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2070_patch"
+ if self.computer.bluetooth_chipset in ["BRCM2070 Hub", "BRCM2046 Hub"]:
+ print("- Fixing Legacy Bluetooth for macOS Monterey")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
- elif self.computer.bluetooth_chipset == "BRCM2046 Hub":
- print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
- self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2046_patch"
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
- elif self.model in ModelArray.Bluetooth_BRCM2070:
- print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
- self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2070_patch"
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
- elif self.model in ModelArray.Bluetooth_BRCM2046:
- print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
- self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2046_patch"
+ self.enable_kext("Bluetooth-Spoof.kext", self.constants.btspoof_version, self.constants.btspoof_path)
+ elif self.model in ModelArray.Bluetooth_BRCM2070 or self.model in ModelArray.Bluetooth_BRCM2046:
+ print("- Fixing Legacy Bluetooth for macOS Monterey")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
+ self.enable_kext("Bluetooth-Spoof.kext", self.constants.btspoof_version, self.constants.btspoof_path)
# Add XhciDxe if firmware doesn't have XHCI controller support and XCHI controller detected
# TODO: Fix XhciDxe to work on pre UEFI 2.0 Macs
diff --git a/Resources/Constants.py b/Resources/Constants.py
index 77616b9bd..0bb8c00e4 100644
--- a/Resources/Constants.py
+++ b/Resources/Constants.py
@@ -34,7 +34,7 @@ class Constants:
self.featureunlock_version = "1.0.3" # FeatureUnlock
self.debugenhancer_version = "1.0.4" # DebugEnhancer
self.cpufriend_version = "1.2.4" # CPUFriend
- self.bluetool_version = "2.6.1" # BlueToolFixup
+ self.bluetool_version = "2.6.0" # BlueToolFixup
## Apple
## https://www.apple.com
@@ -56,6 +56,7 @@ class Constants:
self.backlight_injector_version = "1.0.0" # BacklightInjector
self.smcspoof_version = "1.0.0" # SMC-Spoof
self.mce_version = "1.0.0" # AppleMCEReporterDisabler
+ self.btspoof_version = "1.0.0" # Bluetooth-Spoof
## Syncretic
## https://forums.macrumors.com/members/syncretic.1173816/
@@ -314,6 +315,10 @@ class Constants:
def smcspoof_path(self):
return self.payload_kexts_path / Path(f"Misc/SMC-Spoof-v{self.smcspoof_version}.zip")
+ @property
+ def btspoof_path(self):
+ return self.payload_kexts_path / Path(f"Misc/Bluetooth-Spoof-v{self.btspoof_version}.zip")
+
@property
def nvmefix_path(self):
return self.payload_kexts_path / Path(f"Acidanthera/NVMeFix-v{self.nvmefix_version}.zip")
diff --git a/payloads/Config/config.plist b/payloads/Config/config.plist
index d4b92bec8..403430e35 100644
--- a/payloads/Config/config.plist
+++ b/payloads/Config/config.plist
@@ -610,6 +610,24 @@
PlistPath
Contents/Info.plist
+
+ Arch
+ x86_64
+ Comment
+ Bluetooth Patch for BRCM2046 and BRCM2070
+ Enabled
+
+ MaxKernel
+
+ MinKernel
+ 21.0.0
+ BundlePath
+ Bluetooth-Spoof.kext
+ ExecutablePath
+
+ PlistPath
+ Contents/Info.plist
+
Arch
x86_64
diff --git a/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.0.zip b/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.0.zip
new file mode 100644
index 000000000..d56c4bf30
Binary files /dev/null and b/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.0.zip differ
diff --git a/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip b/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip
deleted file mode 100644
index efd4f8842..000000000
Binary files a/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip and /dev/null differ
diff --git a/payloads/Kexts/Acidanthera/BlueToolFixup.patch b/payloads/Kexts/Acidanthera/BlueToolFixup.patch
deleted file mode 100644
index 28c807cad..000000000
--- a/payloads/Kexts/Acidanthera/BlueToolFixup.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff --git a/BrcmPatchRAM/BlueToolFixup.cpp b/BrcmPatchRAM/BlueToolFixup.cpp
-index 0fa891a..819eb3f 100644
---- a/BrcmPatchRAM/BlueToolFixup.cpp
-+++ b/BrcmPatchRAM/BlueToolFixup.cpp
-@@ -50,7 +50,15 @@ bool BlueToolFixup::start(IOService *provider) {
- static const uint8_t kSkipUpdateFilePathOriginal[] = "/etc/bluetool/SkipBluetoothAutomaticFirmwareUpdate";
- static const uint8_t kSkipUpdateFilePathPatched[] = "/System/Library/CoreServices/boot.efi";
-
-+static const uint8_t kBluetoothUSBNameOriginal[] = "Bluetooth USB Host Controller";
-+static const uint8_t kBluetoothUSBNamePatched2070[] = "BRCM2070 Hub Host Controller";
-+static const uint8_t kBluetoothUSBNamePatched2046[] = "BRCM2046 Hub Host Controller";
-+
- static const char *blueToolPath = "/usr/sbin/BlueTool";
-+static const char *bluetoothdPath = "/usr/sbin/bluetoothd";
-+
-+static const char brcm2046_patch = checkKernelArgument("-brcm2046_patch");
-+static const char brcm2070_patch = checkKernelArgument("-brcm2070_patch");
-
- static mach_vm_address_t orig_cs_validate {};
-
-@@ -71,8 +79,19 @@ static void patched_cs_validate_page(vnode_t vp, memory_object_t pager, memory_o
- char path[PATH_MAX];
- int pathlen = PATH_MAX;
- FunctionCast(patched_cs_validate_page, orig_cs_validate)(vp, pager, page_offset, data, validated_p, tainted_p, nx_p);
-- if (vn_getpath(vp, path, &pathlen) == 0 && UNLIKELY(strcmp(path, blueToolPath) == 0)) {
-- searchAndPatch(data, PAGE_SIZE, path, kSkipUpdateFilePathOriginal, kSkipUpdateFilePathPatched);
-+ if (vn_getpath(vp, path, &pathlen) == 0) {
-+ if (UNLIKELY(strcmp(path, blueToolPath) == 0)) {
-+ searchAndPatch(data, PAGE_SIZE, path, kSkipUpdateFilePathOriginal, kSkipUpdateFilePathPatched);
-+ }
-+ if (UNLIKELY(strcmp(path, bluetoothdPath) == 0)) {
-+ if (brcm2046_patch) {
-+ DBGLOG(MODULE_SHORT, "Patching BRCM2046 Hub into bluetoothd");
-+ searchAndPatch(data, PAGE_SIZE, path, kBluetoothUSBNameOriginal, kBluetoothUSBNamePatched2046);
-+ } else if (brcm2070_patch) {
-+ DBGLOG(MODULE_SHORT, "Patching BRCM2070 Hub into bluetoothd");
-+ searchAndPatch(data, PAGE_SIZE, path, kBluetoothUSBNameOriginal, kBluetoothUSBNamePatched2070);
-+ }
-+ }
- }
- }
-
diff --git a/payloads/Kexts/Misc/Bluetooth-Spoof-v1.0.0.zip b/payloads/Kexts/Misc/Bluetooth-Spoof-v1.0.0.zip
new file mode 100644
index 000000000..539c52e55
Binary files /dev/null and b/payloads/Kexts/Misc/Bluetooth-Spoof-v1.0.0.zip differ