我在Chromebook C201上安装了Arch。我一直试图让蓝牙工作不成功,但我不知道问题出在哪里。
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
包,并且启用了蓝牙,我已经确认它正在运行:
$ 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]#
我想不出还有什么可以尝试的。我遗漏了什么吗?
编辑:
给出的唯一答案并没有解决这个问题,而且似乎对这个问题几乎没有什么反应,尽管从赏金那里获得了一些额外的能见度。那么,我是否应该推断,应该存在的一切似乎都是正确的呢?这是否意味着它更有可能是一个bug,也许在bluez或内核模块中?
发布于 2019-09-09 17:55:08
在C201上检测到的与SDIO连接的蓝牙模块是诱饵。您不应该在C201上使用C201驱动程序,实际上,我建议在C201上完全禁用或黑名单这个模块,这样您就不必处理在内核中注册的功能失调的主机控制器了。
BCM4354蓝牙模块通过UART连接,使用hci-uart
和btbcm
驱动程序访问。确保在hci-uart
驱动程序(CONFIG_BT_HCIUART_BCM=y
)中启用了broadcom支持。这些驱动程序需要额外的启动步骤才能将设备与蓝牙子系统连接起来。你可以跑,例如,
# 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
那么你应该看到设备注册了。这个模块需要专有的固件来操作。我从预装的OS映像中提取了文件BCM4354_003.001.012.0358.0746.hcd
,并将其保存到/lib/firmware/brcm/BCM4354.hcd
,以便内核找到它。
在进一步的检查,波德率选项的btattach似乎并没有实际做任何事情,因此这是结束与蓝牙控制器连接在115 which,这是有点慢的一面。正确的方法似乎是将控制器添加到设备树中。因此,我在Linux5.2中将下面的修补程序应用到了devicetree源代码中,并且它的工作速度比3 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 {
发布于 2019-02-06 01:22:58
如果您的bluez版本在5.50-6之前,那么一个已知的问题是:https://bugs.archlinux.org/task/61386
5.50-6正在这里工作,巧合的是,英特尔(Intel)的Chromebook。
https://unix.stackexchange.com/questions/498473
复制相似问题