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