Experiences with the Dell M3800 with Fedora 21 and Broadcom’s Bluetooth brcm/BCM20702A0-0a5c-216f.hcd binary blob

tl;dr

You need a blob for the driver BCM20702A0-0a5c-216f.hcd

Update 2015-09-28: some success is reported

Whereas

Bluetooth is not working on the Dell M3800 under Fedora 21.

Question

But does it work with the Ubuntu shipped from the factory by Dell?   TBD.

Previously

Experiences with the Dell M3800, The Good, The Bad (no Ugly, it’s a beautiful machine)

Evidences

  • Fedora 21
  • Kernel 4.0.7
    Linux devbox.example.com 4.0.7-200.fc21.x86_64 #1 SMP Mon Jun 29 22:11:52 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
  • linux-firmware-20150521-48.git3161bfa4.fc21.noarch

Recipe

Recipe #1

Via: Dell XPS 13 (2015); staff; In Arch Linux Forums; 2015-07-25

<quote>

Note: Intel WiFi users: If your WiFi card supports Bluetooth, then the BT interface should be available out-of-the-box, as the required firmware is included in linux-firmware.

The Broadcom Bluetooth firmware is not available in the kernel (source), so you will have to retrieve it from the Windows driver. You need to extract the .cab file with cabextract and then convert it to a .hcd file with hex2hcd from bluez-utils:

$ cabextract 20662520_6c535fbfa9dca0d07ab069e8918896086e2af0a7.cab
$ hex2hcd BCM20702A1_001.002.014.1443.1572.hex
# mv BCM20702A1_001.002.014.1443.1572.hcd /lib/firmware/brcm/BCM20702A1-0a5c-216f.hcd
# ln -rs /lib/firmware/brcm/BCM20702A1-0a5c-216f.hcd /lib/firmware/brcm/BCM20702A0-0a5c-216f.hcd

After reboot, the firmware should be available for your Bluetooth interface.

</quote>

Recipe #2

Via: Bluetooth not connecting to devices even though it recognizes them; Aaron Weinberg, some dude using the self-asserted identity token Jeremy31, Ian Mackinnon; In Ask  Ubuntu; 2015-05-01 → 2015-07-01.

Recipe #2(a)

<quote>

wget https://www.dropbox.com/s/r2pb41rhx65t9zi/BCM20702A0-0a5c-216f.hcd sudo cp BCM20702A0-0a5c-216f.hcd /lib/firmware/brcm/ sudo modprobe -r btusb sudo modprobe btusb

</quote>

And as recovered by me from the dropbox site.  Proven to work on my Dell M3800 <paranoid>but who knows what I recovered?</paranoid>

$ for i in md5sum sha1sum sha256sum ; do $i BCM20702A0-0a5c-216f.hcd; done
356ecc4d52b344109b55b3c96d6ec4d0  BCM20702A0-0a5c-216f.hcd
6ab9dde1e010bacfd57d371f832477d819fd671a  BCM20702A0-0a5c-216f.hcd
42677905be180547d4c6f3e670884f6b5bcaf003c1a7c156e2dfc6fdc0397364  BCM20702A0-0a5c-216f.hcd
Recipe #2(b)

<quote>
Get 20662520_6c535fbfa9dca0d07ab069e8918896086e2af0a7.cab from Microsoft at Broadcom Corporation Bluetooth Controller.
Acquire cabextract via yum (dnf).
Run cabextract 20662520_6c535fbfa9dca0d07ab069e8918896086e2af0a7.cab to recover BCM20702A1_001.002.014.1443.1572.hex.

git clone https://github.com/jessesung/hex2hcd.git
make -C hex2hcd
./hex2hcd/hex2hcd BCM20702A1_001.002.014.1443.1572.hex BCM20702A0-0a5c-216f.hcd
sudo cp BCM20702A0-0a5c-216f.hcd /lib/firmware/brcm/
sudo modprobe -r btusb
sudo modprobe btusb

Folklore

In archaeological order, newer on top, older below.
And recall that the Dell M3800 is “alot like” the Dell XPS 13.

  • Dell XPS 13 (2015); staff; In Arch Linux Forums; 2015-07-25
    tl;dr → see recipe above.  You must to extract the blog out of the Windows driver package yourself, convert the encoding and place the file appropriiately.  Yourself.  No packaging is available at this time.  Construction recipe for:

    • /usr/lib/firmware/brcm/BCM20702A0-0a5c-216f.hcd
    • /usr/lib/firmware/brcm/BCM20702A1-0a5c-216f.hcd
  • Bluetooth not connecting to devices even though it recognizes them; Aaron Weinberg, some dude using the self-asserted identity token Jeremy31, Ian Mackinnon; In Ask  Ubuntu; 2015-05-01 → 2015-07-01.
    tl;dr → good compendium of the recipes; those being recited above.

    • Concept
      <quote>hex2hcd utility by Jesse Sung that converts Broadcom hex files to hcd for use in newer kernels but you have to use Windows drivers and search the inf files to find the correct hex file to convert.</quote>
    • Resources
      • BCM20702A0-0a5c-216f.hcd; at DropBox; prepared by whom? (perhaps en Jeremy31?); no checksum or signature is published nearby.
      • jessesung/hex2hcd at GitHub
      • Broadcom Corporation Bluetooth Controller, software update, At Microsoft; released 2014-06.
        20662520_6c535fbfa9dca0d07ab069e8918896086e2af0a7.cab → some Windows blob you have to use cabstract upon; no checksum or signature is available to you (maybe Microsoft has access to such in their API, who knows).
    • References
      • XPS 13 (9343) Ubuntu Linux; Some Dude; In Sybian Linux; 2015-03-15.
        tl;dr → <quote>whole lot of complaints about the compatibility of this laptop with Linux.</quote> but enumerates the remediations.

        • BIOS update from A0 to A1
        • Ubuntu LTS 14.04.2 with UEFI enabled
        • Broadcom 4352 WiFi (use USB dongle networking to bootstrap it)
        • Broadcom 216F Bluetooth (acquiring BCM20702A0-0a5c-216f.hcd
        • Touchpad requires kernel parameters
        • (Analog) Audio requires kernel parameters
      • How can I get the Bluetooth working on my Lenovo  Yoga 3; Some dude using the self-asserted identity token drs; In Stack Exchange; 2015-03-12.
        tl;dr → complete procedure for Broadcom BCM20702A0 including fishing around in the Broadcom Windows Driver Installer to discover BCM20702A1_001.002.014.1443.1496.hex
  • Dell XPS 13 (9343) Developer Edition – Bluetooth Firmware; Some Dude, using the self-asserted identity token Beowulf; In His Blog; 2015-06-23.
    this advice is unrelated ot the Plugable advice (last item)
    tl;dr → asserts a recipe for manually acquiring & installing the module

    • The module is bfusb
    • That the appropriate firmware is available in bt-dw1560-firmware_1.0_all.deb
    • Gives a recipe for copying it into place, manually.
  • Dell XPS 13 (9343) – No Bluetooth; Some dude using the self-asserted identity token red-lichtie; In Arch Linux Forums; 2015-06-20.
    tl;dr → cites the difference in hardware version number in the firmware blob that must be loaded
    brcm/BCM20702A1-0a5c-216f.hcd is what? (possible?)
    brcm/BCM20702A0-0a5c-216f.hcd is expected but not found.
  • THIS IS A DIFFERENT DEVICE ENTIRELY Plugable USB Bluetooth Adapter: Solving HFP/HSP and A2DP Profiles Issues on Linux; (Plugable); In their Blog; 2014-06-23.
    tl;dr → recommends downloading & installing some unspecified binary blob sourced out of Amazon S3; not even a checksum was uttered to know what was to be expected.
    wget https://s3.amazonaws.com/plugable/bin/fw-0a5c_21e8.hcd
    sudo mv fw-0a5c_21e8.hcd /lib/firmware/brcm/BCM20702A0-0a5c-21e8.hcd

Actualities

Jul 24 19:52:10 devbox.example.com kernel: bluetooth hci0: firmware: brcm/BCM20702A0-0a5c-216f.hcd will not be loaded
Jul 24 19:52:10 devbox.example.com kernel: Bluetooth: hci0: BCM: patch brcm/BCM20702A0-0a5c-216f.hcd not found
$ find /usr/lib/firmware/brcm -print | while read file ; do echo "$file $(rpm -q -f $file)" ; done
$ find /usr/lib/firmware/brcm -print | while read file ; do rpm=$(rpm -q -f $file); echo "$rpm $file" ; done
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43570-pcie.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43362-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/bcm4329-fullmac-4.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4354-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43143.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43340-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43236b.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43602-pcie.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4334-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/bcm43xx-0.fw
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43241b5-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/bcm43xx_hdr-0.fw
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4330-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43569.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43143-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43455-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4335-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43602-pcie.ap.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4356-pcie.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4329-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43241b4-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43241b0-sdio.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac43242a.bin
linux-firmware-20150521-48.git3161bfa4.fc21.noarch /usr/lib/firmware/brcm/brcmfmac4339-sdio.bin
$ lsusb
Bus 004 Device 002: ID 8087:8000 Intel Corp.
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 8087:8008 Intel Corp.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0bda:8153 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0a5c:216f Broadcom Corp.
Bus 001 Device 002: ID 04f3:21f9 Elan Microelectronics Corp.
Bus 001 Device 004: ID 0bda:573c Realtek Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Couldn't open device, some information will be missing
Couldn't open device, some information will be missing
$ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
    |__ Port 6: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 9: Dev 3, If 0, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 9: Dev 3, If 1, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 9: Dev 3, If 2, Class=Vendor Specific Class, Driver=, 12M
    |__ Port 9: Dev 3, If 3, Class=Application Specific Interface, Driver=, 12M
    |__ Port 11: Dev 4, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 11: Dev 4, If 1, Class=Video, Driver=uvcvideo, 480M
$ lsusb --verbose
<snip/>
Bus 001 Device 003: ID 0a5c:216f Broadcom Corp.
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          0x216f
  bcdDevice            1.12
  iManufacturer           1
  iProduct                2
  iSerial                 3
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          218
    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:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0000  1x 0 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0000  1x 0 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0009  1x 9 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0009  1x 9 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       2
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0011  1x 17 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0011  1x 17 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       3
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0019  1x 25 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0019  1x 25 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       4
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Couldn't open device, some information will be missing
Usage Type               Data
        wMaxPacketSize     0x0021  1x 33 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0021  1x 33 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       5
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      1
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0031  1x 49 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            1
          Transfer Type            Isochronous
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0031  1x 49 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0020  1x 32 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       254 Application Specific Interface
      bInterfaceSubClass      1 Device Firmware Update
      bInterfaceProtocol      1
      iInterface              0
      Device Firmware Upgrade Interface Descriptor:
        bLength                             9
        bDescriptorType                    33
        bmAttributes                        5
          Will Not Detach
          Manifestation Tolerant
          Upload Unsupported
          Download Supported
        wDetachTimeout                   5000 milliseconds
        wTransferSize                      64 bytes
        bcdDFUVersion                   1.10
<snip/>

Comments are closed.