我需要帮助解决蓝牙问题。我无法使用 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 发行版配合使用。这里提到了这一点,
答案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 "$@"