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

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

edge私はHP Stream 7 5709 タブレット (tl;dr: Bay Trail、Intel Atom Z3735G システムオンチップ) にAlpine Linux (将来 3.15) x86 をインストールしています。このタブレットにはオンボードのrtl8723bsWi-Fi/Bluetooth が搭載されており、既に 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そのファイルをシンボリックリンクするだけで、標準ドライバーで正常に動作しました。他に必要なものはありませんでした。

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

aroundの基本的な説明によるとrtl8723bs、Wi-Fi は SDIO を使用してシステムに接続しますが、Bluetooth は UART 経由で接続します。これは、このシステムの Windows のデバイス マネージャー ツリーに表示される内容と一致しています。接続されている UART は、Atom プロセッサに組み込まれた「HS-UART」の 1 つ (8086:0F0A) です。

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 ベースのデバイス列挙には、最初のベイ トレイルの内部 UART の下に/sys/devicesBluetooth デバイスが として含まれていることがわかります。OBDA872380860F0A:00

ドライバーh5( bluetooth/hci_h5.c) は、 の 1 つのエントリを含む ACPI テーブルを提供しますOBDA8723。システムが自動的にモジュールをロードすることを決定するという事実から判断するとbtrtl、少なくともそれが有効になるために必要な場所に多少は到達していると予想されます。

ただし、 のpr_info()周囲にいくつかの余分な を散りばめてみると、が最初にすべての serdev ドライバーをロードするときにhci_h5ドライバーの main が実行される一方で、ACPI テーブルで渡される関数ポインターの構造体で参照される は決して実行されないことがわかります。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=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提供するサービスを起動してbluezbluetoothctlBluetooth デバイスの検索と設定に使用できるようになりました。

アップデート:

以降のカーネルでは、出力に示されているように、起動時に 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

関連情報