为什么蓝牙在我的 Chromebook (Arch Linux ARM) 上无法工作?

为什么蓝牙在我的 Chromebook (Arch Linux ARM) 上无法工作?

我在 Chromebook C201 上安装了 Arch Linux ARM。我一直在尝试让蓝牙工作但没有成功,我不知道问题出在哪里。

的输出dmesg似乎表明系统正在成功找到并初始化板载蓝牙控制器:

$ dmesg | grep Blue
[    4.058823] Bluetooth: Core ver 2.22
[    4.058865] Bluetooth: HCI device and connection manager initialized
[    4.058873] Bluetooth: HCI socket layer initialized
[    4.058877] Bluetooth: L2CAP socket layer initialized
[    4.058886] Bluetooth: SCO socket layer initialized
[    4.061738] Bluetooth: Generic Bluetooth SDIO driver ver 0.1
[    4.971101] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    4.971104] Bluetooth: BNEP filters: protocol multicast
[    4.971113] Bluetooth: BNEP socket layer initialized

据我所知,蓝牙所需的内核模块似乎也已在启动时加载:

$ lsmod | grep ^b
bnep                   20480  2
btsdio                 16384  0
bluetooth             352256  9 btsdio,bnep

/sys/class/bluetooth我有以下内容:

$ ls /sys/class/bluetooth
hci0

所以,看起来好像有某种蓝牙设备。

我已经安装了bluezbluez-utils软件包,并且启用了 bluetoothd,我已确认它正在运行:

$ systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
   Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset:>
   Active: active (running) since Sun 2019-02-03 07:22:15 EST; 6h ago
     Docs: man:bluetoothd(8)
 Main PID: 324 (bluetoothd)
   Status: "Running"
    Tasks: 1 (limit: 4915)
   Memory: 2.4M
   CGroup: /system.slice/bluetooth.service
           └─324 /usr/lib/bluetooth/bluetoothd

我还检查了蓝牙控制器没有被 rfkill 阻止:

$ rfkill list
0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
1: hci0: Bluetooth
    Soft blocked: no
    Hard blocked: no

但是,如果我尝试运行bluetoothctl(或blueman),则找不到蓝牙适配器:

$ bluetoothctl
Agent registered
[bluetooth]# list
[bluetooth]#

我想不出还有什么可以尝试的。我缺少什么吗?


编辑:

给出的唯一答案并没有解决问题,尽管从赏金中获得了一些额外的可见性,但似乎对这个问题的回应很少。那么,我是否应该推断应该存在的一切似乎都正确就位?这是否表明它更有可能是漏洞,也许在 bluez 中或者在内核模块中?

答案1

C201 上检测到的 SDIO 连接蓝牙模块是一个诱饵。您不应该btsdio在 C201 上使用该驱动程序,事实上,我建议在 C201 上完全禁用该模块或将其列入黑名单,这样您就不必处理在内核中注册的功能失调的主机控制器。

C201 上的 BCM4354 蓝牙模块通过 UART 连接,可使用hci-uartbtbcm驱动程序进行访问。确保hci-uart驱动程序中启用了 Broadcom 支持 ( CONFIG_BT_HCIUART_BCM=y)。这些驱动程序需要额外的启动步骤才能将设备与蓝牙子系统连接。你可以运行例如

# btattach -S 3000000 -B /dev/ttyS0 -p bcm
Attaching Primary controller to /dev/ttyS0
Switched line discipline from 0 to 15
Device index 0 attached

然后您应该会看到设备已注册。该模块需要专有固件才能运行。我BCM4354_003.001.012.0358.0746.hcd从预安装的操作系统映像中获取了该文件,将其保存/lib/firmware/brcm/BCM4354.hcd以便内核能够找到它。

经过进一步检查,btattach 的波特率选项似乎实际上没有执行任何操作,因此最终蓝牙控制器以 115kbaud 连接,这有点慢。正确的方法似乎是将控制器添加到设备树中。因此,我将以下补丁应用于 Linux 5.2 中的 devicetree 源代码,并且一切都以 3Mbaud 的更可用速度运行(作为奖励,您不再运行 btattach,所有内容都会在启动时自动注册)。

您必须启用CONFIG_SERIAL_DEV_CTRL_TTYPORT=yserdev devicetree 功能才能工作。

diff --git a/arch/arm/boot/dts/rk3288-veyron.dtsi b/arch/arm/boot/dts/rk3288-veyron.dtsi
index 1252522392c7..36000dbb8dda 100644
--- a/arch/arm/boot/dts/rk3288-veyron.dtsi
+++ b/arch/arm/boot/dts/rk3288-veyron.dtsi
@@ -57,7 +57,7 @@
        clocks = <&rk808 RK808_CLKOUT1>;
        clock-names = "ext_clock";
        pinctrl-names = "default";
-       pinctrl-0 = <&bt_enable_l>, <&wifi_enable_h>;
+       pinctrl-0 = <&wifi_enable_h>;

        /*
         * Depending on the actual card populated GPIO4 D4 and D5
@@ -71,8 +71,7 @@
         * - BT_I2S_WS_BT_RFDISABLE_L
         * - No connect
         */
-       reset-gpios = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>,
-                 <&gpio4 RK_PD5 GPIO_ACTIVE_LOW>;
+       reset-gpios = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>;
    };

    vcc_5v: vcc-5v {
@@ -402,6 +401,16 @@
    /* Pins don't include flow control by default; add that in */
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
+
+   bluetooth {
+       compatible = "brcm,bcm43438-bt";
+       max-speed = <3000000>;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&bt_enable_l>;
+
+       shutdown-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
+   };
 };

 &uart1 {

答案2

如果您的 bluez 版本早于 5.50-6,则存在一个已知问题: https://bugs.archlinux.org/task/61386

巧合的是,5.50-6 正在(英特尔)Chromebook 上运行。

相关内容