Realtek RTL8761B Günstiger Bluetooth 5.0 USB Dongle läuft unter Linux

Ich habe einen mysteriösen chinesischen Bluetooth-Dongle mit "BT 5.0" bei Amazon gekauft. Bei Amazon waren es ungefähr 800-1000 Yen, aber es scheint, dass Sie bei AliExpress für ungefähr 200 Yen etwas Ähnliches bekommen können. Wird es wirklich funktionieren? Dieser Dongle verwendet den RTL8761B-Chip von Realtek, der mit Linux 5.8 und höher kompatibel ist. Die Hauptdistributionen enthalten jedoch noch nicht die Firmware, die zum Ausführen erforderlich ist. Sie müssen die Firmware daher von einem beliebigen Ort abrufen und installieren.

Änderungsprotokoll

--2020 / 10/27 Der Artikel wurde korrigiert, da er mit Google Home und AirPods gepaart wurde.

Kernel-Einstellungen

Gehen Sie von sudo make menuconfig zu Netzwerkunterstützung-> Bluetooth-Subsystemunterstützung-> Bluetooth-Gerätetreiber

<M> HCI USB driver
[*]   Realtek protocol support

Wird besorgt. Der HCI-USB-Treiber muss als Modul erstellt werden. Wenn Sie es installieren, ohne es als Modul zu erstellen, wird die Firmware möglicherweise nicht geladen.

.config


CONFIG_BT_HCIBTUSB=m
CONFIG_BT_RTL=m
CONFIG_BT_HCIBTUSB_RTL=y

Firmware-Installation

Firmware von einem Dongle-Treiber namens Mpows BH456A, der denselben RTL8761B verwendet Extrakt. Die in der Linux-Version enthaltene Firmware war fehlerhaft und einige Geräte konnten nicht gekoppelt werden. Daher werde ich die Windows-Version mit Ausnahme einiger Dateien verwenden.

$ wget https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Linux.tgz
$ tar xzf mpow_MPBH456AB_driver+for+Linux.tgz
$ sudo cp 20200610_LINUX_BT_DRIVER/rtkbt-firmware/lib/firmware/rtlbt/rtl8761b_config /lib/firmware/rtl_bt/rtl8761b_config.bin
$ wget https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Windows7_8.1_10.zip
$ unzip mpow_MPBH456AB_driver+for+Windows7_8.1_10.zip
$ sudo cp RTBlueR_Windows_1015.1016.1016.0528.2020_F027_L/BT_Driver/Win10X64/rtl8761b_mp_chip_bt40_fw_asic_rom_patch_new.dll /lib/firmware/rtl_bt/rtl8761b_fw.bin

Wenn Sie nun den Dongle anschließen, sollte der Kernel die Firmware laden und richtig erkennen.

[151940.809102] usb 2-1: new full-speed USB device number 17 using xhci_hcd
[151940.936028] usb 2-1: New USB device found, idVendor=0bda, idProduct=8771, bcdDevice= 2.00
[151940.936033] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[151940.936035] usb 2-1: Product: Bluetooth Radio
[151940.936037] usb 2-1: Manufacturer: Realtek
[151940.936038] usb 2-1: SerialNumber: XXXXXXXXXXXX
[151940.940621] Bluetooth: hci0: RTL: examining hci_ver=0a hci_rev=000b lmp_ver=0a lmp_subver=8761
[151940.941524] Bluetooth: hci0: RTL: rom_version status=0 version=1
[151940.941527] Bluetooth: hci0: RTL: loading rtl_bt/rtl8761b_fw.bin
[151940.941574] Bluetooth: hci0: RTL: loading rtl_bt/rtl8761b_config.bin
[151940.941598] Bluetooth: hci0: RTL: cfg_sz 25, total sz 20237
[151941.051664] Bluetooth: hci0: RTL: fw version 0xd89964cd

Fehlerbehebung

In meiner Umgebung (Linux 5.9.1) erkennt der Kernel den Dongle, aber Bluetoothctl erkennt den Dongle überhaupt nicht. Selbst auf dem GNOME-Einstellungsbildschirm wird angezeigt, dass der Bluetooth-Dongle nicht verbunden ist. Betrachtet man den Kommunikationsinhalt mit btmon, so scheint es, dass die Kommunikation selbst ohne Probleme erfolgt, aber ein solcher Fehler tritt auf.

< HCI Command: LE Set Resolvable P.. (0x08|0x002e) plen 2  #235 [hci0] 8.037958
        Timeout: 900 seconds
> HCI Event: Command Complete (0x0e) plen 4                #236 [hci0] 8.038849
      LE Set Resolvable Private Address Timeout (0x08|0x002e) ncmd 2
        Status: Unsupported Remote Feature / Unsupported LMP Feature (0x1a)
= Close Index: XX:XX:XX:XX:XX:XX                                [hci0] 8.038893

Es scheint, dass er wütend ist, wenn er einen nicht unterstützten Befehl namens LE Set Resolvable Private Address Timeout ausgibt. Die zu diesem Zeitpunkt bestätigte Bluetooth-Version war 5.1.

< HCI Command: Read Local Version In.. (0x04|0x0001) plen 0  #1 [hci0] 7.862404
> HCI Event: Command Complete (0x0e) plen 12                 #2 [hci0] 7.863819
      Read Local Version Information (0x04|0x0001) ncmd 2
        Status: Success (0x00)
        HCI version: Bluetooth 5.1 (0x0a) - Revision 11 (0x000b)
        LMP version: Bluetooth 5.1 (0x0a) - Subversion 34657 (0x8761)
        Manufacturer: Realtek Semiconductor Corporation (93)

Im Commit-Protokoll des Kernels erscheint dieses Commit verdächtig.

Bluetooth: Enable RPA Timeout Enable RPA timeout during bluetooth initialization. The RPA timeout value is used from hdev, which initialized from debug_fs

Da der Code in Linux 5.9 hinzugefügt wurde, hat dieser Dongle in früheren Kerneln möglicherweise einwandfrei funktioniert. Es ist ein Code, der nichts anderes zu beeinflussen scheint, also werde ich ihn vollständig löschen.

rtl8761b.patch


diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index c8e67042a3b1..74740a103c6f 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -1649,8 +1649,6 @@ struct hci_rp_le_read_resolv_list_size {
 
 #define HCI_OP_LE_SET_ADDR_RESOLV_ENABLE 0x202d
 
-#define HCI_OP_LE_SET_RPA_TIMEOUT	0x202e
-
 #define HCI_OP_LE_READ_MAX_DATA_LEN	0x202f
 struct hci_rp_le_read_max_data_len {
 	__u8	status;
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 502552d6e9af..e0872ba36aa1 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -763,14 +763,6 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
 			hci_req_add(req, HCI_OP_LE_CLEAR_RESOLV_LIST, 0, NULL);
 		}
 
-		if (hdev->commands[35] & 0x40) {
-			__le16 rpa_timeout = cpu_to_le16(hdev->rpa_timeout);
-
-			/* Set RPA timeout */
-			hci_req_add(req, HCI_OP_LE_SET_RPA_TIMEOUT, 2,
-				    &rpa_timeout);
-		}
-
 		if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
 			/* Read LE Maximum Data Length */
 			hci_req_add(req, HCI_OP_LE_READ_MAX_DATA_LEN, 0, NULL);

Als ich den Kernel neu erstellte und neu startete, leuchtete der Dongle, der noch nie zuvor geleuchtet hatte, blau und wurde von Bluetoothctl korrekt als Controller erkannt.

Als die Initialisierung abgeschlossen war, war die Version aus irgendeinem Grund auf Bluetooth 5.0 heruntergefahren.

< HCI Command: Read Loc.. (0x04|0x0001) plen 0  #98 [hci0] 3.818177
> HCI Event: Command Complete (0x0e) plen 12    #99 [hci0] 3.818995
      Read Local Version Information (0x04|0x0001) ncmd 2
        Status: Success (0x00)
        HCI version: Bluetooth 5.0 (0x09) - Revision 55449 (0xd899)
        LMP version: Bluetooth 5.0 (0x09) - Subversion 25805 (0x64cd)
        Manufacturer: Realtek Semiconductor Corporation (93)

Wenn Sie die Firmware anwenden, wird die Bluetooth-Version anscheinend von 5.1 auf 5.0 herabgestuft. (Re: [PATCH v2 1/1] Bluetooth: btrtl: Unterstützung für RTL8761B --Marcel Holtmann hinzufügen)

Impressionen habe ich ausprobiert

Ich habe es mit meinem Bluetooth-Gerät wie Maus, Tastatur, AirPods, iPhone, Google Home versucht und alle wurden erfolgreich gekoppelt. Wenn ich Musik auf AirPods abspiele, wird der Ton mit einer angemessenen Frequenz unterbrochen. Wenn Sie das umgebende Bluetooth-Gerät scannen oder den Akkuladestand des Geräts während der Musikwiedergabe überprüfen, hören Sie die Musik überhaupt nicht. Trotzdem wurde die Verbindung selbst nicht unterbrochen und die gleichzeitig verbundene Maus und Tastatur konnten stabil verwendet werden. Der Eindruck ist, dass die Stabilität höher als beim Qualcomm (CSR) -Chip und niedriger als beim Broadcom-Chip ist. Wenn der Sound jedoch unterbrochen wird, scheint das gesamte Betriebssystem einzufrieren, sodass es sich möglicherweise nicht um ein Chipsatzproblem, sondern um ein Treiberproblem handelt.

Recommended Posts

Realtek RTL8761B Günstiger Bluetooth 5.0 USB Dongle läuft unter Linux