Machen wir Freunde zwischen RaspberryPi und TP-Link TL-WN727N

Hey Habr!

Ich habe einmal beschlossen, mein Raspberry drahtlos mit dem Internet zu verbinden.

Gesagt, getan, zu diesem Zweck habe ich mir im nächstgelegenen Geschäft eine USB-WLAN-Pfeife der bekannten Firma TP-Link gekauft. Ich sage gleich, dass es sich nicht um eine Art Nano-USB-Modul handelt, sondern um ein ziemlich großes Gerät, etwa so groß wie ein normales Flash-Laufwerk (oder, wenn Sie so wollen, so groß wie der Zeigefinger eines erwachsenen Mannes). Vor dem Kauf habe ich ein wenig über die Liste der unterstützten Pfeifenhersteller für RPI recherchiert und TP-Link war auf der Liste (wie sich jedoch später herausstellte, habe ich die Feinheiten nicht berücksichtigt, weil der Teufel, wie wir wissen , steckt im Detail). Damit beginnt die kalte Geschichte meiner Missgeschicke; wir präsentieren Ihnen eine Detektivgeschichte in drei Teilen. Interessenten beachten bitte die Kat.-Nr.

Artikel Verbinden des WLAN-Adapters WN727N mit Ubuntu/Mint Es hat mir teilweise geholfen, aber das Wichtigste zuerst.

Bedingungen des Problems

Mai:

  1. Einplatinencomputer Raspberry Pi 2 B v1.1 – 1 Stück
  2. USB-WLAN-Pfeife WN727N – 1 Stück
  3. ein Paar nicht ganz krumme Hände - 2 Stück
  4. Als Betriebssystem ist das aktuellste Raspbian installiert (basierend auf Debian 10 Buster)
  5. Kernel-Version 4.19.73-v7+

Suchen: Stellen Sie eine Verbindung zum Internet her (WLAN wird von Ihrem Heimrouter aus verteilt)

Nachdem ich den Adapter ausgepackt hatte, las ich die darin enthaltenen Anweisungen:

Systemkompatibilität: Windows 10/8/7/XP (sogar der Himmel, sogar XP) und MacOS 10.9-10.13

Hmm, wie immer kein Wort über Linux. Es war 2k19 und die Treiber mussten noch manuell zusammengebaut werden ...

Wir hatten 2 Compiler, 75 Bibliotheken, fünf binäre Blobs, eine halbe Reihe nackter Frauen mit einem Logo und ein ganzes Meer von Headern aller Sprachen und Markups bei uns. Nicht, dass dies ein notwendiger Satz für den Job wäre. Aber wenn man einmal angefangen hat, ein System für sich selbst zusammenzustellen, wird es schwierig, damit aufzuhören. Das Einzige, was mir Sorgen bereitete, waren die Treiber für WLAN. Es gibt nichts Hilfloseres, Verantwortungsloseres und Korrupteres, als Treiber aus dem Quellcode zu erstellen. Aber ich wusste, dass wir früher oder später auf diesen Quatsch umsteigen würden.

Wie Sie wissen, ist das Herumspielen mit USB-WLAN unter Linux im Allgemeinen schmerzhaft und etwas geschmacklos (wie russisches Sushi).

Die Box enthält außerdem eine CD mit Treibern. Ohne große Hoffnung schaue ich mir an, was darauf steht – sie haben sich definitiv nicht darum gekümmert. Eine Internetsuche brachte mich auf die Website des Herstellers, dort gibt es jedoch nur einen Linux-Treiber zur Geräterevision v4, und in meinen Armen war v5.21. Und außerdem für sehr alte Kernel-Versionen 2.6-3.16. Entmutigt durch den Misserfolg gleich zu Beginn, dachte ich bereits, dass ich den TL-WN727N hätte nehmen sollen (er ist etwas teurer und kann 300 Mbit/s verarbeiten, im Vergleich zu 150 Mbit/s bei mir, aber wie sich herausstellte, spielt das überhaupt keine Rolle für die Himbeere, darüber wird später geschrieben). Aber das Wichtigste ist, dass Treiber dafür bereits vorhanden sind und einfach als Paket installiert werden Firmware-Ralink. Normalerweise können Sie die Geräteversion auf dem Gerätegehäuse auf einem Aufkleber neben der Seriennummer sehen.

Weiteres Googeln und der Besuch verschiedener Foren brachten nicht viel Gutes. Anscheinend hat vor mir noch niemand versucht, einen solchen Adapter an Linux anzuschließen. Hmm, ich habe so viel Glück wie ein Ertrunkener.

Obwohl, nein, ich lüge, auch der Besuch von Foren (hauptsächlich englischsprachige) hat Früchte getragen; in einigen Themen wurde ein gewisser Herr Lwfinger erwähnt, der dafür bekannt ist, eine Reihe von Treibern für Wi-Fi-Adapter zu schreiben . Sein Git-Repository befindet sich am Ende des Artikels in den Links. Und die zweite Lektion, die ich gelernt habe, ist, dass Sie Ihr Gerät identifizieren müssen, um zu verstehen, welcher Treiber dafür geeignet sein könnte.

Teil 1: Die Bourne-Identität

Beim Einstecken des Geräts in den Port leuchtete natürlich keine LED. Und generell ist überhaupt nicht klar, ob etwas funktioniert oder nicht.

Um herauszufinden, ob der Kernel unser Gerät sieht, schaue ich zunächst in dmesg nach:

[  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

Es stellte sich heraus, dass es einen Realtek-Chip und die VID/PID des Geräts selbst auf dem USB-Bus sieht, und es ist sogar klar.

Gehen wir weiter und schauen lsusb, und hier erwartet uns ein weiterer Misserfolg

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

Das System weiß nicht, um welche Art von Gerät es sich handelt, und zeigt verschämt ein Leerzeichen anstelle des Namens an (obwohl „vendor=2357“ definitiv TP-Link ist).

Zu diesem Zeitpunkt ist dem neugierigen Leser wahrscheinlich bereits etwas Interessantes aufgefallen, aber wir belassen es auf unserer Zeit.

Die Recherche zum Problem leerer Namen führte mich zu einer Seite mit Identifikatoren, auf der Informationen zu bekannten VID/PID eingegeben werden. Unser 2357:0111 war nicht da. Wie sich später herausstellte, das Dienstprogramm lsusb verwendet Datei /usr/share/misc/usb.ids, wobei es sich um dieselbe Liste von IDs dieser Site handelt. Der Schönheit halber habe ich einfach Zeilen für den Anbieter TP-Link in mein System eingefügt.

2357  TP-Link
        0111  TL-WN727N v5.21

Nun, wir haben die Anzeige in der Geräteliste korrigiert, aber das hat uns der Treiberauswahl keinen Schritt näher gebracht. Um einen Treiber auszuwählen, müssen Sie wissen, auf welchem ​​Chip Ihre Pfeife hergestellt ist. Die nächsten erfolglosen Versuche, dies im Internet herauszufinden, führten zu nichts Gutem. Mit einem dünnen Schlitzschraubendreher bewaffnet, hebele ich vorsichtig die Adapterkappe ab und Onkel Liaos bösartige Erfindung erscheint in ihrer ganzen makellosen Nacktheit. Unter einer Lupe sieht man den Namen des Chips – RTL8188EUS. Das ist schon gut. In einigen Foren habe ich Beiträge gesehen, dass der Treiber von demselben Herrn Lwfinger gut für diesen Chip geeignet ist (obwohl er nur über RTL8188EU schreibt).

Teil 2: Die Bourne Supremacy

Ich lade die Treiberquellen von Git herunter.

Es ist an der Zeit, Windows neu zu installieren und das zu tun, womit Linux-Benutzer normalerweise in Verbindung gebracht werden: etwas aus irgendeinem Grund zusammenzustellen. Wie sich herausstellt, unterscheidet sich das Zusammenstellen von Treibern kaum vom Kompilieren von Programmen:

make
sudo make install

aber um Kernel-Module zu kompilieren, benötigen wir die Kernel-Header-Dateien für unsere spezifische Version.

Es gibt ein Paket im Lagerbestand raspberrypi-kernel-header, aber es enthält die Kernel-Version der Dateien 4.19.66-v7l+, und das passt nicht zu uns. Wie sich herausstellte, gibt es jedoch ein praktisches Tool, um die Header der erforderlichen Version zu erhalten RPI-Quelle (Link am Ende auf Github), mit dem Sie die notwendigen Header herunterladen können. Wir klonen das Repository, machen das Skript ausführbar und führen es aus. Der erste Start schlägt mit einem Fehler fehl – ​​es gibt kein Dienstprogramm bc. Zum Glück ist es im Repository und wir installieren es einfach.

sudo apt-get install bc

Danach dauert das Neustarten und Herunterladen der Header (und dann das Einrichten von etwas, ich erinnere mich jetzt nicht mehr) einige Zeit und Sie können sich in Ihrem Stuhl zurücklehnen, Windows ist in all seinen Erscheinungsformen besser geworden.

Überprüfen Sie nach dem Herunterladen aller Header, ob das Verzeichnis angezeigt wird /lib/modules/4.19.73-v7+ und darin zeigt der Symlink auf den Ort, an dem sich die heruntergeladenen Dateien befinden (bei mir ist es /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

Die Vorbereitungsphase ist abgeschlossen, Sie können mit der Montage beginnen. Das erneute Zusammenbauen der Module dauert einige Zeit, der Raspberry ist kein schnelles Biest (er verfügt über einen 32bit 900Mhz Cortex ARM v7).
Also alles zusammengestellt. Wir installieren den Treiber im 2. Schritt (make install) und kopieren gleichzeitig weitere Firmware-Dateien, die für die Funktion des Treibers erforderlich sind:

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

Teil 3. Das Bourne-Ultimatum

Ich stecke die Pfeife in den Anschluss und... nichts passiert. War das alles umsonst?

Ich fange an, die Dateien innerhalb des Projekts zu studieren, und in einer davon finde ich heraus, wo das Problem lag: Der Treiber gibt eine vollständige Liste der VID/PID-Kennungen an, die er bedienen kann. Und damit unser Gerät mit diesem Treiber funktioniert, habe ich einfach meine ID zur Datei hinzugefügt 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 */
};

Ich habe den Treiber neu kompiliert und auf dem System neu installiert.

Und dieses Mal begann alles. Das Licht am Adapter leuchtete auf und ein neues Gerät erschien in der Liste der Netzwerkschnittstellen.

Beim Anzeigen der drahtlosen Schnittstellen wird Folgendes angezeigt:

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 für diejenigen, die bis zum Ende lesen

Erinnern Sie sich, wie ich sagte, dass es keine Rolle spielt, welche Höchstgeschwindigkeit auf Ihrem Adapter angegeben ist?
Bei Malinka (vor der Veröffentlichung von Modell 4) sitzen also alle Geräte (einschließlich des Ethernet-Adapters) am selben USB-Bus. Großartig, oder? Und deshalb wird die Bandbreite des USB-Busses auf alle darauf befindlichen Geräte aufgeteilt. Bei der Messung der Geschwindigkeit sowohl über Ethernet als auch über USB-WLAN (verbunden mit 1 Router), sowohl über Luft als auch über Kabel, lag sie bei etwa 20 Mbit/s.

PS: Im Allgemeinen gilt diese Anleitung zum Kompilieren eines Treibers für diesen bestimmten Adapter nicht nur für RPI. Ich habe es dann auf meinem Desktop mit Linux Mint wiederholt – auch dort hat alles funktioniert. Sie müssen lediglich die erforderlichen Header-Dateien für Ihre Kernel-Version auf die gleiche Weise herunterladen.

UPD. Fachleute schlugen vor: Um nicht von der Kernel-Version abhängig zu sein, müssen Sie Treiber mithilfe von dkms sammeln und installieren. Auch die Readme-Datei zum Treiber enthält diese 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. Vorgeschlagen patch für die Geräte-ID wurde in den Mainstream-Zweig des lwfinger/rtl8188eu-Repositorys aufgenommen.

Referenzen
- RPi USB-WLAN-Adapter
- Gitbub lwfinger/rtl8188eu
- usb.ids
- RPI-Quelle

Source: habr.com