Back to posts.

Setting up a Bluetooth Headset on Arch Linux

I got a Sennheiser PXC 550 headset that I wanted to setup on my Arch Linux PC recently. The PXC 550 headset is a wireless headset that can be used wirelessly using bluetooth. I'm setting it up on a PC with the following specs

  • OS: Linux arch680 5.0.7-arch1-1-ARCH x86_64 GNU/Linux
  • Bluetooth: External USB Bluetooth adapter with Broadcom chipset
  • Headset: Sennheiser PXC 550

Before we get started make sure your system is up to date. If you don't feel like doing a full system upgrade at least make sure to update your the keyring and packages.

Updating your system

Full upgrade

# pacman -Sy
# pacman-key --refresh-keys
# pacman -Syu

Minimal upgrade

# pacman -Sy
# pacman-key --refresh-keys

Installing necessary packages

# pacman -S pulseaudio-bluetooth
# pacman -S pulseaudio-alsa
# pacman -S pavucontrol
# pacman -S bluez
# pacman -S bluez-utils

Make sure bluetooth is running and automatically starts after booting:

# systemctl enable bluetooth
# systemctl start bluetooth

Configure PulseAudio and Bluetooth

Add the following to the bottom of the main bluetooth configuration file:

# emacs -nw /etc/bluetooth/main.cf
 
AutoEnable=true

To make sure that your headsets is automatically connected to your bluetooth device we need to enable the switch-on-connect module. We also copy the configurations to our user directory because we don't want to change the system wide settings. If you want you can also change /etc/pulse/* though, the choice is whatever you prefer.

mkdir -p ~/.config/pulse
cp /etc/pulse/* ~/.config/pulse/
 
 
# emacs -nw ~/.config/pulse/default.pa
load-module module-switch-on-connect      -- add this at the bottom

After making these changes restart bluetooth:

# systemctl restart bluetooth

Pairing your headset

Ok we've finally done all the ground work to pair our PXC 550. Open a terminal and start bluetoothctl. We use bluetoothctl to pair, trust and connect to the headset.

But before we start we check if the device was already paired and maybe incorrectly configured. To make sure we start off with the same settings check if the device was paired, then remove it and start from scratch:

# bluetoothctl
 
[bluetooth]# paired-devices
Device 00:1D:43:6D:03:26 PXC 550
 
[bluetooth]# remove 00:1D:43:6D:03:26

Ok, now we can start with a clean configuration. Execute the following commands. After you've given the scan on command (see below), you need to put your PXC headset into pairing more.

To set your PXC 550 into pairing mode hold down the sound effect button (on the right cap) for 4 seconds. The headset will tell you something like "Pairing..."

You can use the TAB key to autocomplete the device IDs. You don't have to type them yourself, simply type the first characters and hit TAB.

$ bluetoothctl
 
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
 
[NEW] Device 00:1D:43:6D:03:26 PXC 550
 
[bluetooth]# pair 00:1D:43:6D:03:26     -- pair with the device
[bluetooth]# connect 00:1D:43:6D:03:26  -- connect with the device
[bluetooth]# trust 00:1D:43:6D:03:26    -- trust the device
 
[bluetooth]# scan off
[bluetooth]# exit

Verify if your headset is working

You can use pacat or just open a YouTube video. To playback a YouTube video make sure to restart your browser if you already opened it.

pacat < /dev/urandom

You can also open pavucontrol and see if the bluetooth headset was found in the output devices tab.

Troubleshooting

Here are some commands that can help you to get more information when you're running into problems.

dmesg

# dmesg | grep -i bluetooth
 
[    5.114524] Bluetooth: Core ver 2.22
[    5.114534] Bluetooth: HCI device and connection manager initialized
[    5.114538] Bluetooth: HCI socket layer initialized
[    5.114539] Bluetooth: L2CAP socket layer initialized
[    5.114541] Bluetooth: SCO socket layer initialized
[    5.181918] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    5.181919] Bluetooth: BNEP filters: protocol multicast
[    5.181922] Bluetooth: BNEP socket layer initialized
[    5.264246] Bluetooth: hci1: BCM: chip id 63
[    5.265242] Bluetooth: hci1: BCM: features 0x07
[    5.281221] Bluetooth: hci1: arch680
[    5.282232] Bluetooth: hci1: BCM20702A1 (001.002.014) build 0000
[    5.282399] bluetooth hci1: Direct firmware load for brcm/BCM20702A1-0a5c-21e8.hcd failed with error -2
[    5.282400] Bluetooth: hci1: BCM: Patch brcm/BCM20702A1-0a5c-21e8.hcd not found
[   16.534360] Bluetooth: RFCOMM TTY layer initialized
[   16.534366] Bluetooth: RFCOMM socket layer initialized
[   16.534371] Bluetooth: RFCOMM ver 1.11

lsmod

$ lsmod | grep -i bluetooth
bluetooth             651264  49 btrtl,btintel,btbcm,bnep,btusb,rfcomm
ecdh_generic           24576  3 bluetooth
rfkill                 28672  4 bluetooth,cfg80211
crc16                  16384  2 bluetooth,ext4

btmon

You can run btmon in a separate terminal while you're scanning for your device and see if there are logs that contain e.g. the name of your device.

# btmon
Bluetooth monitor ver 5.50
= Note: Linux version 5.0.7-arch1-1-ARCH (x86_64)                                                                                                                 0.794111
= Note: Bluetooth subsystem version 2.22                                                                                                                          0.794112
= New Index: 5C:F3:70:81:F0:5A (Primary,USB,hci1)                                                                                                          [hci1] 0.794113
= Open Index: 5C:F3:70:81:F0:5A                                                                                                                            [hci1] 0.794114
= Index Info: 5C:F3:70:81:F0:5A (Broadcom Corporation)                                                                                                     [hci1] 0.794114
= New Index: 9C:B6:D0:02:2D:64 (Primary,USB,hci0)                                                                                                          [hci0] 0.794114
= Open Index: 9C:B6:D0:02:2D:64                                                                                                                            [hci0] 0.794114
= Index Info: 9C:B6:D0:02:2D:64 (Qualcomm)                                                                                                                 [hci0] 0.794115
@ MGMT Open: bluetoothd (privileged) version 1.14                                                                                                        {0x0001} 0.794115
@ MGMT Open: btmon (privileged) version 1.14                                                                                                             {0x0002} 0.794125
> HCI Event: Connect Request (0x04) plen 10                                                                                                            #1 [hci1] 27.312940
        Address: 00:16:94:29:CB:82 (Sennheiser Communications A/S)
        Class: 0x240404
          Major class: Audio/Video (headset, speaker, stereo, video, vcr)
          Minor class: Wearable Headset Device
          Rendering (Printing, Speaker)
          Audio (Speaker, Microphone, Headset)
        Link type: ACL (0x01)

lsusb

Because my bluetooth device is a simple USB adapter, I used lsusb -v to find more information about the type of device that I use.

# lsusb -v
Bus 001 Device 007: ID 0a5c:21e8 Broadcom Corp. BCM20702A0 Bluetooth 4.0
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         1 
  bDeviceProtocol         1 
  bMaxPacketSize0        64
  idVendor           0x0a5c Broadcom Corp.
  idProduct          0x21e8 BCM20702A0 Bluetooth 4.0
  bcdDevice            1.12
  iManufacturer           1 Broadcom Corp
  iProduct                2 BCM20702A0
  iSerial                 3 5CF37081F05A
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x00da
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1 
      bInterfaceProtocol      1 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0010  1x 16 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:

pacman

You can use pacman to see what bluetooth packages are currently installed. Use the pacman -Qs with a search term like blue.

$ pacman -Qs blue
local/blueman 2.0.8-2
    GTK+ Bluetooth Manager
local/bluez 5.50-6
    Daemons for the bluetooth protocol stack
local/bluez-libs 5.50-6
    Deprecated libraries for the bluetooth protocol stack
local/bluez-utils 5.50-6
    Development and debugging utilities for the bluetooth protocol stack
local/pulseaudio-bluetooth 12.2-2
    Bluetooth support for PulseAudio
local/qt5-connectivity 5.12.2-1 (qt qt5)
    Provides access to Bluetooth hardware
local/sbc 1.4-1
    Bluetooth Subband Codec (SBC) library

Also checking what pulse audio packages are installed can give your more info while you're running into issues.

$ pacman -Qs pulse
local/libcanberra-pulse 0.30+2+gc0620e4-2
    PulseAudio plugin for libcanberra
local/libpulse 12.2-2
    A featureful, general-purpose sound server (client library)
local/pavucontrol 1:4.0-1
    PulseAudio Volume Control
local/pulseaudio 12.2-2
    A featureful, general-purpose sound server
local/pulseaudio-alsa 2-4
    ALSA Configuration for PulseAudio
local/pulseaudio-bluetooth 12.2-2
    Bluetooth support for PulseAudio
local/pulsemixer 1.4.0-3
    CLI and curses mixer for pulseaudio