Last year, in https://mclarenlabs.com/blog/2019/01/15/korg-microkey-air-37-bluetooth-midi-keyboard-with-raspberry-pi/, I described how to compile a Bluetooth update for your Pi and how to connect a Korg Bluetooth keyboard to your Pi wirelessly. Raspbian “Buster” includes bluez-5.50. The code for version 5.50 includes support for Bluetooth MIDI, but it is not enabled in the “Buster” distribution. This article describes what I discovered in compiling bluez-5.50 for “Buster” and how I installed it to get Bluetooth MIDI working on my Raspberry Pi4.
A Pristine Buster System
Before we start, let’s look at what is installed where in a standard Buster system.
In /etc/init.d/bluetooth
, we see
DAEMON=/usr/sbin/bluetooth
and we see that /usr/sbin/bluetoothd
is a symbolic link to /usr/lib/bluetooth/bluetoothd
.
We see that /etc/systemd/system/bluetooth.target.wants/bluetooth.service
is a hard link to (same file as) /etc/systemd/system/debus-org.bluez.service
. In this file we see
[Service]
...
ExecStart=/usr/lib/bluetooth/bluetoothd
So anything starting bluetoothd is starting /usr/lib/bluetooth/bluetoothd
.
Compile Bluez from Source
Using the instructions from our blog article a year ago, get compile and install bluez but this time get bluez-5.50. Here’s a quick summary.
$ curl -OL# http://www.kernel.org/pub/linux/bluetooth/bluez-5.50.tar.xz
$ tar -xvf bluez-5.50.tar.xz
$ cd bluez-5.50
$ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --enable-experimental --enable-midi
$ make -j4
$ sudo make install
When you are all done, you will see another copy of bluetooth. This one is in /usr/libexec/bluetooth/bluetoothd
. If we look in /etc/systemd/system/bluetooth.target.wants/bluetooth.service
, we’ll see that the reference to the binary is updated to the new one. But it we look in /etc/init.d/bluetoothd
, we’ll see that it is pointing to /usr/sbin/bluetoothd
, which is a link to /usr/lib/bluetooth/bluetoothd
, which is the old one.
We now have two copies of bluetoothd on our system and we need to sort it all out. Here is what I did.
$ pushd /usr/sbin $ sudo mv bluetoothd bluetoothd.orig $ sudo ln -s /usr/libexec/bluetooth/bluetoothd bluetoothd
Reboot and Pair
Now, if you reboot your system, you will get the new version of bluetoothd, with BLE MIDI enabled. Follow the instructions from before to disable SSP mode.
$ sudo hciconfig hci0 sspmode 0
and you should be able to pair your Korg Microkey Air 37 Bluetooth MIDI Keyboard with your Raspberry Pi4!
You can re-enable sspmode at this point if you want. The keyboard is already paired with the computer.
Hi!
I tried the installation and successfully built bluez I think. However, when I tried to pairing Korg Microkey Air, I see the Pairing Failed error even if I set the sspmode 0. Do you have any idea to solve the issue? What I’m using for Raspberry Pi OS is 2021-01-11-raspios-buster-armhf.img
Thanks!
Masanao
Unfortunately I’m not having much luck with building bluez 5.50 with midi. Configure works OK but when I try to make, i get the below output (running https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip):
CC monitor/analyze.o
CC monitor/intel.o
CC monitor/broadcom.o
CC tools/rctest.o
tools/rctest.c: In function ‘recv_mode’:
tools/rctest.c:507:19: error: ‘SIOCGSTAMP’ undeclared (first use in this function); did you mean ‘SIOCGRARP’?
if (ioctl(sk, SIOCGSTAMP, &tv) < 0) {
^~~~~~~~~~
SIOCGRARP
tools/rctest.c:507:19: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [Makefile:5842: tools/rctest.o] Error 1
make[1]: *** Waiting for unfinished jobs….
make: *** [Makefile:3278: all] Error 2
pi@raspberrypi(rw):~/bluez-5.50$
Any ideas?
Add `#include ` to every file that is complaining about this error. From the errors you posted above, that file would be `rctest.c`. Do this for the next file(s) that has the same error. In my case for bluez version 5.48, I did this for `rctest.c` and `l2test.c`.
Add “#include ” to every file that is complaining about this error. From the errors you posted above, that file would be rctest.c. Do this for the next file(s) that has the same error. In my case for bluez version 5.48, I did this for rctest.c and l2test.c.
#include
include
I was able to fix the SIOCGSTAMP errors by patching rctest.c and l2test.c. After applying the patch it compiled without error.
https://www.spinics.net/lists/linux-bluetooth/msg80282.html
Guys I save ypu from being sarchastic, but maybe just on script without all prosa would others incredibly help. Furthermore it looks very cumbersome hacking c files with empty includes. It seems a total chaos to me, sry best regards
The SIOCGSTAMP error is due to the fact that you are compiling an older version of bluez with current Linux headers. Get the latest bluez version source and it’ll compile fine.