Realtek RTL8761B Dongle USB Bluetooth 5.0 bon marché fonctionne sous Linux

J'ai acheté un mystérieux dongle Bluetooth chinois avec "BT 5.0" sur Amazon. C'était environ 800-1000 yens sur Amazon, mais il semble que vous puissiez obtenir quelque chose de similaire sur AliExpress pour environ 200 yens. Cela fonctionnera-t-il vraiment? Ce dongle utilise la puce RTL8761B de Realtek, qui est compatible avec Linux 5.8 et versions ultérieures. Cependant, les principales distributions ne contiennent pas encore le micrologiciel nécessaire pour les exécuter, vous devrez donc extraire le micrologiciel de quelque part et l'installer.

** Journal des modifications **

--2020 / 10/27 Correction de l'article car il était associé à Google Home et aux AirPods.

Paramètres du noyau

Depuis sudo make menuconfig, allez dans Support de mise en réseau-> Prise en charge du sous-système Bluetooth-> Pilotes de périphériques Bluetooth

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

ça ira. Le pilote USB HCI doit être construit en tant que module. Si vous l'installez sans le construire en tant que module, le micrologiciel peut ne pas être chargé.

.config


CONFIG_BT_HCIBTUSB=m
CONFIG_BT_RTL=m
CONFIG_BT_HCIBTUSB_RTL=y

Installation du micrologiciel

Micrologiciel d'un pilote de dongle appelé Mpow's BH456A qui utilise le même RTL8761B Extrait. Le firmware inclus dans la version Linux était bogué et certains appareils n'ont pas pu être jumelés, donc j'utiliserai la version Windows à l'exception de certains fichiers.

$ 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

Maintenant, lorsque vous branchez le dongle, le noyau doit charger le micrologiciel et le reconnaître correctement.

[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

dépannage

Cependant, dans mon environnement (Linux 5.9.1), le noyau reconnaît le dongle, mais bluetoothctl ne reconnaît pas du tout le dongle. Même sur l'écran de réglage GNOME, il est affiché que le dongle Bluetooth n'est pas connecté. En regardant le contenu de la communication avec btmon, il semble que la communication elle-même se fasse sans problème, mais une telle erreur apparaît.

< 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

Il semble qu'il soit en colère en émettant une commande non prise en charge appelée LE Set Resolvable Private Address Timeout. La version de Bluetooth confirmée à ce moment était la 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)

Lorsque je vérifie le journal de validation du noyau, ce commit semble suspect.

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

Depuis que le code a été ajouté dans Linux 5.9, ce dongle a peut-être bien fonctionné dans les noyaux précédents. C'est un code qui ne semble rien affecter d'autre, donc je vais le supprimer entièrement.

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

Quand j'ai reconstruit le noyau et l'ai redémarré, le dongle, qui n'avait jamais brillé auparavant, a brillé en bleu et a été correctement reconnu comme contrôleur par bluetoothctl.

Une fois l'initialisation terminée, la version était réduite à Bluetooth 5.0 pour une raison quelconque.

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

Apparemment, si vous appliquez le firmware, la version Bluetooth sera rétrogradée de 5.1 à 5.0. (Re: [PATCH v2 1/1] Bluetooth: btrtl: Ajout de la prise en charge de RTL8761B --Marcel Holtmann)

Impressions que j'ai essayé d'utiliser

Je l'ai essayé avec mon appareil Bluetooth tel qu'une souris, un clavier, des AirPods, un iPhone, un Google Home, et tous ont été couplés avec succès. Lorsque je joue de la musique sur des AirPod, le son est interrompu à une fréquence raisonnable. De plus, si vous scannez le périphérique Bluetooth environnant ou vérifiez le niveau de la batterie de l'appareil pendant la lecture de musique, vous n'entendrez pas du tout la musique. Même ainsi, la connexion elle-même n'a pas été interrompue et la souris et le clavier connectés en même temps pouvaient être utilisés de manière stable. L'impression est que la stabilité est supérieure à celle de la puce Qualcomm (CSR) et inférieure à celle de la puce Broadcom. Cependant, lorsque le son est interrompu, il semble que tout le système d'exploitation se fige, donc ce n'est peut-être pas un problème de chipset mais un problème de pilote.

Recommended Posts

Realtek RTL8761B Dongle USB Bluetooth 5.0 bon marché fonctionne sous Linux