解决Ubuntu蓝牙搜索不到附近设备的问题

针对 Ubuntu 蓝牙搜索不到附近设备的问题,本文通过分析发现是因为缺失 BCM.hcd 文件导致的,然后给出了相应的解决方案。

解决Ubuntu蓝牙搜索不到附近设备的问题

出现的问题

打开蓝牙搜索设备无果

原因分析

终端下输入命令

1
dmesg | grep -i blue

BCM-not-found

BCM: Patch brcm/BCM.hcd not found 提示缺少 BCM.hcd文件

解决步骤

实测该解决方法适用于 Ubuntu 16.04 和 18.04,其它版本未测试。

  • 安装相关软件包

    1
    sudo apt-get install bluez*
  • 输入 lsusb 查看蓝牙设备信息

    lsusb-bluetooth-device-info

  • 搜索并下载相应 cab 包

    https://github.com/winterheart/broadcom-bt-firmware

    download-cab-1

    download-cab-2

    download-cab-3

    也可以用命令进行下载

    1
    wget http://download.windowsupdate.com/d/msdownload/update/driver/drvs/2015/10/200006644_5f769d5f45e68840195d3bb24ef9d1ae2c791272.cab
  • 安装 cab 解压工具

    1
    sudo apt install cabextract
  • 解压下载好的 cab 包

    cabextract

    解压后文件有很多,需要根据具体情况选择,我的固件是 BCM43142A0,这里我选了 BCM43142A0_001.001.011.0311.0327.hex

    select-hex-file

    这里我用了 0311.0327.hex 这个文件,是因为这个文件名和我的电脑在 windows 下用到的一致,实际上直接拿 windwos 下的也可以。

    可以在自己电脑 windows 里面的 C:Windows/System32/drivers 文件夹下搜索 .hex 文件,然后放到 Ubuntu 下面编译成 .hcd 文件。

  • 选择正确的 hex 文件

    上面通过 Windows 查看以确定需要的 hex 文件的方法比较麻烦,这里介绍另一种选择 hex 文件的方法。

    https://askubuntu.com/questions/632336/bluetooth-broadcom-43142-isnt-working/632348#632348

    在解压 cab 包之后,会有一堆的 hex 文件和其它的一些文件,其中有一个文件 bcbtums.inf 是我们要用到的。在 bcbtums.inf 文件中搜索 RAMUSB21D7.CopyList,你将会看到你所需要的 hex 文件,如图:

    another-way-to-select-hex-file

    INF 是 Device INFormation File 的英文缩写,是 Microsoft 公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF 文件中包含硬件设备的信息或脚本以控制硬件操作。在 INF 文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。 安装监视器、调制解调器和打印机等设备所需的驱动程序,都是通过 INF 文件,正是 INF 的功劳才使得 Windows 可以找到这些硬件设备的驱动并正确安装。

  • 下载hex2hcd

    有了对应固件的 hex 文件后,需要将该 hex 文件转成 hcd 文件

    1
    git clone https://github.com/jessesung/hex2hcd.git

    编译生成可执行文件

    1
    2
    cd hex2hcd
    make
  • 将 hex 文件转成 xxx.hcd

    hex2hcd

    放到 firmware 文件夹下

    1
    sudo mv BCM43142A0_001.001.011.0311.0327.hcd /lib/firmware/brcm/BCM.hcd

    这里因为缺少BCM.hcd,所以命名为BCM.hcd

  • 重新加载模块

    1
    2
    sudo modprobe -r btusb
    sudo modprobe btusb

    然后就可以在蓝牙的设置里搜索到其他设备了。

bluetooth-solved-1

bluetooth-solved-2

bluetooth-solved-3

References

https://github.com/winterheart/broadcom-bt-firmware

https://reasonw.github.io/blog/2017/02/13/Ubuntu-Bluetooth/

https://askubuntu.com/questions/632336/bluetooth-broadcom-43142-isnt-working/632348#632348