蓝牙适配器配置问题(ID 0a12:0001)

蓝牙适配器配置问题(ID 0a12:0001)

我的蓝牙适配器在 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 一起使用。

https://www.amazon.com/gp/product/B07J5WFPXX

https://www.amazon.com/gp/product/B007Q45EF4

答案4

在 Ubuntu 22.04 中,我的问题是使用 Cambridge Silicon Radio, Ltd 蓝牙适配器与内核版本有关。

  1. 使用以下方法更新内核版本 https://linuxhint.com/install-upgrade-latest-kernel-ubuntu-22-04/
  2. 重启。
  3. 检查 ubuntu 配置蓝牙是否工作。

更新的版本是 6.1.8-060108-generic 。之前是 5.15。虽然我之前安装了很多蓝牙驱动程序/应用程序,比如 blueman,但我不知道它们是否有必要。现在 blue man 管理器在托盘上显示了 ubuntu 的蓝牙配置

Ubuntu 配置和 blueman-tray 显示

相关内容