我的蓝牙适配器在 Ubuntu 中不工作。
$ lsusb | grep tooth
Bus 002 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
$ hciconfig
hci0: Type: Primary Bus: USB
BD Address: 33:03:30:09:74:B4 ACL MTU: 360:4 SCO MTU: 0:0
DOWN
RX bytes:1106 acl:0 sco:0 events:56 errors:0
TX bytes:736 acl:0 sco:0 commands:60 errors:0
$ sudo hciconfig hci0 up
Can't init device hci0: Operation not supported (95)
$ bluetoothctl
Agent registered
[bluetooth]# power on
No default controller available
$ hcitool dev
Devices:
$
$ rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth hci0 unblocked unblocked
1 wlan phy0 unblocked unblocked
尝试过最后两个动作:
蓝竹
在 Ubuntu v10.04 ~ 11.04 中开箱即用,但在 11.10 中停止可靠运行,频繁出现内核崩溃和其他一般不良现象,[Bug:901770]
$ lsusb <br>Bus 007 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
$ hciconfig -a hci0 <br>Manufacturer: Cambridge Silicon Radio (10)
可能需要与 Belkin 相同的修复:添加
blacklist hci_usb
到/etc/modprobe.d/blacklist.conf
,并添加hci_usb reset=1
到/etc/modules
也尝试过
- 安装内核 5.5.2 内核。但登录失败,所以我清除了它并返回到我的
5.3.0-29-generic
内核。 - 去做下一个,但失败了:
$ make -C /lib/modules/$(uname -r)/build M=$PWD modules make: Entering directory '/usr/src/linux-headers-5.3.0-29-generic' CC [M] /home/spacer/kernel/bluetooth/hci_vhci.o /home/spacer/kernel/bluetooth/hci_vhci.c: In function ‘vhci_create_device’: /home/spacer/kernel/bluetooth/hci_vhci.c:134:2: warning: dereferencing ‘void *’ pointer 134 | *skb_put(skb, 1) = 0xff; | ^~~~~~~~~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c:134:19: error: invalid use of void expression 134 | *skb_put(skb, 1) = 0xff; | ^ /home/spacer/kernel/bluetooth/hci_vhci.c:135:2: warning: dereferencing ‘void *’ pointer 135 | *skb_put(skb, 1) = dev_type; | ^~~~~~~~~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c:135:19: error: invalid use of void expression 135 | *skb_put(skb, 1) = dev_type; | ^ /home/spacer/kernel/bluetooth/hci_vhci.c: In function ‘vhci_get_user’: /home/spacer/kernel/bluetooth/hci_vhci.c:203:19: error: ‘HCI_BREDR’ undeclared (first use in this function) 203 | if (dev_type != HCI_BREDR && dev_type != HCI_AMP) | ^~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c:203:19: note: each undeclared identifier is reported only once for each function it appears in /home/spacer/kernel/bluetooth/hci_vhci.c: In function ‘vhci_open_timeout’: /home/spacer/kernel/bluetooth/hci_vhci.c:307:43: error: ‘HCI_BREDR’ undeclared (first use in this function) 307 | vhci_create_device(data, amp ? HCI_AMP : HCI_BREDR); | ^~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c: At top level: /home/spacer/kernel/bluetooth/hci_vhci.c:352:3: error: ‘const struct file_operations’ has no member named ‘aio_write’ 352 | .aio_write = vhci_write, | ^~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c:352:15: error: positional initialization of field in ‘struct’ declared with ‘designated_init’ attribute [-Werror=designated-init] 352 | .aio_write = vhci_write, | ^~~~~~~~~~ /home/spacer/kernel/bluetooth/hci_vhci.c:352:15: note: (near initialization for ‘vhci_fops’) /home/spacer/kernel/bluetooth/hci_vhci.c:352:15: error: initialization of ‘ssize_t (*)(struct file *, const char *, size_t, loff_t *)’ {aka ‘long int (*)(struct file *, const char *, long unsigned int, long long int *)’} from incompatible pointer type ‘ssize_t (*)(struct kiocb *, const struct iovec *, long unsigned int, loff_t)’ {aka ‘long int (*)(struct kiocb *, const struct iovec *, long unsigned int, long long int)’} [-Werror=incompatible-pointer-types] /home/spacer/kernel/bluetooth/hci_vhci.c:352:15: note: (near initialization for ‘vhci_fops.write’) cc1: some warnings being treated as errors make[1]: *** [scripts/Makefile.build:290: /home/spacer/kernel/bluetooth/hci_vhci.o] Error 1 make: *** [Makefile:1655: _module_/home/spacer/kernel/bluetooth] Error 2 make: Leaving directory '/usr/src/linux-headers-5.3.0-29-generic'
答案1
此设备有多个版本,USB ID 相同。有些人说这些是假的,但我怀疑这些只是芯片的较新型号。
要使芯片工作,需要几个怪癖,并且需要修补负责启用这些怪癖的内核代码,以测试这些较新的型号:
--- drivers/bluetooth/btusb.c.old 2020-03-31 19:14:11.765239911 +0100
+++ drivers/bluetooth/btusb.c 2020-03-31 19:22:17.035003199 +0100
@@ -1643,4 +1643,6 @@
/* Detect controllers which aren't real CSR ones. */
if (le16_to_cpu(rp->manufacturer) != 10 ||
+ le16_to_cpu(rp->lmp_subver) == 0x0811 ||
+ le16_to_cpu(rp->lmp_subver) == 0x0812 ||
le16_to_cpu(rp->lmp_subver) == 0x0c5c) {
/* Clear the reset quirk since this is not an actual
@@ -3873,5 +3875,5 @@
/* Fake CSR devices with broken commands */
- if (bcdDevice <= 0x100 || bcdDevice == 0x134)
+ if (bcdDevice <= 0x100 || bcdDevice == 0x134 || bcdDevice == 0x8891)
hdev->setup = btusb_setup_csr;
我不能保证这能解决所有较新型号的问题,并且可能需要进行额外的测试以包含更多 LMP 子版本和 bcdDevice 编号。但是,上述方法对一些使用较新蓝牙 4.0 型号的用户以及我自己使用蓝牙 5.0 型号的用户确实有效。
它将启动设备,如下所示:
# hciconfig
hci0: Type: Primary Bus: USB
BD Address: 00:1A:7D:DA:71:11 ACL MTU: 679:9 SCO MTU: 48:16
UP RUNNING
RX bytes:56724 acl:29 sco:0 events:7890 errors:0
TX bytes:4782028 acl:7788 sco:0 commands:84 errors:0
这是使用内核 5.5.13 和来自 AliExpress 的廉价蓝牙 5.0 加密狗进行测试的,现在它让我可以连接到蓝牙 5.0 耳机。
顺便说一下,该加密狗在 Windows 10 下运行良好。
补充:关闭 USB 自动暂停
USB 端口的自动暂停可能会干扰蓝牙 USB 适配器。虽然自动暂停有助于节省电量,设备应该可以自行快速唤醒,但此功能可能会失效,从而降低蓝牙连接性。默认情况下,内核会在 2 秒后暂停 USB 端口。此功能可以针对所有 USB 端口或仅针对个别端口禁用,蓝牙 USB 驱动程序有一个参数,专门控制 USB 连接的蓝牙适配器的此功能。例如,要查看当前状态:
# lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 062a:3633 MosArt Semiconductor Corp. Full-Speed Mouse
Bus 004 Device 002: ID 1b1c:1b39 Corsair Corsair Gaming K65 RGB RAPIDFIRE Keyboard
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 009 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# grep . /sys/bus/usb/devices/[0-9]*/power/control
/sys/bus/usb/devices/4-1/power/control:on
/sys/bus/usb/devices/4-2/power/control:on
/sys/bus/usb/devices/5-5/power/control:auto
此处鼠标和键盘始终处于打开状态,但 CSR 蓝牙 USB 适配器设置为自动挂起。如果启用了自动挂起功能并且导致出现问题,则可以通过暂时禁用它来测试它:
# echo on > /sys/bus/usb/devices/5-5/power/control
# cat /sys/bus/usb/devices/5-5/power/control
on
如果这有帮助,那么应该永久禁用它,并且有几种方法可以做到这一点:
当你已经重新编译内核时,最好通过设置配置参数来禁用蓝牙 USB 内核模块CONFIG_BT_HCIBTUSB_AUTOSUSPEND到否或者在内核配置文件中将其注释掉。这将导致蓝牙 USB 驱动程序默认禁用它找到匹配设备的每个端口的自动暂停功能,并使所有其他 USB 设备保持原样。
无需重新编译内核,也无需将蓝牙 USB 模块编译到内核中,只需使用启动参数即可。对于 GRUB 编辑/etc/默认/grub并在内核命令行中添加btusb.enable_autosuspend=n.然后运行以下命令更新 grub 配置更新 grub然后重新启动。
文件:/etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="... btusb.enable_autosuspend=n"
...
- 无需重新编译内核,并且无需加载蓝牙 USB 模块,就可以在/etc/modprobe.d/传递参数。然后重新启动,或者拔下加密狗并使用rmmod btusb并使用以下命令重新启动模块服务服务 systemd-modules-load 重新启动然后再重新插入加密狗。
文件:/etc/modprobe.d/bluetooth-usb.conf
options btusb enable_autosuspend=n
附加功能:启用快速连接设置
改善蓝牙连接的另一种方法是启用快速连接设置蓝牙守护进程。该设置可以在/etc/bluetooth/main.conf。
文件:/etc/bluetooth/main.conf
...
# Permanently enables the Fast Connectable setting for adapters that
# support it. When enabled other devices can connect faster to us,
# however the tradeoff is increased power consumptions. This feature
# will fully work only on kernel version 4.1 and newer. Defaults to
# 'false'.
FastConnectable = true
...
答案2
我有这个加密狗 - 它已经有好几年了,所以我无法评论它是否是假的,或者带有这个 USB ID 的现代加密狗是否可以是假的。
Bus 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
我将它与一台非常老旧的 Acer TravelMate 2420 笔记本电脑一起使用,该笔记本电脑(出于必要)使用 Ubuntu 18.04 LTS 的 i386 版本。 (截至撰写本文时,当前内核为 4.15.0-106-generic。 (无需同情。这只是一台我放在卧室里偶尔使用的旧备用电脑。)
蓝牙对我来说是有用的,但不太可靠。我的蓝牙鼠标(Microsoft Bluetooth Notebook Mouse 5000)经常断开连接。
几周前我通过以下更改彻底解决了这些问题/etc/default/tlp
:
# Exclude listed devices...
USB_BLACKLIST="0a12:0001"
# Bluetooth devices are excluded...
USB_BLACKLIST_BTUSB=1
(找到适当的行并添加第一行,然后相应地编辑第二行。)
可能我不需要特定的基于 ID 的USB_BLACKLIST
命令(我还没有测试过这个),但为了安全起见,我想把它保留下来。第二个(USB_BLACKLIST_BTUSB)在我的系统上默认为 0,我怀疑这是需要更改的关键配置。
tlp
如果尚未安装,您可能需要专门安装该包。重新配置后,请不要忘记重新启动它。
我希望这有帮助。
答案3
我遇到了两个不同的问题0a12:0001 Cambridge Silicon Radio
。两者都是 TRENDnet TBW-106UB。我购买了两个新的 USB 蓝牙适配器,从那以后就没再遇到过问题。我已经将新的适配器与 Ubuntu 18.04 和 19.10 一起使用。
答案4
在 Ubuntu 22.04 中,我的问题是使用 Cambridge Silicon Radio, Ltd 蓝牙适配器与内核版本有关。
- 使用以下方法更新内核版本 https://linuxhint.com/install-upgrade-latest-kernel-ubuntu-22-04/
- 重启。
- 检查 ubuntu 配置蓝牙是否工作。
更新的版本是 6.1.8-060108-generic 。之前是 5.15。虽然我之前安装了很多蓝牙驱动程序/应用程序,比如 blueman,但我不知道它们是否有必要。现在 blue man 管理器在托盘上显示了 ubuntu 的蓝牙配置