如何使我的蓝牙设备工作?

如何使我的蓝牙设备工作?

我需要帮助解决蓝牙问题。我无法使用 USB 蓝牙设备。蓝牙 UI 只是显示没有适配器。

我正在运行 ubuntu 19.04 并且一切都是最新的。

根据 lsusb,我有这个设备,

Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

dmesg | grep 蓝牙

[ 6.137963] Bluetooth: Core ver 2.22
[ 6.137977] Bluetooth: HCI device and connection manager initialized
[ 6.137980] Bluetooth: HCI socket layer initialized
[ 6.137982] Bluetooth: L2CAP socket layer initialized
[ 6.137984] Bluetooth: SCO socket layer initialized
[ 8.208995] Bluetooth: hci0: command 0x2003 tx timeout
[ 10.224994] Bluetooth: hci0: command 0x2007 tx timeout
[ 15.063638] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 15.063639] Bluetooth: BNEP filters: protocol multicast
[ 15.063642] Bluetooth: BNEP socket layer initialized
[ 1069.727317] Bluetooth: hci0: command 0x2003 tx timeout
[ 1071.743434] Bluetooth: hci0: command 0x2007 tx timeout
[ 1346.401282] Bluetooth: hci0: command 0x2003 tx timeout
[ 1348.417451] Bluetooth: hci0: command 0x2007 tx timeout
[ 1487.968981] Bluetooth: hci0: command 0x2003 tx timeout
[ 1489.984757] Bluetooth: hci0: command 0x2007 tx timeout
[ 2258.267934] Bluetooth: hci0: command 0x2003 tx timeout
[ 2260.287907] Bluetooth: hci0: command 0x2007 tx timeout

hciconfig-a hci0

hci0: Type: Primary Bus: USB
BD Address: 33:03:30:09:E8:9D ACL MTU: 360:4 SCO MTU: 0:0
DOWN 
RX bytes:3318 acl:0 sco:0 events:168 errors:0
TX bytes:2208 acl:0 sco:0 commands:180 errors:0
Features: 0xff 0xff 0xcd 0xfa 0xdb 0xbf 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
Link policy: RSWITCH HOLD SNIFF PARK 
Link mode: SLAVE ACCEPT 

sudo hciconfig hci0 启动

Can't init device hci0: Operation not supported (95)

我不确定这里还能做什么?

有趣的是,我购买此设备是因为它说它可以与 Raspberry Pi 配合使用,所以我认为这意味着它也可以与其他 Linux 发行版配合使用。这里提到了这一点,

https://elinux.org/RPi_USB_Bluetooth_adapters

答案1

显然有很多假冒的 CSR 加密狗。Linux 有代码来处理它,但它似乎并不适用于所有假冒加密狗。假冒的加密狗对 bt 的返回代码不正确删除存储的链接密钥函数。要查看是否属于这种情况,请运行:

sudo btmon

在一个终端中,在运行时运行

sudo hciconfig hci0 up

并且btmon应该在之后显示错误删除存储的链接密钥喜欢 :

Status: Unsupported Feature or Parameter Value

为了解决这个问题,我编辑btusb.c并重新编译了btusb.ko内核模块。要将源代码放入当前目录:

apt-get source linux

要构建和安装,请参阅此回答。您可能应该/lib/modules/$(uname -r)/kernel/drivers/bluetooth/btusb.ko在覆盖之前进行备份。

我必须注释掉 2 个if语句才能btusb.c强制运行条件代码(if如果可以,您可以尝试修复语句),如下所示:

/* Fake CSR devices with broken commands */
// if (bcdDevice <= 0x100 || bcdDevice == 0x134)

/* Detect controllers which aren't real CSR ones. */
/* if (le16_to_cpu(rp->manufacturer) != 10 ||
    le16_to_cpu(rp->lmp_subver) == 0x0c5c) */  {

这个被破解的mod 现在假设任何 CSR 都是假的,而我的正在工作。我猜新的克隆使用了不同的数字。不幸的是,每当我得到一个新内核时,btusb我都必须复制或重建。btusb.ko

答案2

在联想 Yoga 900 上安装 19.04 后,我无法打开蓝牙适配器。我尝试了一些针对旧版本 Ubuntu 建议的解决方案,但都不起作用。

当我使用这些命令重新加载内核模块时,我的问题就解决了。

sudo rmmod btusb
sudo modprobe btusb
sudo service bluetooth restart

看来每次重启后我都需要这样做。

答案3

感谢您帮助回答user1020113和damadam。

我买了几个蓝牙适配器,但后来发现是假的,我用您在此处描述的方法修复了它们。它使系统能够使用任何适配器并与其一起工作。

这很简单。我会尝试以简单易懂的方式将所有内容整合在一起。

由于您将重新编译 btcusb.ko 模块,因此您需要获取 Linux 源代码,因此请确保您能够下载源代码。要检查您是否能够下载源代码,请运行以下命令:

software-properties-gtk and click the "source code" checkbox.

确定已准备好下载源代码后,请执行以下命令。它会将源代码下载到您当前的目录中,因此请确保您位于要构建它的目录中。

apt source linux

这应该会创建一个$SOURCEDIR与您的内核版本同名的目录,并将源代码解压到其中。

移动到当前路径下的目录:

cd $SOURCEDIR/drivers/bluetooth

运行以下命令:

make -C /lib/modules/$(uname -r)/build M=$(pwd) clean
cp /usr/src/linux-headers-$(uname -r)/.config ./
cp /usr/src/linux-headers-$(uname -r)/Module.symvers Module.symvers
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo cp /lib/modules/$(uname -r)/kernel/drivers/bluetooth/btusb.ko /lib/modules/$(uname -r)/kernel/drivers/bluetooth/btusb.ko.bak 
sudo cp btusb.ko /lib/modules/$(uname -r)/kernel/drivers/bluetooth
sudo modprobe -r btusb
sudo modprobe -v btusb

如果发生任何不幸的事情,上述代码已将原始 btusb.ko 备份到 btusb.ko.bak,因此您可以随时将其恢复。

瞧瞧。尽情享受吧!但请记住,假设备会像假设备一样运行。

答案4

驱动程序修补答案很棒。不过,我厌倦了每次更新的手动工作。所以我编写了一个脚本!请注意,由于内联补丁中的制表符/空格敏感缩进,下面的代码在复制和粘贴后将不起作用。请改用此要点:https://gist.github.com/andsens/10abada615b69b8ca9b1f2b439288b30

#!/usr/bin/env bash
# https://askubuntu.com/questions/1168123/how-do-i-get-my-bluetooth-device-working/1192200#1192200
set -e

SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

main() {
  local kernver
  kernver=$(uname -r)
  sudo apt update
  rm -rf "$SCRIPTDIR"/linux{-,_}*
  apt source linux

  local drvdir="$SCRIPTDIR/linux-${kernver/%-*}/drivers/bluetooth"
  patch -d "$drvdir" <<<"--- btusb.c    2021-01-28 10:00:00.000000000 +0000
+++ btusb.c 2021-01-28 10:00:00.000000000 +0000
@@ -1642,8 +1642,8 @@
    rp = (struct hci_rp_read_local_version *)skb->data;

    /* Detect controllers which aren't real CSR ones. */
-   if (le16_to_cpu(rp->manufacturer) != 10 ||
-       le16_to_cpu(rp->lmp_subver) == 0x0c5c) {
+   /* if (le16_to_cpu(rp->manufacturer) != 10 ||
+       le16_to_cpu(rp->lmp_subver) == 0x0c5c) */ {
        /* Clear the reset quirk since this is not an actual
         * early Bluetooth 1.1 device from CSR.
         */
@@ -3899,7 +3899,7 @@
            set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);

        /* Fake CSR devices with broken commands */
-       if (bcdDevice <= 0x100 || bcdDevice == 0x134)
+       // if (bcdDevice <= 0x100 || bcdDevice == 0x134)
            hdev->setup = btusb_setup_csr;

        set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
"
  make -C "/lib/modules/$kernver/build" M="$drvdir" clean
  cp "/usr/src/linux-headers-$kernver/.config" "$drvdir/"
  cp "/usr/src/linux-headers-$kernver/Module.symvers" "$drvdir/Module.symvers"
  make -C "/lib/modules/$kernver/build" M="$drvdir" modules

  local backupdir="$SCRIPTDIR/backup/$kernver"
  mkdir -p "$backupdir"
  sudo cp "/lib/modules/$kernver/kernel/drivers/bluetooth/btusb.ko" "$backupdir/btusb.ko"

  sudo cp "$drvdir/btusb.ko" "/lib/modules/$kernver/kernel/drivers/bluetooth/btusb.ko"
  sudo modprobe -r btusb
  sudo modprobe -v btusb
}

main "$@"

相关内容