edge
我在 HP Stream 7 5709 平板电脑(TL;dr:Bay Trail、Intel Atom Z3735G 片上系统)上安装了 Alpine Linux (未来 3.15)x86,它具有板载rtl8723bs
Wi-Fi/蓝牙,我已经用于 Wi-Fi 并且工作正常。
sl7alp:~$ uname -a
Linux sl7alp 5.10.72-1-lts #2-Alpine SMP Sat, 16 Oct 2021 06:04:30 +0000 i686 Linux
对于 Wi-Fi,/lib/firmware/rtlwifi/rtl8723bs_nic.bin
发行版中缺少其确切的固件文件,但它与现有版本相同,rtl8723bu
因此我只是符号链接了该固件文件,它与库存驱动程序一起工作得很好,不需要其他任何东西。
但是蓝牙怎么样?
根据rtl8723bs
around的基本描述,它的Wi-Fi使用SDIO连接到系统,但它的蓝牙通过UART连接,这与我在该系统上的Windows设备管理器树中看到的一致;它所连接的 UART 是内置“HS-UART”处理器 (8086:0F0A) 的 Atom 处理器之一。
除了 Edge 5.10 内核的默认模块之外,我还获得了适当的附加内核模块,并打开、构建和安装了看似相关的附加功能:
CONFIG_SERIAL_DEV_BUS=m
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
随后,开机自动加载相关模块:
sl7alp:~$ lsmod | grep serdev
serdev 20480 1 hci_uart
sl7alp:~$ lsmod | grep hci_uart
hci_uart 49152 0
btrtl 16384 1 hci_uart
btintel 24576 1 hci_uart
serdev 20480 1 hci_uart
bluetooth 356352 3 btrtl,hci_uart,btintel
我可以看到dmesg
相关 HS-UART 的输出:
[ 1.062751] 80860F0A:00: ttyS1 at MMIO 0x50919000 (irq = 16, base_baud = 2764800) is a 16550A
[ 1.079576] 80860F0A:01: ttyS2 at MMIO 0x5091b000 (irq = 17, base_baud = 2764800) is a 16550A
但这不会自动使蓝牙设备可用;bluetoothctl
不列出任何控制器,也不rfkill
显示任何控制器。
我找到了(看似较旧的〜4.x内核时代)第三方存储库https://github.com/lwfinger/rtl8723bs_bt其剩余步骤是我所期望的,直接通过 UART 与其进行某种初始化握手,然后告诉蓝牙驱动程序基础设施的相关部分唤醒并连接到它并处理其蓝牙,但使用该存储库./start_bt.sh
,它只是错误:
Using device /dev/ttyS1 for Bluetooth
Realtek Bluetooth init uart with init speed:115200, final_speed:115200, type:HCI UART H5
Realtek Bluetooth :Realtek hciattach version 2.5
Realtek Bluetooth :3-wire sync pattern resend : 1, len: 8
[...]
Realtek Bluetooth :3-wire sync pattern resend : 40, len: 8
Realtek Bluetooth ERROR: H5 sync timed out
我无法编造出比这更好的命令行btattach
或普通的命令行。hciattach
bluez-deprecated
更多调查:
我看到基于 ACPI 的设备枚举在第一个海湾路径内部 UART 下/sys/devices
具有蓝牙设备。OBDA8723
80860F0A:00
驱动h5
程序 ( bluetooth/hci_h5.c
) 提供了一个 ACPI 表,其中有一个条目OBDA8723
,并且根据系统自动决定加载btrtl
模块这一事实来判断,我预计它至少在某种程度上到达了需要生效的位置。
然而,在 周围撒上一些额外的pr_info()
s hci_h5
,我可以看到,虽然驱动程序的 main在最初加载所有 serdev 驱动程序h5_init()
时运行,但它在随 ACPI 表传递的函数指针结构中引用的 s 永远不会运行。Bluetooth
h5_btrtl_setup()
哦该死:
事实上serdev
的函数serdev_drv_probe()
甚至从未运行过。为什么?
根据解决类似问题的报告,它需要SERIAL_DEV_CTRL_TTYPORT
.我已经启用了此功能,但是:
从drivers/tty/serdev/Kconfig
:
config SERIAL_DEV_CTRL_TTYPORT
[...]
depends on SERIAL_DEV_BUS != m
换句话说,构建内核SERIAL_DEV_CTRL_TTYPORT
需要SERIAL_DEV_BUS
实际内置于内核(=y
),而不仅仅是作为模块启用。
答案1
可以使用 ACPI 枚举并且具有驱动程序的 HS-UART 设备将在使用 构建的 5.10 内核中自动实例化CONFIG_SERIAL_DEV_CTRL_TTYPORT
,这足以自动设置此蓝牙控制器,无需任何额外的连接步骤。您不需要任何额外的实用程序,例如 GitHub 上针对旧版本的实用程序。但是您需要拥有所需的内核配置——requires CONFIG_SERIAL_DEV_CTRL_TTYPORT
,CONFIG_SERIAL_DEV_BUS=y
即serdev
内置于内核中,而不仅仅是构建为模块。
一旦我安装了一个用所有的构建的新内核包
CONFIG_SERIAL_DEV_BUS=y
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
系统立即检测到控制器:
[ 5.809856] Bluetooth: hci0: RTL: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723
[ 5.814460] Bluetooth: hci0: RTL: rom_version status=0 version=1
[ 5.814467] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723bs_fw.bin
[ 5.815894] Bluetooth: hci0: RTL: loading rtl_bt/rtl8723bs_config-OBDA8723.bin
[ 5.838004] Bluetooth: hci0: RTL: cfg_sz 64, total sz 24508
[ 6.720942] Bluetooth: hci0: RTL: fw version 0x365d462e
它在 中默认启用rfkill
,然后我可以启动bluetooth
提供的服务bluez
,并用于bluetoothctl
查找和设置蓝牙设备。
更新:
请注意,在更高版本的内核中,蓝牙控制器将在启动过程中最初出现,如输出中所述dmesg
,但随后会消失,并且在 中没有进一步的输出,但如果您打开它,dmesg
您可以看到您的蓝牙设备和控制器消失bluetoothctl
:
[DEL] Device E8:06:88:xx:xx:xx rakslice’s keyboard
[DEL] Controller 08:D8:33:xx:xx:xx BlueZ 5.62 [default]
这似乎是蓝牙启用和省电功能的安全默认配置的某种组合。
如果我通过层次结构显式启用控制器的电源/sys/devices
,控制器会dmesg
再次出现bluetoothctl
:
sudo bash -c 'echo on > /sys/devices/platform/80860F0A:00/serial0/serial0-0/power/control'
但它仍然无法正常运行:
[bluetooth]# connect E8:06:88:xx:xx:xx
Attempting to connect to E8:06:88:xx:xx:xx
Failed to connect: org.bluez.Error.NotReady br-connection-adapter-not-powered
我将该问题移至一个单独的问题,因为错误消息是唯一的,并且它本身就是一个很好解决的问题: 如何解决“bluez”连接尝试因“br-connection-adapter-not-powered”而失败的问题
tl;dr: 在下编辑/etc/bluetooth/main.conf
和设置后,然后重新启动,如果控制器处于离线状态,则会再次出现,并保持打开状态。AutoEnable=true
[Policy]
bluez
dmesg