
Ich habe Alpine Linux edge
(zukünftig 3.15) x86 auf einem HP Stream 7 5709-Tablet (tl;dr: Bay Trail, Intel Atom Z3735G System-on-a-Chip), das über integriertes rtl8723bs
WLAN/Bluetooth verfügt, das ich bereits für WLAN verwende und das gut funktioniert.
sl7alp:~$ uname -a
Linux sl7alp 5.10.72-1-lts #2-Alpine SMP Sat, 16 Oct 2021 06:04:30 +0000 i686 Linux
Für das WLAN /lib/firmware/rtlwifi/rtl8723bs_nic.bin
fehlte die genaue Firmware-Datei in der Distribution, aber sie ist dieselbe wie die rtl8723bu
vorhandene Version, also habe ich einfach einen symbolischen Link dazu erstellt und mit dem Standardtreiber funktionierte es problemlos, mehr war dafür nicht nötig.
Aber wie steht es mit Bluetooth?
Den grundlegenden Beschreibungen von around zufolge rtl8723bs
stellt seine WLAN-Verbindung zum System über SDIO her, seine Bluetooth-Verbindung erfolgt jedoch über einen UART, und das steht im Einklang mit dem, was ich im Geräte-Manager-Verzeichnis unter Windows auf diesem System sehe; der UART, mit dem es verbunden ist, ist einer der im Atom-Prozessor integrierten „HS-UARTs“ (8086:0F0A).
Neben den Standardmodulen des 5.10-Kernels von Edge habe ich das entsprechende zusätzliche Kernelmodul mit den scheinbar relevanten Zusatzfunktionen aktiviert, erstellt und installiert:
CONFIG_SERIAL_DEV_BUS=m
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
Anschließend werden beim Booten die entsprechenden Module automatisch geladen:
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
Ich kann die Ausgabe sehen dmesg
, die für die relevanten HS-UARTs gelten würde:
[ 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
Das Bluetooth-Gerät wird dadurch allerdings nicht automatisch verfügbar gemacht, bluetoothctl
es werden keine Controller aufgelistet und rfkill
auch keine angezeigt.
Ich fand das (scheinbar ältere ~ 4.x Kernel-Ära) Drittanbieter-Repositoryhttps://github.com/lwfinger/rtl8723bs_btund der verbleibende Schritt ist, was ich erwarte, nämlich eine Art Initialisierungs-Handshake direkt über die UARTs durchzuführen und dann dem entsprechenden Teil der Bluetooth-Treiberinfrastruktur mitzuteilen, dass er aktiviert werden und sich damit verbinden und Bluetooth handhaben soll. Bei Verwendung dieses Repos kommt ./start_bt.sh
es jedoch einfach zu einem Fehler:
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
und ich kann weder eine Befehlszeile dafür zusammenstellen, btattach
noch funktioniert die Vanilla-Version hciattach
besser bluez-deprecated
als das.
Weitere Untersuchungen:
Ich sehe, dass in der ACPI-basierten Geräteaufzählung /sys/devices
das Bluetooth-Gerät OBDA8723
unter dem ersten Bay Trail Internal UART aufgeführt ist 80860F0A:00
.
Der h5
Treiber ( bluetooth/hci_h5.c
) stellt eine ACPI-Tabelle mit einem Eintrag für bereit OBDA8723
, und angesichts der Tatsache, dass das System automatisch entscheidet, das btrtl
Modul zu laden, gehe ich davon aus, dass es zumindest soweit ist, dass es wirksam wird.
Wenn ich jedoch ein paar zusätzliche pr_info()
s herumstreue hci_h5
, kann ich sehen, dass zwar der Haupttreiber h5_init()
beim Bluetooth
ersten Laden aller Serdev-Treiber ausgeführt wird, sein jedoch h5_btrtl_setup()
nie ausgeführt wird, auf den in der Struktur der Funktionszeiger verwiesen wird, die mit der ACPI-Tabelle übergeben werden.
Oh verdammt:
Und tatsächlich wird serdev
die Funktion serdev_drv_probe()
nie ausgeführt. Warum?
Berichten über die Lösung ähnlicher Probleme zufolge ist dafür SERIAL_DEV_CTRL_TTYPORT
. Ich hatte dies bereits aktiviert, aber:
Aus drivers/tty/serdev/Kconfig
:
config SERIAL_DEV_CTRL_TTYPORT
[...]
depends on SERIAL_DEV_BUS != m
Mit anderen Worten: Zum Erstellen eines Kernels mit SERIAL_DEV_CTRL_TTYPORT
ist erforderlich, dass SERIAL_DEV_BUS
es tatsächlich in den Kernel integriert ist ( =y
) und nicht nur als Modul aktiviert wird.
Antwort1
Die HS-UART-Geräte, die mit ACPI aufgelistet werden können und über vorhandene Treiber verfügen, werden automatisch in einem mit erstellten 5.10-Kernel instanziiert CONFIG_SERIAL_DEV_CTRL_TTYPORT
, und das reicht aus, um diesen Bluetooth-Controller automatisch ohne zusätzlichen Verbindungsschritt einzurichten. Sie benötigen keine zusätzlichen Dienstprogramme wie die, die für ältere Versionen auf GitHub verfügbar sind. Sie benötigen jedoch die erforderliche Kernelkonfiguration – CONFIG_SERIAL_DEV_CTRL_TTYPORT
erfordert CONFIG_SERIAL_DEV_BUS=y
, d. h. serdev
in den Kernel integriert, nicht nur als Modul erstellt.
Nachdem ich ein neues Kernel-Paket installiert hatte, das alle
CONFIG_SERIAL_DEV_BUS=y
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
das System hat den Controller sofort erkannt:
[ 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
In war es standardmäßig aktiviert rfkill
und ich konnte dann den bluetooth
von bereitgestellten Dienst starten bluez
und verwenden, bluetoothctl
um Bluetooth-Geräte zu suchen und einzurichten.
Aktualisieren:
Beachten Sie, dass in späteren Kerneln der Bluetooth-Controller beim Booten zunächst angezeigt wird, wie in der dmesg
Ausgabe angegeben, dann aber verschwindet, ohne dass in eine weitere Ausgabe erfolgt dmesg
. Sie können jedoch sehen, wie Ihre Bluetooth-Geräte und der Controller in verschwinden, bluetoothctl
wenn Sie es geöffnet haben:
[DEL] Device E8:06:88:xx:xx:xx rakslice’s keyboard
[DEL] Controller 08:D8:33:xx:xx:xx BlueZ 5.62 [default]
Dies scheint eine Kombination aus sicherer Standardkonfiguration der Bluetooth-Aktivierung und Energiesparfunktionen zu sein.
Wenn ich die Stromversorgung des Controllers über die /sys/devices
Hierarchie explizit aktiviere, erscheint der Controller immer dmesg
wieder bluetoothctl
:
sudo bash -c 'echo on > /sys/devices/platform/80860F0A:00/serial0/serial0-0/power/control'
Allerdings funktioniert es immer noch nicht richtig:
[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
Ich habe dieses Problem in eine separate Frage verschoben, da die Fehlermeldung eindeutig ist und das Problem allein gut lösbar ist: So lösen Sie fehlgeschlagene „Bluez“-Verbindungsversuche mit „br-connection-adapter-not-powered“
tl;dr: Nach dem Bearbeiten /etc/bluetooth/main.conf
und Einstellen AutoEnable=true
unter [Policy]
und dem anschließenden Neustart bluez
wird der Controller dmesg
wieder in angezeigt, wenn er offline war, und bleibt eingeschaltet.