Ubuntu – How to use a bluetooth headset mic in Ubuntu


I have a bluetooth headset (Sennheiser MM 550-X) connected to my computer through a USB bluetooth dongle (Asus USB-BT400). I'm running Ubuntu 14.10. I would like to configure the headset both as output (headphone) and input source (the mic).

First of all, the headset pairs with the computer:
enter image description here

In the Ubuntu sound settings, if i configure the headset in mode "A2DP", i can send the sound from the computer to the headset. But configuring the input source as my headset switches the mode of the output to HSP/HFP and nothing works anymore (neither sound output or mic)

From my research on the internet i understand that only the HSP/HFP mode can get the mic working. Moreover the dongle uses a Broadcom BCM20702A0 chipset and i found some bug reports about it but i'm not sure whether there is still problems or not with this chipset.

How to get the mic working ?

thanks !

Edit: add output of lsusb:

Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0d3d:0040 Tangtop Technology Co., Ltd 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0b05:17cb ASUSTek Computer, Inc. 
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Edit2: update to Jeremy31 answer. My headset is 00:16:94:0F:23:C6


[35677.706802] usbcore: deregistering interface driver btusb
[35677.709252] Bluetooth: hci0 urb ffff8800d5ec6840 failed to resubmit (2)
[35690.999061] usbcore: registered new interface driver btusb

Best Answer

The problem is with the btusb driver and asus dongle USB-BT400. This dongle needs a firmware. To get the firmware, download the latest windows driver here (section Bluetooth): http://support.asus.com/download.aspx?SLanguage=en&p=1&s=45&m=MAXIMUS+VI+FORMULA&os=30&hashedid=Dbn0i1Jz1yusKO7u

Extract the .zip file. There is many firmwares so we have to find the right one. Edit the file bcbtums-win7x86-brcm.inf (for example), locate the section for your dongle by searching your usb product ID in the file (case insensitive). The section references a .hex file, in my case "BCM20702A1_001.002.014.1315.1347.hex".

Download hex2hcd here: https://github.com/jessesung/hex2hcd Compile it and make a .hcd file from the previously identified .hex file. Now we have the firmware.

It looks like the btusb driver does not try to load the firmware for this dongle, which is probably a bug (?). Install linux-source-3.16.0 to get the sources. In btusb.c make this little modification:

@@ -106,7 +106,7 @@ static const struct usb_device_id btusb_table[] = {
        { USB_DEVICE(0x0489, 0xe042) },
        { USB_DEVICE(0x04ca, 0x2003) },
        { USB_DEVICE(0x0b05, 0x17b5) },
-       { USB_DEVICE(0x0b05, 0x17cb) },
+       { USB_DEVICE(0x0b05, 0x17cb), .driver_info = BTUSB_BCM_PATCHRAM },
        { USB_DEVICE(0x413c, 0x8197) },

        /* Foxconn - Hon Hai */

Compile the modules (I had to compile the kernel before to circumvent a "Exec format error" when loading the new module). Backup the original module and overwrite it with the new btusb.ko (in my case it was in /lib/modules/3.16.0-33-generic/kernel/drivers/bluetooth/btusb.ko)

Put the .hcd file to: /lib/firmware/brcm/BCM20702A0-0b05-17cb.hcd (adapt name if needed).

Now we can reload the btusb driver:

modprobe -r btusb; modprobe btusb

dmesg should show a line like:

[ 52.121571] Bluetooth: hci0: BCM: firmware hci_ver=06 hci_rev=1543 lmp_ver=06 lmp_subver=220e

Now the HSP/HFP profile is working ! Meaning the headset can be used in input and output.