如何在linux 5.10中使用rtl8723bs藍牙

如何在linux 5.10中使用rtl8723bs藍牙

edge我在 HP Stream 7 5709 平板電腦(TL;dr:Bay Trail、Intel Atom Z3735G 系統單晶片)上安裝了 Alpine Linux (未來 3.15)x86,它具有板載rtl8723bsWi-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因此我只是符號連結了該韌體文件,它與庫存驅動程式一起工作得很好,不需要其他任何東西。

但是藍牙怎麼樣?

根據rtl8723bsaround的基本描述,它的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或普通的命令列。hciattachbluez-deprecated

更多調查:

我看到基於 ACPI 的設備枚舉在第一個海灣路徑內部 UART 下/sys/devices具有藍牙設備。OBDA872380860F0A:00

驅動h5程式 ( bluetooth/hci_h5.c) 提供了一個 ACPI 表,其中有一個條目OBDA8723,並且根據系統自動決定載入btrtl模組這一事實來判斷,我預計它至少在某種程度上到達了需要生效的位置。

然而,在 周圍撒上一些額外的pr_info()s hci_h5,我可以看到,雖然驅動程式的 main在最初加載所有 serdev 驅動程式h5_init()時運行,但它在隨ACPI 表傳遞的函數指標結構中引用的s 永遠不會運行。Bluetoothh5_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_TTYPORTCONFIG_SERIAL_DEV_BUS=yserdev內建於核心中,而不僅僅是建構為模組。

一旦我安裝了一個用所有的構建的新內核包

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]bluezdmesg

相關內容