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.
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 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
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)
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