我有阿尔卑斯Linux edge
(未来3.15) x86在惠普流7 5709平板电脑(tl;dr: Bay Trail,英特尔Atom Z3735G系统的芯片上),它有一个车载rtl8723bs
Wi/蓝牙,我已经使用的Wi和工作良好。
sl7alp:~$ uname -a
Linux sl7alp 5.10.72-1-lts #2-Alpine SMP Sat, 16 Oct 2021 06:04:30 +0000 i686 Linux
对于Wi,它的精确固件文件/lib/firmware/rtlwifi/rtl8723bs_nic.bin
在发行版中丢失了,但它与rtl8723bu
版本相同,所以我只是将其符号链接起来,并且与股票驱动程序工作得很好,不需要其他任何东西。
但是蓝牙怎么样?
根据对rtl8723bs
的基本描述,它的with使用SDIO连接到系统,但它的蓝牙通过UART连接,这与我在Windows上的设备管理器树中看到的情况一致;它连接的UART是内置于“HS”(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:
[ 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
也没有显示任何控制器。
我发现了第三方存储库https://github.com/lwfinger/rtl8723bs_bt (看似更老的~ 4.x内核时代),其馀的一步就是我所期望的,直接通过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
或bluez-deprecated
的普通hciattach
编写一个命令行,这样的命令行工作得更好。
More调查:
我看到/sys/devices
下的基于ACPI的设备枚举将蓝牙设备作为OBDA8723
,位于第一湾线索内部UART 80860F0A:00
下。
h5
驱动程序(bluetooth/hci_h5.c
)为OBDA8723
提供了一个包含一个条目的ACPI表,从系统自动决定加载btrtl
模块这一事实来看,我希望它至少在某种程度上达到了生效所需的程度。
但是,在pr_info()
s周围加上一些额外的hci_h5
,我可以看到,当Bluetooth
最初加载所有serdev驱动程序时,驱动程序的主h5_init()
运行时,它的h5_btrtl_setup()
(它在传递给ACPI表的函数指针的结构中引用)从未运行。
Oh darn:
事实上,serdev
的S函数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
)中,而不仅仅是作为一个模块启用。
发布于 2021-10-25 17:05:33
have设备可以使用ACPI进行枚举,并且有驱动程序,这些设备将在用CONFIG_SERIAL_DEV_CTRL_TTYPORT
构建的5.10内核中自动实例化,这足以自动设置此蓝牙控制器,而无需任何附加步骤。您不需要任何额外的实用程序,比如那些在GitHub上浮动的旧版本的实用程序。但是您需要有所需的内核配置-- 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
中启用的,然后我可以启动bluez
提供的bluetooth
服务,并使用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
一旦解决了这个问题,如果控制器离线并继续工作,控制器将再次出现在dmesg
中。
https://unix.stackexchange.com/questions/674562
复制相似问题