Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Bluetooth support on Raspberry Pis running Arch Linux ARM with non-mainline kernel.

Enabling bluetooth

[Pi 3B (Non-Plus) / Pi Zero W ONLY]

As of kernel package, linux-raspberrypi-4.14.59-1, support for notifying the kernel of the Broadcom bluetooth device through the device tree has been enabled.

There is no longer a need for btattach, which makes the lives of everyone easier. There is also no need to fall back to hciattach for better performance, as the kernel correctly restores a higher baud rate after writing out required firmware to the bluetooth controller at a lower baud rate.

This requires a device tree node to be added, and that can be accomplished with a simple overlay (bcmbt-overlay.dts):

/*
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following location:
 *
 * http://www.gnu.org/copyleft/gpl.html
 *
 * Device tree overlay for Raspberry Pi devices with bluetooth to
 * inform the kernel that a bluetooth controller can be accessed
 * over serial using the main UART (pl011 UART, not mini-UART)
 * via HCI. Assumes the main UART node is termed uart0.
 * 
 * Modified from mainline device tree source for Pi Zero W,
 * bcm2835-rpi-zero-w.dts, 
 * Copyright (C) 2017 Stefan Wahren <stefan.wahren@i2se.com>
 *
 * Tested on a Raspberry Pi Zero W.
 *
 * Copyright (C) 2018 Shenghao Yang <me@shenghaoyang.info>
 *
 */

/dts-v1/;
/plugin/;

/ {
        compatible = "brcm,bcm2708";
        fragment@0 {
                target-path = "uart0";
                __overlay__ {
                        bluetooth {
                                compatible = "brcm,bcm43438-bt";
                                max-speed = <2000000>; /* You can experiment with this */
                                /* Other elements omitted, pins may be different on different PI models */
                        };
                };
        };
};

(NOTE: This overlay assumes a clean configuration, with the pl011 UART routed to the bluetooth controller. This is untested on a configuration with the mini-UART routed to the bluetooth controller. YMMV)

To compile this overlay, you'll require the dtc package. After which, you can execute, in the directory where you've placed the file, dtc -I dts -O dtb bcmbt-overlay.dts -o bcmbt.dtbo

Afterwards, copy the generated bcmbt.dtbo file to /boot/overlays/, and enable the overlay in config.txt, by adding this line at the end of the file:

...
dtoverlay=bcmbt

If all goes well, reboot and you should see the following kernel messages:

[   12.440976] Bluetooth: hci0: BCM: chip id 94
[   12.441473] Bluetooth: hci0: BCM: features 0x2e
[   12.443187] Bluetooth: hci0: BCM43430A1
[   12.443216] Bluetooth: hci0: BCM43430A1 (001.002.009) build 0000
[   13.143103] Bluetooth: hci0: BCM (001.002.009) build 0360

Afterwards, you can proceed with installing all the userspace software required for Bluetooth to operate! (a-la bluez, bluez-utils, ...)

Footnotes:

I'm not sure why upstream raspberrypi/linux is not using this strategy... perhaps users will freak out over the loss of ttyAMA0?

Testing:

I've tested streaming music from a phone to the Pi and relaying that over to another computer through the UAC2 gadget functionality, which has also been recently enabled. It ran for around 20 minutes before I stopped it, which seems decently stable for me. All of this was done on a Pi Zero W using the dts as above. This should work on a Pi 3, but I've not tested that, yet. The Pi 3 has to be running the non-mainline kernel, of course...., because the mainline dts already has this node built-in :)

@meskarune

This comment has been minimized.

Copy link

@meskarune meskarune commented Jun 24, 2020

I just used this on a raspberry pi 4 b on arch linux arm and it worked perfectly!

@emmanuelux

This comment has been minimized.

Copy link

@emmanuelux emmanuelux commented Jun 28, 2020

On raspberry pi 4 the audio sound seems to be limited to 115200 bauds and is choppy at this speed.
with hciattach I have 30000 bauds.
on blueman 11,20 KB/s is the rate of youtube stream and the sound is choppy, even if "max-speed = <2000000>;" is setted.
with hciattach it is 30 KB/s or more but unstable, the stream is stopping after somme minutes on youtube with many errors like : "hci0: Frame reassembly failed (-84)" on dmesg.

@shenghaoyang

This comment has been minimized.

Copy link
Owner Author

@shenghaoyang shenghaoyang commented Jun 28, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.