蓝牙Broadcom 43142无法正常工作。

蓝牙已开启,但无法找到或被其他设备找到。

sudo service bluetooth status 的输出:

● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
   Active: active (running) since ხუთ 2015-06-04 22:33:18 GET; 13min ago
 Main PID: 26678 (bluetoothd)
   CGroup: /system.slice/bluetooth.service
           └─26678 /usr/sbin/bluetoothd -n

ივნ 04 22:39:14 Rangoo bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/HFPAG
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/HFPHS
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/A2DPSource
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/A2DPSink
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/HFPAG
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/HFPHS
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/A2DPSource
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: bluetoothd[26678]: Endpoint registered: sender=:1.63 path=/MediaEndpoint/BlueZ4/A2DPSink
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: Adapter /org/bluez/26678/hci0 has been enabled
ივნ 04 22:39:14 Rangoo bluetoothd[26678]: bluetoothd[26678]: Adapter /org/bluez/26678/hci0 has been enabled

lsusb的输出结果:

Bus 003 Device 005: ID 0a5c:21d7 Broadcom Corp. BCM43142 Bluetooth 4.0

怎么修好它?

类似问题的答案适用于4352卡 https://askubuntu.com/questions/617513/bluetooth-not-connecting-to-devices-even-though-it-recognizes-them - Wilf
4个回答

你需要安装固件。
根据Broadcom的许可证,不允许分发Broadcom固件。所以你需要自己获取。这可能有点复杂,但没有其他合法的方法。
  1. 下载Broadcom Windows 8驱动程序从这里

    如果您的设备在这些驱动程序中没有列出,您需要在其他地方找到更新版本。Broadcom已经从他们的网站上删除了最新的驱动程序,以增加难度。

    一些笔记本电脑供应商在其网站上提供蓝牙驱动程序,但其中一些无法解压缩。所以这是一个任务。我可以从他们的网站上下载最新的Broadcom驱动程序,但现在已经没有了。

  2. 使用存档管理器打开此文件,并找到其中的bcbtums-win8x86-brcm.inf文件。某些驱动程序中的文件名可能不同。它可以位于Win32或Win64目录下的bcbtums.inf。无论是32位还是64位都可以下载。

  3. 在该文件中搜索VID_0A5C&PID_21D7。这些数字来自于您的lsusb输出。

    0a5c:21d7 Broadcom Corp. BCM43142 Bluetooth 4.0。

    注:有些设备在lsusb中无法识别为Broadcom BT。如果您不确定哪个是您的BT设备,请运行usb-devices命令,它将提供更详细的信息。在那里您可以找到产品和供应商ID。

    您将看到一些以RAMUSB21D7结尾的行

    在该文件中搜索RAMUSB21D7。您将在其中找到一个类似于以下内容的部分:

    [RAMUSB21D7.CopyList]
    bcbtums.sys
    btwampfl.sys
    BCM43142A0_001.001.011.0122.0126.hex
    

    这就是我们要找的。固件文件的名称。 BCM43142A0_001.001.011.0122.0126.hex

  4. 现在从同一个cab文件中提取该固件。

    然后,您需要将此文件从十六进制转换为hcd格式。

  5. 下载用于此操作的工具

    git clone git://github.com/jessesung/hex2hcd.git
    cd hex2hcd
    make
    

    您将在主目录中获得hex2hcd文件夹。

  6. 将固件文件放置在您的主目录中,并运行

    ~/hex2hcd/hex2hcd ~/BCM43142A0_001.001.011.0122.0126.hex ~/BCM43142A0-0a5c-21d7.hcd
    

    您可以看到0a5c-21d7是来自于lsusb的适配器的ID。

    重要:对于内核4.2+,您需要将此文件命名为BCM.hcd

    ~/hex2hcd/hex2hcd ~/BCM43142A0_001.001.011.0122.0126.hex ~/BCM.hcd
    

    对于内核4.8+,文件名应为BCM-<VID>-<PID>.hcd,例如BCM-0a5c-21d7

    对于内核5.0,文件名再次为BCM43142

    这一切看起来很复杂,但是这都是因为Broadcom的律师所导致的。大多数其他供应商允许在附带许可证的情况下重新分发固件。
    这使得Linux维护者可以将固件包含在发行版中。
    但对于Broadcom来说不是这样。这就是为什么没有采取简单的方式。
    许多人可以将所有的十六进制文件转换为hcd并使其可用。或者只需将它们添加到Ubuntu的linux-firmware软件包中。
    但这是非法的:-((

7大多数情况下,当我唤醒我的笔记本电脑时,蓝牙模块的重新加载会失败,并出现内核堆栈跟踪。如果你需要在不重启电脑的情况下使用蓝牙,你需要卸载蓝牙模块(sudo modprobe -r btusb),然后重新加载它(sudo modprobe btusb),以使蓝牙再次正常工作。https://bugzilla.kernel.org/show_bug.cgi?id=81821 - solsTiCe
1在第6步中,必须给hex2hcd提供一个输出文件,例如:hex2hcd [输入文件] -o [输出文件] 你能更新一下答案吗? - Minas Mina
答案中有输出文件。或者作者改变了它。以前是 hex2hcd input-file output-file - Pilot6
感谢Pilot6提供这个答案!还有一件值得一提的事情是,蓝牙管理工具(blueman utility)会破坏这个解决方案(这个问题也发生在我身上)。请参考http://askubuntu.com/questions/767046/bluetooth-broadcom-bcm20702-does-not-load-firmware-driver-issue-14-04。 - Mike
顺便说一下,在 Gnome WiFi 设置中暂停(和/或切换“飞行模式”)有时可以作为重新加载模块/重启的替代方法。 - Wilf
一些较新内核的定位方式有所不同。在我的情况下(使用4.4和4.7rc4内核测试过),它是/lib/firmware/brcm/BCM-0a5c-6410.hcd - morhook
@morhook 他们确实改变了它。但是看起来 BCM*.hcd 应该可以。我需要研究一下代码。 - Pilot6
4感谢 @Pilot6 更新主贴。在我的情况下,我查看了 dmesg 中的错误以找到正确的文件。例如 dmesg 输出:[ 3.479417] 蓝牙 hci0:加载 brcm/BCM-0a5c-6410.hcd 固件失败,错误码为 -2 [ 3.479421] 蓝牙:hci0:BCM:未找到补丁 brcm/BCM-0a5c-6410.hcd - morhook
谢谢评论。我检查了源代码,发现他们确实又改变了文件名。 - Pilot6
1谢谢你!有没有办法联系Broadcom的律师,向他们解释我们的情况?在所有基于Broadcom的USB蓝牙设备上进行这个过程似乎很冗长。 - morhook
1@morhook 你相信没有人试图联系过他们吗?)))) 这种情况已经持续了很多年。 - Pilot6
@Pilot6 我找到了这个请愿书 https://www.change.org/p/broadcom-drivers-for-bcm21654g-2ecf76f9-e114-4419-abce-95b581092910 或许我们可以签署它?看起来是一个类似的芯片组,但适用于安卓系统?也许我们可以发起一份新的请愿书? - morhook
我刚刚在我的Xubuntu 16.04安装中使用了这个。我已经安装了4.4.0-31-generic,它实际上正在寻找BCM.hcd文件。我通过查看dmesg输出找到了文件名,其中显示了它正在尝试加载的文件。 - Martin - マーチン
我也有点困惑。我没有这个硬件。你可以尝试两个名字来确保。 - Pilot6
我现在遇到了“hci0 command 0x1001 tx timeout”错误,有什么线索吗? - HackToHell
好的,我试了一下发送“rfkill unblock bluetooth”命令,成功解除了蓝牙的屏蔽。 - HackToHell
@Pilot6 在这次操作之后,我的蓝牙设备在Ubuntu 16.04上不再可见,内核版本为4.4.0-45-generic。lspcilsusb也不再显示它了。有什么想法吗? - NeverEndingQueue
@NeverEndingQueue,在第6步中缺少了一个“-o”。我编辑了答案来修复命令。 - crypdick
@RovingRichard 这是错误的。那个git仓库中hex2hcd的语法应该是 hex2hcd <输入的十六进制文件> <输出文件>。编辑们请不要添加这个。也许你正在使用其他版本的hex2hcd - Pilot6
hex2hcd -h 的输出中可以看到: -o, --output <file> 提供固件输出文件。我的版本是 5.37,这是我按照您的答案中的说明获得的版本。 - crypdick
@Pilot6 我的版本的 manpage 上说使用方法是 hex2hcd [选项] <文件> - crypdick
你的版本就是你的版本。它与我的回答无关。 - Pilot6
Ubuntu 16.04.1 LTS - 谢谢您的回答。现在我的笔记本可以连接附近的蓝牙设备了。这通过一个靠近时钟的图标显示出来。然而,在系统设置中,当我点击蓝牙图标时,它没有显示任何内容,并且仍然要求一个蓝牙适配器。但这可能是另外一个故事了... - Captain_Frog
5DUALBOOT 用户请注意:您可以从 Windows 操作系统中提取正确的固件。为了做到这一点,打开 Windows 设备管理器,找到您的蓝牙设备,右键点击,选择属性,驱动程序,驱动程序详细信息。在那里,您将找到 .hex 文件的路径,您可以将其复制到 Linux 系统中。之后,请按照步骤 5-8 进行操作。顺便说一句,这个答案很棒。 - Manu CJ
在我的情况下(Lenovo G510,Ubuntu 14.4.05):~$ dmesg | grep -i 'bluetooth':: [ 4.796921] usb 3-7: Product: 蓝牙USB主机控制器; 蓝牙:核心版本2.21;HCI设备和连接管理器已初始化; 蓝牙:HCI套接字层已初始化;L2CAP套接字层已初始化; 蓝牙:SCO套接字层已初始化;BNEP套接字层已初始化; 蓝牙:RFCOMM TTY层已初始化;RFCOMM套接字层已初始化;RFCOMM版本1.11; 而在以下内容中没有任何信息: ~$ usb-devices | grep blue. 我应该怎么办? - Helen Craigman
尽管我的内核版本是4.13,但我不得不使用BCM.hcd文件(建议用于4.2+内核版本)。这使我能够连接耳机,但在声音设置的输出设备中没有显示出来。为了解决这个问题,我还需要运行来自https://gist.github.com/pylover/d68be364adac5f946887b85e6ed6e7ae的“神奇”Python脚本。 - Krzysztof Wołowski
@ManuCJ请将此作为答案发布,因为它对我来说完美无缺。谢谢! - Jonathan Porter
@JonathanPorter 很高兴听到这个消息,我想发帖,但是问题已被保护,所以不可能。 - Manu CJ
驱动程序也可在此处获取:https://www.catalog.update.microsoft.com/Search.aspx?q=Broadcom+bluetooth - jdnz
内核版本为4.9.0-8-amd64。我需要使用BCM.hcd而不是BCM-<VID>-<PID>.hcd。 - Maxsash
1*.hcd文件可以在这里找到:https://github.com/winterheart/broadcom-bt-firmware (通过以下提示发现:https://dev-pages.info/ubuntu-bluetooth/) - feeela
现在从同一个cab文件中提取那个固件。 - Bassie
@Bassie 你可以使用档案管理器打开一个cab文件。 - Pilot6
但在这行之前没有提到任何cab文件。 - Bassie
1驱动程序可能是一个cab文件。 - Pilot6

这是一个旨在自动化该过程的项目: https://github.com/winterheart/broadcom-bt-firmware 根据内核将BCM复制到正确的目录/名称(如上所述)。
在4.8上,我不需要重新启动,只需在终端中输入:
sudo modprobe -r btusb
sudo modprobe btusb

dmesg | grep -i blu

应该显示是否已加载。 确保硬件ID与文件匹配。 可以通过以下方式找到:
lsusb

这在我的联想电脑上显示(只有那一行):
Bus 001 Device 006: ID 105b:e065 Foxconn International, Inc. BCM43142A0 Bluetooth module

希望这能帮到你 :)

1在我的情况下(UtechSmart USB Bluetooth 4.0 设备 ID:0a5c:21e8),Winterheart 驱动程序已加载,但 hcitool dev 仍未显示任何设备,并且 syslog 中出现了错误。在 https://plugable.com/2014/06/23/plugable-usb-bluetooth-adapter-solving-hfphsp-profile-issues-on-linux 找到了另一个可用的驱动程序。 - Greg Bray
他们还生成了deb文件。我刚刚安装了以下的deb文件,效果非常好:https://github.com/winterheart/broadcom-bt-firmware/releases/download/v12.0.1.1105_p4/broadcom-bt-firmware-12.0.1.1105.deb - oikonomopo

这就是你需要的全部内容:https://github.com/winterheart/broadcom-bt-firmware 在这个代码库中,你可以找到更多信息和所需的所有Broadcom无线网卡驱动程序
为了更加具体,我给你提供了我写给自己的说明:
这个教程旨在使无线/蓝牙网络适配器Broadcom Corporation BCM43142 802.11b/g/n(版本01)(设备ID:0a5c:216d)在Linux系统上工作(我在基于Ubuntu 16.04.3 LTS的Elementary OS 0.4.1 Loki上尝试过)。
这可能对其他设备不起作用,但对其他Broadcom设备,步骤应该与此过程差别不大。 所需的Broadcom驱动程序以.hcd格式存储在这个GitHub存储库文件夹中。
  1. 输入以下命令以查找内核在启动时加载驱动程序时正在寻找的驱动程序名称:
  2. dmesg | grep -i 'firmware load'
    
    如果找不到任何内容,请尝试这个命令:
    dmesg | grep -i 'bluetooth'
    
    结果应该类似于:
    bluetooth hci0: Direct firmware load for brcm/BCM.hcd failed with error -2
    
    解释:在我的情况下,内核正在寻找目录/lib/firmware/brcm下的文件BCM.hcd,这是Broadcom驱动程序所期望的位置。 如果内核正在寻找另一个驱动程序名称,您必须将驱动程序文件(在我的情况下为BCM43142A0-0a5c-216c.hcd)重命名为内核所需的名称。
  3. 将已重命名的驱动程序(BCM.hcd)移动到您的主目录(/home/YourUsername/),然后运行以下命令,将其移动到内核在启动时正在寻找的目录中:
  4. sudo mv ~/BCM.hcd /lib/firmware/brcm
    
    根据您的设备使用相应的驱动程序,并根据内核的要求进行重命名。
  5. 重新启动计算机,应该可以正常工作!*(您可以再次输入dmesg | grep -i 'bluetooth'来查看是否已加载驱动程序)

太好了!非常感谢!在我的情况下,github文件夹中没有“BCM43142 802.11b/g/n [14e4:4365] (rev 01)”版本,但我尝试了使用BCM43142A0-185f-2167.hcd,它起作用了! - Sriram Kannan
它很有效且简单。我使用了命令'lsusb',它显示了"0a5c:21d7 Broadcom Corp. BCM43142 Bluetooth 4.0"。我只是下载了BCM43142A0-0a5c-21d7.hcd文件,然后它就正常工作了。谢谢你。 - PhatHV
谢谢兄弟,你真是救命稻草。 - imposter

仍然遇到固件错误吗?

$ dmesg | egrep -i 'blue|firm'
[    0.108524] Spectre V2 : Enabling Restricted Speculation for firmware calls
[    0.144995] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
[    4.768278] thinkpad_acpi: ThinkPad firmware release H1EC34WW doesn't match the known patterns
[    4.808333] thinkpad_acpi: rfkill switch tpacpi_bluetooth_sw: radio is unblocked
[    5.267304] Bluetooth: Core ver 2.22
[    5.267329] Bluetooth: HCI device and connection manager initialized
[    5.267333] Bluetooth: HCI socket layer initialized
[    5.267335] Bluetooth: L2CAP socket layer initialized
[    5.267339] Bluetooth: SCO socket layer initialized
[    5.405755] Bluetooth: hci0: BCM: chip id 70
[    5.406559] Bluetooth: hci0: BCM: features 0x06
[    5.422570] Bluetooth: hci0: BCM43142A
[    5.422575] Bluetooth: hci0: BCM43142A0 (001.001.011) build 0000
[    5.424415] Bluetooth: hci0: BCM: firmware Patch file not found, tried:
[    5.424420] Bluetooth: hci0: BCM: 'brcm/BCM43142A0-105b-e065.hcd'
[    5.424421] Bluetooth: hci0: BCM: 'brcm/BCM-105b-e065.hcd'
[    7.441899] Bluetooth: hci0: command 0x1003 tx timeout
[    7.443566] Bluetooth: hci0: unexpected event for opcode 0x1003
[   17.500493] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[   17.500496] Bluetooth: BNEP filters: protocol multicast
[   17.500501] Bluetooth: BNEP socket layer initialized
[   38.846123] Bluetooth: RFCOMM TTY layer initialized
[   38.846129] Bluetooth: RFCOMM socket layer initialized
[   38.846136] Bluetooth: RFCOMM ver 1.11

  • 我刚从这里找到了另一种方法

方法如下:

  • broadcom-bt-firmware下载brcm/BCM43142A0-105b-e065.hcd文件
  • 然后将其粘贴到/lib/firmware/brcm文件夹中
  • 执行以下命令完成此操作

命令:

sudo apt-get update && sudo apt-get install wget

sudo wget https://github.com/winterheart/broadcom-bt-firmware/raw/master/brcm/BCM43142A0-105b-e065.hcd -P /lib/firmware/brcm

重启你的电脑 :)