Pocket Forge/Guides/Bluetooth Audio
🔊 #1 CONNECTIVITY ISSUE FOR UCONSOLE OWNERS

Fix Bluetooth audio on your uConsole.

Crackling speakers, failed pairing, A2DP refusing to connect — Bluetooth audio on the uConsole is broken out of the box. Here's the complete fix.

10 min readUpdated Mar 2026CM4 & CM5 testedFree guide
01 — The Root Cause

Why Bluetooth audio breaks on uConsole.

The uConsole's Bluetooth woes stem from a perfect storm of issues. The CM4 module uses a BCM43455 combo WiFi/BT chip sharing a single antenna and USB bus, while the CM5 uses an updated but similarly constrained radio. Out of the box, the stock ClockworkPi OS image ships with incomplete Bluetooth firmware blobs, a PulseAudio configuration that doesn't load the bluetooth module, and kernel parameters that aggressively suspend the USB bus — killing your BT connection mid-song.

Here's what's actually going wrong under the hood:

COMMON FAILURE POINTS
Missing firmware BCM43455 needs proprietary blobs in /lib/firmware/brcm/ — stock image often ships stale versions
PulseAudio misconfiguration module-bluetooth-discover not loaded by default, so PA can't see BT devices
USB bandwidth contention WiFi + BT share the same USB 2.0 bus on CM4 — high WiFi traffic starves BT audio
Power management USB autosuspend and runtime PM kill the BT adapter after seconds of inactivity
Kernel module conflicts btusb and hci_uart can fight over the same device, especially after sleep/resume
check if bluetooth firmware is loaded
$ dmesg | grep -i "bluetooth\|brcm\|firmware"
[    5.123] Bluetooth: Core ver 2.22
[    5.124] Bluetooth: HCI device and connection manager initialized
[    5.189] Bluetooth: hci0: BCM: chip id 107
[    5.190] Bluetooth: hci0: BCM43455
[    5.422] Bluetooth: hci0: BCM43455 firmware loaded successfully
# If you see "firmware file not found" — that's your problem

The good news: every one of these issues is fixable with the right configuration. Let's start diagnosing.

02 — Quick Diagnostics

Quick diagnostic checklist.

easy
Impact

Before changing any configuration, run these commands to understand the current state of your Bluetooth stack. Copy and paste each one into your uConsole terminal.

1

Check if the Bluetooth service is running

The bluetooth.service daemon must be active for anything to work.

systemctl
$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled)
   Active: active (running)
# If "inactive" or "failed", run:
$ sudo systemctl enable --now bluetooth
2

Verify the adapter is detected

Confirm the HCI device is up and not blocked by rfkill.

adapter check
$ bluetoothctl show
Controller DC:A6:32:XX:XX:XX (public)
  Name: uconsole
  Powered: yes
  Discoverable: no
  Pairable: yes

# If "No default controller available", check rfkill:
$ rfkill list
0: hci0: Bluetooth
  Soft blocked: no
  Hard blocked: no
# If soft blocked:
$ rfkill unblock bluetooth
3

Check kernel Bluetooth messages

Look for firmware errors, timeout messages, or module load failures.

dmesg bluetooth
$ dmesg | grep -i bluetooth
# Look for errors like:
#   "firmware file not found" → missing firmware blob
#   "hci0: command timeout" → USB power management issue
#   "Can't change to HCI mode" → driver conflict
4

Test audio subsystem

Check which audio server is running and if it sees BT devices.

audio subsystem
# Check if PulseAudio or PipeWire is active
$ pactl info | head -5
Server String: /run/user/1000/pulse/native
Server Name: pulseaudio
# (or "PipeWire" if using PipeWire)

# List audio sinks — your BT device should appear here
$ pactl list sinks short
0  alsa_output.platform-sound.stereo-fallback  ...  RUNNING
# If no bluetooth sink, the BT audio module isn't loaded
5

Check installed BT audio packages

Make sure the bluetooth audio modules are actually installed.

package check
$ dpkg -l | grep -E "bluetooth|pulseaudio-module|pipewire"
# You need at minimum:
#   bluez               — core bluetooth stack
#   pulseaudio-module-bluetooth  (for PulseAudio)
#     OR
#   pipewire-pulse + libspa-0.2-bluetooth  (for PipeWire)

TIP: Run all five checks before making changes. Copy the output somewhere — you'll want to compare before and after.

03 — PulseAudio Route

PulseAudio Bluetooth setup.

moderate
Impact

If your uConsole ships with PulseAudio (most stock images do), you need to install the Bluetooth module and configure it properly. The stock image typically omits this entirely.

1

Install the PulseAudio Bluetooth module

install
$ sudo apt update
$ sudo apt install -y pulseaudio-module-bluetooth bluez-tools
$ sudo systemctl restart bluetooth
2

Load the Bluetooth modules in PulseAudio

Add these lines to your PulseAudio config so the modules load on startup.

~/.config/pulse/default.pa (or /etc/pulse/default.pa)
# Add these lines at the end of the file:
$ cat >> ~/.config/pulse/default.pa << 'EOF'

### Bluetooth support
load-module module-bluetooth-policy
load-module module-bluetooth-discover
EOF

# Or load them immediately without restart:
$ pactl load-module module-bluetooth-policy
$ pactl load-module module-bluetooth-discover
3

Pair your Bluetooth device

Use bluetoothctl interactively. Put your speaker or headphones in pairing mode first.

bluetoothctl pairing session
$ bluetoothctl
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# scan on
Discovery started
[NEW] Device AA:BB:CC:DD:EE:FF Your-Speaker-Name
[bluetooth]# scan off
[bluetooth]# pair AA:BB:CC:DD:EE:FF
Attempting to pair with AA:BB:CC:DD:EE:FF
[CHG] Device AA:BB:CC:DD:EE:FF Paired: yes
Pairing successful
[bluetooth]# trust AA:BB:CC:DD:EE:FF
[CHG] Device AA:BB:CC:DD:EE:FF Trusted: yes
Changing AA:BB:CC:DD:EE:FF trust succeeded
[bluetooth]# connect AA:BB:CC:DD:EE:FF
Attempting to connect to AA:BB:CC:DD:EE:FF
[CHG] Device AA:BB:CC:DD:EE:FF Connected: yes
Connection successful
[bluetooth]# quit
4

Set the A2DP profile

By default, PulseAudio may connect using the low-quality HSP/HFP profile (headset mode). Force A2DP for high-quality audio.

set A2DP profile
# Find your bluetooth card
$ pactl list cards short
0  bluez_card.AA_BB_CC_DD_EE_FF  ...

# Switch to A2DP sink profile
$ pactl set-card-profile bluez_card.AA_BB_CC_DD_EE_FF a2dp-sink

# Set it as the default audio output
$ pactl set-default-sink bluez_sink.AA_BB_CC_DD_EE_FF.a2dp-sink
COMMON ERROR: "Failed to set card profile to a2dp_sink"

This usually means PulseAudio can't negotiate the A2DP codec with your device. Fix it by editing the PulseAudio bluetooth policy:

fix a2dp profile failure
# Edit bluetooth policy config
$ sudo nano /etc/pulse/default.pa

# Find this line:
load-module module-bluetooth-policy

# Replace with:
load-module module-bluetooth-policy auto_switch=2

# Then restart PulseAudio:
$ pulseaudio --kill && pulseaudio --start

# If that still fails, try removing and re-pairing:
$ bluetoothctl remove AA:BB:CC:DD:EE:FF
# Then repeat the pairing steps above
5

Make it survive reboot

Ensure bluetooth service starts on boot and auto-connects to trusted devices.

persist bluetooth
# Enable bluetooth service on boot
$ sudo systemctl enable bluetooth

# Enable auto-connect for paired devices
$ sudo nano /etc/bluetooth/main.conf
# Uncomment or add under [Policy]:
[Policy]
AutoEnable=true

# Restart to apply
$ sudo systemctl restart bluetooth
04 — PipeWire Route (Recommended)

PipeWire Bluetooth setup.

moderate
Impact

RECOMMENDED: PipeWire handles Bluetooth audio significantly better than PulseAudio on ARM devices. It has native support for high-quality codecs (AAC, aptX, LDAC), lower latency, and better handling of device reconnection. If you're setting up from scratch, go with PipeWire.

1

Remove PulseAudio and install PipeWire

PipeWire replaces PulseAudio entirely and provides a drop-in compatibility layer. This is a single operation.

install pipewire
$ sudo apt update
$ sudo apt install -y pipewire pipewire-pulse pipewire-audio \
  wireplumber libspa-0.2-bluetooth

# Remove PulseAudio bluetooth module (conflicts with PipeWire)
$ sudo apt remove -y pulseaudio-module-bluetooth

# PipeWire replaces PulseAudio automatically via pipewire-pulse
# Verify the switch:
$ pactl info | grep "Server Name"
Server Name: PipeWire
2

Enable PipeWire services

enable pipewire
# Enable PipeWire and WirePlumber for your user
$ systemctl --user enable pipewire pipewire-pulse wireplumber
$ systemctl --user start pipewire pipewire-pulse wireplumber

# Verify everything is running
$ systemctl --user status pipewire wireplumber
● pipewire.service - PipeWire Multimedia Service
   Active: active (running)
● wireplumber.service - WirePlumber session manager
   Active: active (running)
3

Configure Bluetooth codec preferences

WirePlumber lets you set preferred codecs. Create a configuration override for high-quality audio.

~/.config/wireplumber/bluetooth.lua.d/51-bluetooth-config.lua
$ mkdir -p ~/.config/wireplumber/bluetooth.lua.d

$ cat > ~/.config/wireplumber/bluetooth.lua.d/51-bluetooth-config.lua << 'EOF'
-- Prefer high-quality codecs in this order
bluez_monitor.properties = {
  ["bluez5.enable-sbc-xq"] = true,
  ["bluez5.enable-msbc"] = true,
  ["bluez5.enable-hw-volume"] = true,
  ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]",
  ["bluez5.codecs"] = "[ sbc sbc_xq aac ldac aptx aptx_hd ]",
  ["bluez5.default.rate"] = 48000,
  ["bluez5.default.channels"] = 2,
}
EOF

# Restart WirePlumber to apply
$ systemctl --user restart wireplumber
4

Pair and connect via bluetoothctl

Same pairing process as PulseAudio, but PipeWire will automatically negotiate the best available codec.

pair and verify
# Pair your device (same as before)
$ bluetoothctl
[bluetooth]# scan on
[bluetooth]# pair AA:BB:CC:DD:EE:FF
[bluetooth]# trust AA:BB:CC:DD:EE:FF
[bluetooth]# connect AA:BB:CC:DD:EE:FF
[bluetooth]# quit

# Verify the connection and codec with PipeWire
$ pw-dump | grep -A5 "api.bluez5.codec"
  "api.bluez5.codec": "sbc_xq",
  "api.bluez5.profile": "a2dp-sink",

# Or use wpctl for a cleaner view
$ wpctl status
Audio
 ├─ Sinks:
 │   *  47. Your-Speaker-Name [vol: 0.74]
5

Set as default audio output

default output
# List sinks and find the BT device ID
$ wpctl status
# Note the sink ID number (e.g., 47)

# Set as default
$ wpctl set-default 47

# Test audio
$ speaker-test -t wav -c 2
# Or play something:
$ mpv --ao=pulse your-audio-file.mp3
Don't miss what's next

Get the next guide before it's published.

We're writing guides on overclocking, QMK keyboard firmware, and i3 desktop setup. Join the list to get early access — plus discount codes for the Toolkit.

>

No spam. Unsubscribe anytime.

05 — Codec Configuration

A2DP sink configuration for high-quality audio.

advanced
Impact

Not all Bluetooth audio is created equal. The codec your uConsole negotiates with your speaker or headphones determines audio quality, latency, and stability. Here's the breakdown.

codec comparison
CODEC
BITRATE
LATENCY
QUALITY
SUPPORT
SBC
198-345 kbps
~150ms
Universal
SBC-XQ
420-452 kbps
~120ms
Most devices
AAC
256 kbps
~120ms
Apple, many others
aptX
352 kbps
~80ms
Qualcomm devices
aptX HD
576 kbps
~100ms
Qualcomm (newer)
LDAC
330-990 kbps
~120ms
Sony, some others

The uConsole's BCM43455 supports SBC and SBC-XQ natively. For AAC, aptX, or LDAC, you need PipeWire (not PulseAudio) and the libspa-0.2-bluetooth package. If you use a USB adapter, codec support depends on the adapter's chipset.

Force a specific codec

force codec in PipeWire
# Check which codec is currently active
$ pw-dump | grep "api.bluez5.codec"
  "api.bluez5.codec": "sbc",

# Force SBC-XQ (best option for built-in adapter)
$ cat > ~/.config/wireplumber/bluetooth.lua.d/52-force-codec.lua << 'EOF'
rule = {
  matches = {
    {
      { "node.name", "matches", "bluez_output.*" },
    },
  },
  apply_properties = {
    ["bluez5.a2dp.codec"] = "sbc_xq",
  },
}
table.insert(bluez_monitor.rules, rule)
EOF

$ systemctl --user restart wireplumber

Fix audio crackling & choppy playback

Audio crackling on Bluetooth is almost always caused by buffer underruns — the audio data isn't reaching the BT adapter fast enough. This is especially common on the uConsole because the CPU may throttle under load.

fix bluetooth audio crackling
# Increase PipeWire buffer size to prevent underruns
$ mkdir -p ~/.config/pipewire/pipewire.conf.d

$ cat > ~/.config/pipewire/pipewire.conf.d/99-bluetooth-buffer.conf << 'EOF'
context.properties = {
  default.clock.rate          = 48000
  default.clock.quantum       = 1024
  default.clock.min-quantum   = 512
  default.clock.max-quantum   = 2048
}
EOF

# For PulseAudio users, edit /etc/pulse/daemon.conf:
# default-fragment-size-msec = 25
# default-fragments = 4

# Restart audio
$ systemctl --user restart pipewire pipewire-pulse

Reduce audio latency

If you're gaming or watching video on the uConsole, audio delay is noticeable. You can trade stability for latency:

low-latency bluetooth config
# Lower buffer for less latency (may crackle on slow CPUs)
$ cat > ~/.config/pipewire/pipewire.conf.d/99-low-latency.conf << 'EOF'
context.properties = {
  default.clock.rate          = 48000
  default.clock.quantum       = 256
  default.clock.min-quantum   = 128
}
EOF

# If using aptX codec, latency is already lower (~80ms)
# Test and adjust quantum between 128-1024 to find your sweet spot
$ systemctl --user restart pipewire

NOTE: There's always a tradeoff between latency and stability with Bluetooth audio. Lower quantum = less delay but more chance of crackling. Start with 1024 and work down.

06 — Hardware Alternatives

Recommended USB Bluetooth adapters.

If your built-in BCM43455 Bluetooth is unreliable — frequent disconnects, poor range, or constant firmware issues — a USB Bluetooth adapter is the nuclear option. These are tested and confirmed working on the uConsole.

BEST OVERALL

TP-Link UB500

Bluetooth: 5.0
Chipset: Realtek RTL8761B
Codecs: SBC, AAC, aptX (with PipeWire)
Range: ~20m
Price: ~$13

Most reliable option. Works out of the box on recent kernels (5.15+). Tiny form factor doesn't stick out of the uConsole USB port. Firmware blob included in linux-firmware package.

BEST RANGE

ASUS USB-BT500

Bluetooth: 5.0
Chipset: Realtek RTL8761B
Codecs: SBC, AAC, aptX
Range: ~40m
Price: ~$15

Same RTL8761B chipset as TP-Link but with a better antenna design. Good if you need range. Slightly larger physical size.

Plugable USB-BT4LE

Bluetooth: 4.0 LE
Chipset: Broadcom BCM20702
Codecs: SBC, SBC-XQ
Range: ~10m
Price: ~$8

Budget option. BT 4.0 only so no aptX/LDAC. Solid Linux support with in-kernel BCM drivers. Good enough for basic speaker audio.

Zexmte BT 5.3

Bluetooth: 5.3
Chipset: Realtek RTL8761BUV
Codecs: SBC, AAC, aptX, aptX HD, LDAC
Range: ~30m
Price: ~$10

Newest BT 5.3 spec. Full codec support with PipeWire. Requires kernel 5.19+ and updated linux-firmware for the RTL8761BUV blob.

disable built-in BT when using USB adapter
# If using an external USB adapter, disable the built-in one
# to prevent conflicts:
$ sudo nano /boot/config.txt
# Add:
dtoverlay=disable-bt

# Or block the internal adapter at runtime:
$ sudo hciconfig hci0 down  # internal
$ sudo hciconfig hci1 up    # USB adapter

# Verify which adapter is active:
$ hciconfig -a
hci1:   Type: Primary  Bus: USB
        BD Address: XX:XX:XX:XX:XX:XX  ACL MTU: 1021:8
        UP RUNNING
07 — Power Management

Power management settings that kill Bluetooth.

moderate
Impact

This is the #1 hidden cause of Bluetooth audio dropping on the uConsole. The kernel's power management aggressively suspends USB devices to save battery — but it kills your Bluetooth connection in the process. Bluetooth drops after 2-5 minutes of audio? This is almost certainly your problem.

1

Disable USB autosuspend for Bluetooth

Create a udev rule that keeps the BT adapter awake.

/etc/udev/rules.d/50-bluetooth-no-autosuspend.rules
$ sudo cat > /etc/udev/rules.d/50-bluetooth-no-autosuspend.rules << 'EOF'
# Disable autosuspend for all Bluetooth USB adapters
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0a5c", \
  ATTR{power/autosuspend}="-1"
# Broadcom (built-in CM4)
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0bda", \
  ATTR{power/autosuspend}="-1"
# Realtek (TP-Link UB500, ASUS BT500)
EOF

# Reload udev rules
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger

# Verify autosuspend is disabled
$ cat /sys/bus/usb/devices/*/power/autosuspend
# Should show -1 for your BT adapter
2

Fix WiFi/BT coexistence interference

The CM4's BCM43455 shares an antenna between WiFi and Bluetooth. When both are active, they compete for airtime. This causes audio stuttering during WiFi transfers.

bluetooth/wifi coexistence fix
# Option 1: Switch WiFi to 5GHz (if your router supports it)
# 5GHz doesn't interfere with BT's 2.4GHz band
$ sudo nmcli device wifi connect "YourSSID_5G" password "pass"

# Option 2: Reduce WiFi power to give BT more airtime
$ sudo iwconfig wlan0 txpower 10

# Option 3: Set BT coexistence mode (CM4 specific)
$ sudo nano /boot/config.txt
# Add:
dtparam=ant2

# This improves antenna sharing between WiFi and BT
# Reboot required after changing config.txt
3

Kernel parameters for BT stability

Add boot parameters that prevent the kernel from power-cycling Bluetooth.

/boot/cmdline.txt
# Edit the kernel command line (all on one line!)
$ sudo nano /boot/cmdline.txt

# Add these parameters to the existing line:
usbcore.autosuspend=-1 btusb.enable_autosuspend=0

# The full line might look like:
# console=serial0,115200 ... rootwait usbcore.autosuspend=-1 btusb.enable_autosuspend=0

# Reboot to apply
$ sudo reboot
4

Override systemd runtime power management

Even with udev rules, systemd's power management daemon can re-enable autosuspend. Override it.

systemd power override
# Create a systemd override to prevent BT power management
$ sudo mkdir -p /etc/systemd/system/bluetooth.service.d

$ sudo cat > /etc/systemd/system/bluetooth.service.d/override.conf << 'EOF'
[Service]
ExecStartPost=/bin/bash -c 'for f in /sys/bus/usb/devices/*/power/autosuspend; do echo -1 > "$f" 2>/dev/null; done'
ExecStartPost=/bin/bash -c 'for f in /sys/bus/usb/devices/*/power/control; do echo on > "$f" 2>/dev/null; done'
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl restart bluetooth

# Also prevent TLP from managing BT (if TLP is installed)
$ sudo nano /etc/tlp.conf
# Add:
USB_AUTOSUSPEND=0
# Or target only BT:
USB_DENYLIST="0a5c:* 0bda:*"

IMPACT: These power management fixes alone resolve ~70% of Bluetooth audio issues on the uConsole. If your BT audio works for a few minutes then cuts out, start here before touching audio server config.

08 — The Easy Way

Skip all of this — get the Toolkit.

Everything above? The firmware fixes, PipeWire migration, codec configuration, udev rules, kernel parameters — the Pocket Forge uConsole Toolkit pre-configures all of it into a single flashable OS image.

pocket-forge toolkit — bluetooth
$ pocket-forge bluetooth --status

  ┌─────────────────────────────────────────────┐
  │  BLUETOOTH AUDIO — ALL SYSTEMS GO           │
  ├─────────────────────────────────────────────┤
  │                                             │
  │  ✓ PipeWire + WirePlumber    configured     │
  │  ✓ Bluetooth firmware        up to date     │
  │  ✓ A2DP codec (SBC-XQ)      active          │
  │  ✓ USB autosuspend           disabled        │
  │  ✓ WiFi/BT coexistence      optimized       │
  │  ✓ Power management          overridden      │
  │  ✓ Auto-reconnect            enabled         │
  │  ✓ Audio buffer              tuned           │
  │                                             │
  │  Connected: JBL Flip 6 (SBC-XQ, 48kHz)     │
  │  Latency:   ~110ms                          │
  │  Quality:   ████████░░ 80%                  │
  │                                             │
  └─────────────────────────────────────────────┘

  → No manual configuration required.
  → Just pair your device and it works.

uConsole Toolkit

Pre-configured OS image with Bluetooth, WiFi, power management, and 30+ tools — all working out of the box.

PRE-ORDER — $29

One-time purchase. CM4 & CM5 images included. Free updates. Secure checkout via Stripe.

FAQ

Frequently asked.

My uConsole can't find any Bluetooth devices during scan — what's wrong?+

First check rfkill list to make sure Bluetooth isn't soft or hard blocked. Then verify the bluetooth service is running with systemctl status bluetooth. If hci0 doesn't show up at all, you likely have a firmware issue — run dmesg | grep -i bluetooth and look for 'firmware file not found' errors. Install the latest firmware with: sudo apt install firmware-brcm80211, then reboot.

Can I use Bluetooth headphones for calls/voice chat on the uConsole?+

Yes, but you need the HSP/HFP profile instead of A2DP. With PipeWire, this is handled automatically — when a call app requests a microphone, PipeWire switches to the HFP profile and back. With PulseAudio, set auto_switch=2 in module-bluetooth-policy to enable automatic switching. Note that HFP audio quality is much lower than A2DP (8kHz mono vs 48kHz stereo).

Bluetooth audio works but disconnects after a few minutes+

This is almost certainly a power management issue. The USB autosuspend feature is suspending your Bluetooth adapter. Follow Section 7 of this guide to disable USB autosuspend via udev rules and kernel parameters. The key fixes are: set usbcore.autosuspend=-1 in /boot/cmdline.txt and create the udev rule in /etc/udev/rules.d/50-bluetooth-no-autosuspend.rules.

Should I use PulseAudio or PipeWire for Bluetooth audio?+

PipeWire is strongly recommended for the uConsole. It handles Bluetooth codecs better (native AAC, aptX, LDAC support), has lower latency, recovers from disconnections more gracefully, and uses less CPU on ARM processors. PipeWire is a drop-in replacement for PulseAudio — all your existing PA applications will continue to work through pipewire-pulse.

Does the uConsole Toolkit fix all of these Bluetooth issues automatically?+

Yes. The Toolkit OS image ships with PipeWire pre-configured, correct firmware blobs installed, USB autosuspend disabled for BT adapters, WiFi/BT coexistence optimized, and SBC-XQ codec enabled by default. Just pair your device via the GUI or bluetoothctl and it works. No manual configuration needed.

Stay Updated

More guides are coming.

We're writing guides on i3 desktop setup, QMK keyboard firmware, overclocking profiles, and more. Join the waitlist to get notified when they drop — plus early access to new tools.

>

Also check out our WiFi Fix GuideBattery Life Guide

Your email is stored securely and used only for Pocket Forge updates. Unsubscribe anytime.