我在 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
所以,看起来好像有某种蓝牙设备。
我已经安装了bluez
和bluez-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-uart
和btbcm
驱动程序进行访问。确保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=y
serdev 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 上运行。