A reproducible, end-to-end fix for Windows blocking the Barrot / BT60 Bluetooth USB dongle (and similar vendor-USB-Bluetooth-class devices) by re-binding the driver to the standard BTHUSB and disabling competing radios. The fix survives reboots, replugs, and Windows Update.
Tested on: Windows 10/11, old laptop with built-in Qualcomm Atheros QCA61x4 Bluetooth, a Qualcomm Atheros AR3012 USB dongle, and a Barrot BT60 USB dongle. Symptoms: BT60 enumerates as a generic USB device, no Bluetooth radio appears, pairing fails.
| File | Purpose |
|---|---|
README.md |
This file — overview, decision tree, and the one-command fix. |
GUIDE.md |
Step-by-step human-readable walkthrough of what each phase does and why. Read this first if you're not a Windows driver developer. |
QUICKSTART.md |
If you just want the fix without understanding it — run one script, reboot, done. |
bt60_incident_report.md |
The original incident analysis with all registry paths, GUIDs, and event IDs. This is the technical deep-dive. |
bt60_chat_export.txt |
Full chat transcript of the original diagnostic and fix session. |
Total History.txt |
Full puku-cli shell history of every command run during the fix. |
scripts/ |
All PowerShell scripts in the order they were run. |
logs/ |
Output logs from each script execution. |
| # | Script | What it does |
|---|---|---|
| 1 | scripts/bt60_diag.ps1 |
Capture initial state of all Bluetooth devices, services, drivers, policies. |
| 2 | scripts/bt60_recover.ps1 |
Remove ghost Barrot/BRTLink USB device instances, re-register driver. |
| 3 | scripts/bt60_check.ps1 |
Verify driver binding state. |
| 4 | scripts/bt60_force.ps1 |
Try enable/restart on stuck child devices. |
| 5 | scripts/bt60_radio.ps1 |
Inspect registry, force-clear ConfigFlags block bit. |
| 6 | scripts/bt60_fix.ps1 |
Uninstall brtlinkusb, force BTHUSB binding. |
| 7 | scripts/bt60_clean.ps1 |
Remove all Barrot oem*.inf driver packages. |
| 8 | scripts/bt60_force_bind.ps1 |
Force BTHUSB without replug. |
| 9 | scripts/bt60_make_primary.ps1 |
Disable AR3012/QCA61x4 so BARROT becomes the active radio. |
| 10 | scripts/bt60_permanent_v2.ps1 |
THE MAIN FIX. Hard-pin driver, blacklist Barrot INFs, disable competing radios, install lockdown scheduled task. |
| 11 | scripts/bt60_audio.ps1 |
Investigate Joyroom JR-X2 (or any) Bluetooth audio profile — Stereo vs Hands-Free. |
Each *_log.txt is the output captured from running the matching *.ps1 script. They are useful for debugging, comparing your system state to the fixed state, and as evidence in bug reports.
There are two stacked root causes. Understanding them is important because the "fix" only works if you address both.
When you plug the BT60 in, Windows finds a matching brbtusb.inf in its driver store (the Barrot vendor driver). That INF does two things:
- Installs a
brtlinkusbservice that binds the device as a generic USB device. - Adds
brbtusbas a LowerFilter on the standardBTHUSBdriver for this device.
The result: the device enumerates as a USB device (Class GUID {36fc9e60-c465-11cf-8056-444553540000}) instead of a Bluetooth radio (Class GUID {e0cbf06c-cd8b-4647-bb8a-263b43f0f974}). Even worse, BTHUSB's AddDevice call fails with STATUS_UNSUCCESSFUL (0xC0000001) because the brbtusb lower filter cannot initialize. The device ends up in CM_PROB_FAILED_ADD (ProblemCode 31).
Windows Bluetooth stack allows only one active Bluetooth radio at a time. When a system has more than one Bluetooth adapter (in our case: built-in QCA61x4 + AR3012 USB dongle + BT60), only one becomes active. BTHUSB logs event ID 6 ("Only one active Bluetooth adapter is supported at a time") and refuses to start the others.
So even after you fix the Barrot driver issue, the BT60 will sit at Status=Error because the AR3012 (or QCA61x4) is holding the active-radio slot.
If you are running this on a Windows PC where the same problem exists, you can apply the entire fix with one command — as Administrator.
- Windows 10 or 11
- PowerShell 5.1+ (already built-in)
- Run the shell as Administrator (right-click PowerShell → "Run as administrator")
# 1. Open PowerShell as Administrator
# 2. Allow running this script (one-time)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
# 3. Run the master fix
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/IroScript/windows-blocked-barrot-bluetooth-driver-solved/main/scripts/bt60_permanent_v2.ps1" -OutFile "$env:TEMP\bt60_fix.ps1"
powershell -ExecutionPolicy Bypass -File "$env:TEMP\bt60_fix.ps1"
# 4. When prompted, unplug and replug the BT60 into a different USB port
# 5. Reboot
Restart-ComputerThat's it. After reboot, the BT60 will be the only Bluetooth radio on the system, bound to the standard Microsoft BTHUSB driver.
# 1. Open PowerShell as Administrator
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
# 2. Run the scripts in order
cd "C:\Users\Irak\Desktop\Bluetooth Connection Device Solved_Read_MD_File"
foreach ($s in 'bt60_diag.ps1','bt60_recover.ps1','bt60_check.ps1','bt60_force.ps1','bt60_radio.ps1','bt60_fix.ps1','bt60_clean.ps1','bt60_force_bind.ps1','bt60_make_primary.ps1','bt60_permanent_v2.ps1','bt60_audio.ps1') {
Write-Host "=== Running $s ===" -ForegroundColor Cyan
powershell -ExecutionPolicy Bypass -File ".\scripts\$s"
}
# 3. Reboot
Restart-ComputerThe output of each script is captured in the matching *_log.txt file under logs/.
The bt60_permanent_v2.ps1 script makes the following persistent changes:
- Pins BT60 driver to
BTHUSBatHKLM:\SYSTEM\CurrentControlSet\Enum\USB\VID_33FA&PID_0001\<instance>\Service. - Re-sets HardwareID and CompatibleIDs to the standard Bluetooth HCI USB class so Windows classifies it correctly on every replug.
- Overrides
DeviceClassGUID andDeviceTypeinDevice Parametersto force Bluetooth radio classification. - Blacklists
brbtusb.infandbrtlinkusb.infviaHKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching\SearchDisallowedDrivers. - Marks cached Barrot
oem*.infpackages asDenyinDriverDatabase\DriverPackages\*. - Disables AR3012 and QCA61x4 and flags all historical instances in their enum trees with
ConfigFlags=1so they never reclaim the active-radio slot. - Creates a scheduled task
BT60 Lockdownthat re-asserts everything at every boot and logon. Script:C:\Windows\System32\BT60_Lockdown.ps1.
After running the fix and rebooting:
# Should show ONE active Bluetooth radio (the BT60)
Get-PnpDevice -Class Bluetooth | Where-Object { $_.InstanceId -like 'BTH\MS_BTHBRB*' -and $_.Status -eq 'OK' }
# Expected: one Microsoft Bluetooth Enumerator with Status=OK
# BT60 device should be:
# Status=OK, Service=BTHUSB, Class=Bluetooth
Get-PnpDevice -ErrorAction SilentlyContinue | Where-Object { $_.InstanceId -like 'USB\VID_33FA*' } | Format-List Status, Class, ClassGuid, FriendlyName
# Competing radios should be disabled (Status=Error or greyed)
Get-PnpDevice -InstanceId 'USB\VID_13D3&PID_3402\ALASKA_DAY_2006','USB\VID_0CF3&PID_3004\ALASKA_DAY_2006' | Format-Table Status, FriendlyName
# Lockdown task should be ready
Get-ScheduledTask -TaskName 'BT60 Lockdown' | Format-List State, @{N='Triggers';E={$_.Triggers.Count}}# Remove the scheduled task
Unregister-ScheduledTask -TaskName 'BT60 Lockdown' -Confirm:$false
Remove-Item 'C:\Windows\System32\BT60_Lockdown.ps1' -Force
# Remove policy entries
Remove-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching\SearchDisallowedDrivers' -Name 'brbtusb.inf' -ErrorAction SilentlyContinue
Remove-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching\SearchDisallowedDrivers' -Name 'brtlinkusb.inf' -ErrorAction SilentlyContinue
# Re-enable competing radios
pnputil /enable-device "USB\VID_13D3&PID_3402\ALASKA_DAY_2006"
pnputil /enable-device "USB\VID_0CF3&PID_3004\ALASKA_DAY_2006"
# Remove registry overrides on the BT60 device (so PnP can re-evaluate):
# (Run Device Manager → right-click BT60 → Uninstall device, then replug)| Symptom | Likely cause | Fix |
|---|---|---|
| BT60 still shows as "USB Composite Device" | ConfigFlags=1 block bit is set on the device instance |
Run bt60_radio.ps1 to clear it |
| BT60 has red X, ProblemCode 31 | brbtusb lower filter still active |
Run bt60_clean.ps1 to remove Barrot drivers |
| BT60 has red X, no ProblemCode | Active-radio slot is held by another adapter | Run bt60_make_primary.ps1 to disable others |
| After reboot, BT60 stops working | Driver binding not pinned in registry | Run bt60_permanent_v2.ps1 |
SetupAPI.dev.log shows Lower Filters = brbtusb |
Barrot INF re-applied | Delete oem*.inf and run bt60_permanent_v2.ps1 |
GUIDE.md— the friendly walkthrough, explains what each script does in plain English.QUICKSTART.md— the no-fluff instructions.bt60_incident_report.md— the full technical analysis with all registry paths, GUIDs, and event IDs.bt60_chat_export.txt— original chat session, useful for context.Total History.txt— every shell command run, in order.
| Device | VID:PID |
|---|---|
| Barrot BT60 | 0x33FA:0x0001 |
| Qualcomm Atheros AR3012 | 0x13D3:0x3402 |
| Qualcomm Atheros QCA61x4 | 0x0CF3:0x3004 |
If your device has different VID/PID, edit the four *_VID / *_PID constants at the top of bt60_permanent_v2.ps1 and re-run.
MIT — do whatever you want with this. If it helps you, a star on the repo is appreciated.
IroScript — issue reports and pull requests welcome.