Faisons-nous des amis RaspberryPi avec TP-Link TL-WN727N

Hé Habr !

Un jour, j'ai décidé de connecter ma framboise à Internet par liaison radio.

Aussitôt dit, aussitôt fait, j'ai acheté à cet effet un sifflet Wi-Fi USB de la célèbre société TP-Link dans le magasin le plus proche. Je dirai tout de suite qu'il ne s'agit pas d'une sorte de module nano USB, mais d'un appareil assez volumineux, de la taille d'une clé USB ordinaire (ou, si vous préférez, de la taille de l'index d'un homme adulte). Avant d'acheter, j'ai fait une petite recherche sur la liste des fabricants de sifflets pris en charge pour RPI et TP-Link figurait sur la liste (cependant, comme il s'est avéré plus tard, je n'ai pas pris en compte les subtilités, car le diable, comme nous le savons , est dans les détails). Ainsi commence le récit froid de mes mésaventures, nous présentons à votre attention un roman policier en 3 parties. Pour ceux que cela intéresse, merci de vous référer au chat.

Статья Connexion de l'adaptateur WiFi WN727N à Ubuntu/Mint Cela m'a aidé en partie, mais avant tout.

Conditions du problème

donné:

  1. ordinateur monocarte Raspberry Pi 2 B v1.1 – 1 pièce
  2. sifflet wi-fi usb WN727N - 1 pièce
  3. une paire de mains pas tout à fait tordues - 2 pièces
  4. Le dernier Raspbian est installé comme système d'exploitation (basé sur Debian 10 Buster)
  5. version du noyau 4.19.73-v7+

Rechercher : connectez-vous à Internet (le Wi-Fi est distribué depuis votre routeur domestique)

Après avoir déballé l'adaptateur, j'ai lu les instructions à l'intérieur :

Compatibilité du système : Windows 10/8/7/XP (même le ciel, même XP) et MacOS 10.9-10.13

Hmm, comme d'habitude, pas un mot sur Linux. Nous étions en 2k19, et les pilotes devaient encore être assemblés manuellement...

Nous avions avec nous 2 compilateurs, 75 XNUMX bibliothèques, cinq blobs binaires, un demi-tableau de femmes nues avec un logo et toute une mer d'en-têtes de tous les langages et balises. Non pas que ce soit un ensemble nécessaire pour le travail. Mais une fois que vous commencez à assembler un système pour vous-même, il devient difficile de s'arrêter. La seule chose qui m'a inquiété, ce sont les pilotes pour le Wi-Fi. Il n’y a rien de plus impuissant, irresponsable et corrompu que de créer des pilotes à partir des sources. Mais je savais que tôt ou tard nous basculerions dans ces conneries.

En général, comme vous le savez, jouer avec le Wi-Fi USB sous Linux est douloureux et quelque peu insipide (comme les sushis russes).

La boîte contient également un CD avec les pilotes. Sans grand espoir, je regarde ce qu’il y a dessus – ils n’en ont définitivement pas pris soin. Une recherche sur Internet m'a amené sur le site Web du fabricant, mais il existe un pilote Linux uniquement pour la révision du périphérique. v4, et dans mes bras il y avait v5.21. Et en plus, pour les très anciennes versions du noyau 2.6-3.16. Découragé par l'échec du tout début, je pensais déjà que j'aurais dû prendre le TL-WN727N (il est un peu plus cher et peut gérer 300 Mbps contre 150 pour le mien, mais il s'est avéré que cela n'a pas d'importance du tout pour la framboise, cela sera écrit plus tard). Mais le plus important est que les pilotes correspondants existent déjà et sont simplement installés sous forme de package. firmware-ralink. Vous pouvez généralement afficher la révision de l'appareil sur le corps de l'appareil sur un autocollant à côté du numéro de série.

La poursuite de la recherche sur Google et la visite de divers forums n'ont pas apporté grand-chose. Apparemment, personne avant moi n'a essayé de connecter un tel adaptateur à Linux. Hmm, j'ai autant de chance qu'un noyé.

Bien que non, je mens, la visite de forums (principalement en anglais) a également porté ses fruits : dans certains sujets, il était fait mention d'un certain M. lwfinger, célèbre pour avoir écrit un certain nombre de pilotes pour les adaptateurs Wi-Fi. . Son dépôt git se trouve à la fin de l'article dans les liens. Et la deuxième leçon que j'ai apprise est que vous devez identifier votre appareil afin de comprendre quel pilote peut lui convenir.

Partie 1 : L'identité Bourne

Bien entendu, lorsque l’appareil était branché sur le port, aucune LED ne s’allumait. Et en général, il n’est pas clair si quelque chose fonctionne ou non.

Tout d'abord, pour savoir si le noyau voit notre périphérique, je regarde dans dmesg :

[  965.606998] usb 1-1.3: new high-speed USB device number 9 using dwc_otg
[  965.738195] usb 1-1.3: New USB device found, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  965.738231] usb 1-1.3: Product: 802.11n NIC
[  965.738243] usb 1-1.3: Manufacturer: Realtek
[  965.738255] usb 1-1.3: SerialNumber: 00E04C0001

Il s'est avéré qu'il voit, et il est même clair qu'il y a une puce Realtek et le VID/PID de l'appareil lui-même sur le bus USB.

Allons plus loin et regardons lsusb, et ici un autre échec nous attend

Bus 001 Device 008: ID 2357:0111 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Le système ne sait pas de quel type d'appareil il s'agit et affiche timidement un espace vide au lieu du nom (bien que supplier=2357 soit définitivement TP-Link).

A ce stade, le lecteur curieux a probablement déjà remarqué quelque chose d'intéressant, mais nous le laisserons à notre époque.

La recherche sur le problème des noms vides m'a conduit à un site avec des identifiants, où sont saisies les informations sur les VID/PID connus. Notre 2357:0111 n'était pas là. Comme il s'est avéré plus tard, l'utilitaire lsusb utilise un fichier /usr/share/misc/usb.ids, qui est la même liste d'identifiants de ce site. Pour la beauté de l'affichage, j'ai simplement ajouté des lignes pour le fournisseur TP-Link dans mon système.

2357  TP-Link
        0111  TL-WN727N v5.21

Eh bien, nous avons corrigé l'affichage dans la liste des appareils, mais cela ne nous a pas rapproché du choix d'un pilote. Pour sélectionner un pilote, vous devez savoir sur quelle puce est fabriqué votre sifflet. Les tentatives infructueuses suivantes pour le découvrir sur Internet n'ont abouti à rien de bon. Armé d'un fin tournevis plat, j'enlève soigneusement le capuchon de l'adaptateur et l'idée vicieuse de l'oncle Liao apparaît dans toute sa nudité immaculée. Sous une loupe, vous pouvez voir le nom de la puce - RTL8188EUS. C'est déjà bien. Sur certains forums, j'ai vu des messages selon lesquels le pilote de ce même monsieur lwfinger était bien adapté à cette puce (même s'il n'écrit que sur le RTL8188EU).

Partie 2 : La suprématie de Bourne

Je télécharge les sources des pilotes depuis Git.

Il est temps de réinstaller Windows et de faire ce à quoi les utilisateurs de Linux sont habituellement associés : assembler quelque chose de différentes sortes. Il s'avère que l'assemblage de pilotes diffère peu de la compilation de programmes :

make
sudo make install

mais pour compiler les modules du noyau, nous avons besoin des fichiers d'en-tête du noyau pour notre version spécifique.

Il y a un package dans le référentiel stock en-têtes-de-noyau-raspberrypi, mais il contient la version noyau des fichiers 4.19.66-v7l+, et cela ne nous convient pas. Mais il s'est avéré qu'il existe un outil pratique pour obtenir les en-têtes de la version requise. rpi-source (lien à la fin sur Github), avec lequel vous pourrez télécharger les en-têtes nécessaires. Nous clonons le référentiel, rendons le script exécutable et l'exécutons. Le premier lancement échoue avec une erreur - il n'y a aucun utilitaire bc. Heureusement, il est dans le référentiel et nous l'installons simplement.

sudo apt-get install bc

Après cela, redémarrer et télécharger les en-têtes (puis configurer quelque chose, je ne m'en souviens plus maintenant) prend un certain temps et vous pouvez vous asseoir sur votre chaise, Windows s'est amélioré dans toutes ses manifestations.

Une fois tous les en-têtes téléchargés, vérifiez que le répertoire apparaît /lib/modules/4.19.73-v7+ et dedans le lien symbolique pointe vers l'endroit où se trouvent les fichiers téléchargés (pour moi c'est /home/pi/linux) :

pi@raspberrypi:/home/pi/rtl8188eu# ls -l /lib/modules/4.19.73-v7+/
lrwxrwxrwx  1 root root     14 Sep 24 22:44 build -> /home/pi/linux

La phase préparatoire est terminée, vous pouvez commencer le montage. Réassembler les modules prend un certain temps, le Raspberry n'est pas une bête rapide (il possède un Cortex ARM v32 900 bits 7Mhz).
Donc tout a été compilé. Nous installons le pilote dans la 2ème étape (make install), tout en copiant également davantage de fichiers de firmware nécessaires au fonctionnement du pilote :

install:
        install -p -m 644 8188eu.ko  $(MODDESTDIR)
        @if [ -a /lib/modules/$(KVER)/kernel/drivers/staging/rtl8188eu/r8188eu.ko ] ; then modprobe -r r8188eu; fi;
        @echo "blacklist r8188eu" > /etc/modprobe.d/50-8188eu.conf
        cp rtl8188eufw.bin /lib/firmware/.
        /sbin/depmod -a ${KVER}
        mkdir -p /lib/firmware/rtlwifi
        cp rtl8188eufw.bin /lib/firmware/rtlwifi/.

Partie 3. L'ultimatum de Bourne

Je branche le sifflet sur le port et... rien ne se passe. Etait-ce pour rien ?

Je commence à étudier les fichiers à l'intérieur du projet et dans l'un d'eux je trouve quel était le problème : le pilote spécifie une liste complète des identifiants VID/PID qu'il peut servir. Et pour que notre appareil fonctionne avec ce pilote, j'ai simplement ajouté mon identifiant au fichier rtl8188eu/os_dep/usb_intf.c

static struct usb_device_id rtw_usb_id_tbl[] = {
        /*=== Realtek demoboard ===*/
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
        /*=== Customer ID ===*/
        /****** 8188EUS ********/
        {USB_DEVICE(0x07B8, 0x8179)}, /* Abocom - Abocom */
        {USB_DEVICE(0x0DF6, 0x0076)}, /* Sitecom N150 v2 */
        {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
        {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
        {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
        {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */
        {USB_DEVICE(0x056E, 0x4008)}, /* Elecom WDC-150SU2M */
        {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
        {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */
        {}      /* Terminating entry */
};

J'ai recompilé le pilote et l'ai réinstallé sur le système.

Et cette fois, tout a commencé. Le voyant de l'adaptateur s'est allumé et un nouveau périphérique est apparu dans la liste des interfaces réseau.

L'affichage des interfaces sans fil affiche les éléments suivants :

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     unassociated  ESSID:""  Nickname:"<WIFI@REALTEK>"
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Bonus pour ceux qui lisent jusqu'au bout

Rappelez-vous comment j'ai dit que la vitesse maximale indiquée sur votre adaptateur n'avait pas d'importance ?
Ainsi, sur Malinka (avant la sortie du modèle 4), tous les appareils (y compris l'adaptateur Ethernet) reposent sur le même bus USB. Super, non ? Et donc la bande passante du bus USB est répartie entre tous les appareils qui s'y trouvent. Lors de la mesure de la vitesse à la fois via Ethernet et via Wi-Fi USB (connecté à 1 routeur) à la fois par voie aérienne et par fil, elle était d'environ 20 Mbit/s.

PS En général, ce guide pour compiler un pilote pour cet adaptateur particulier n'est pas valable uniquement pour RPI. Je l'ai ensuite répété sur mon bureau avec Linux Mint - là aussi, tout fonctionnait. Il vous suffit de télécharger les fichiers d'en-tête nécessaires pour votre version du noyau de la même manière.

MISE À JOUR. Des personnes compétentes ont suggéré : afin de ne pas dépendre de la version du noyau, vous devez collecter et installer les pilotes à l'aide de dkms. Le fichier Lisez-moi du pilote contient également cette option.

pi@raspberrypi:/home/pi# sudo dkms add ./rtl8188eu
pi@raspberrypi:/home/pi# sudo dkms build 8188eu/1.0
pi@raspberrypi:/home/pi# sudo dkms install 8188eu/1.0

UPD2. Proposé patch L'identifiant de l'appareil a été accepté dans la branche principale du référentiel lwfinger/rtl8188eu.

références
- Adaptateurs Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-source

Source: habr.com