Linux 5.10でrtl8723bs Bluetoothを使用する方法

Linux 5.10でrtl8723bs Bluetoothを使用する方法

edgeWi-Fi / Bluetoothを搭載したHP Stream 7 5709タブレット(TL:dr:Bay Trail、Intel Atom Z3735G System-on-Chip)にAlpine Linux(将来3.15)x86がインストールされています。rtl8723bsWi-Fiに使ってきました。 -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ファームウェアファイルだけがシンボリックリンクだけだったので、純正ドライバとうまく動作し、他は必要ありませんでした。

しかし、Bluetoothはどうですか?

基本的な説明によると、rtl8723bsWi-FiはSDIOを使用してシステムに接続されますが、BluetoothはUARTを介して接続されます。これは、このシステムのWindowsデバイスマネージャツリーで表示できるものと一致します。 「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

ただし、これはBluetoothデバイスが自動的に使用可能になるわけではありません。bluetoothctlコントローラは一覧表示されず、rfkillコントローラも表示されません。

(4.xカーネル時代より古いと思われる)サードパーティのリポジトリを見つけました。https://github.com/lwfinger/rtl8723bs_bt残りのステップは、UARTを介して直接一種の初期化ハンドシェイクを実行してから、Bluetoothドライバインフラストラクチャの関連部分にスリープモードを解除して接続してBluetoothを処理するように指示することです。ただし、そのリポジトリを使用する./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ベースのデバイス列挙の最初のベイパスInternal UARTの下に/sys/devicesBluetoothデバイスがあることを確認しました。OBDA872380860F0A:00

ドライバh5bluetooth/hci_h5.c)はエントリを含むACPIテーブルを提供し、システムが自動的にモジュールをロードすることを決定したとOBDA8723判断した場合、btrtl少なくともある程度は適用が必要な場所に達すると予想されます。

ただし、周辺にいくつかの追加pr_info()エントリを適用すると、すべてのserdevドライバが最初にロードされたときにドライバのベースが実行されている間、ACPIテーブルで渡された関数ポインタ構造で参照されるエントリは実行されないことがhci_h5わかります。h5_init()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。これは、追加の接続ステップなしでこのBluetoothコントローラを自動的に設定するのに十分です。以前のバージョンでは、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起動し、それを使用してBluetoothデバイスを見つけて設定できます。bluetoothbluezbluetoothctl

修正する:

以降のカーネルでは、Bluetoothコントローラは最初に出力に指定されているように起動中に表示されますが、dmesgその後は消えて出力がなくなります。ただし、電源を入れるとdmesgBluetoothデバイスとコントローラが消えることがありますbluetoothctl

[DEL] Device E8:06:88:xx:xx:xx rakslice’s keyboard
[DEL] Controller 08:D8:33:xx:xx:xx BlueZ 5.62 [default]

これは、Bluetoothの有効化と省電力のための安全な基本設定の組み合わせのようです。

階層を介してコントローラの電源を明示的に有効にすると、/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

エラーメッセージはユニークでそれ自体がよく解決された問題であるため、この質問を別の質問に移動しました。 "br-connection-adapter-not-powered"で失敗する "bluez"接続の試みを修正する方法

tl;dr: 編集/etc/bluetooth/main.confおよび設定後に再起動した後、コントローラがオフラインの場合は再び表示され続けます。AutoEnable=true[Policy]bluezdmesg

おすすめ記事