Raspberry Pi und TP-Link TL-WN727N zusammenbringen

Hallo, Habr!

Ich hatte die Idee, meinen Raspberry Pi kabellos mit dem Internet zu verbinden.

Gesagt, getan. DafĂŒr habe ich im nĂ€chstgelegenen GeschĂ€ft einen USB-Wi-Fi-Adapter der bekannten Marke TP-Link gekauft. Ich möchte gleich sagen, dass dies kein Nano-USB-Modul ist, sondern ein durchaus handlicher GerĂ€t, ungefĂ€hr in der GrĂ¶ĂŸe eines normalen USB-Sticks (oder, wenn es Ihnen lieber ist, etwa so groß wie der Zeigefinger eines erwachsenen Mannes). Vor dem Kauf habe ich ein wenig die Liste der unterstĂŒtzten Adapter fĂŒr den Raspberry Pi studiert, und TP-Link stand in dieser Liste (wie sich spĂ€ter herausstellte, habe ich jedoch einige Details ĂŒbersehen, denn, wie bekannt ist, liegt der Teufel im Detail). Nun, die frostige ErzĂ€hlung meiner Missgeschicke beginnt. Ihnen wird eine Detektivgeschichte in drei Teilen prĂ€sentiert. Interessierte bitte unter den Cut.

Ein Artikel Wi-Fi-Adapter WN727N mit Ubuntu/Mint verbinden hatte mir teilweise geholfen, aber alles der Reihe nach.

Aufgabenstellung

Gegeben:

  1. Einplatinencomputer Raspberry Pi 2 B v1.1 — 1 StĂŒck
  2. USB-Wi-Fi-Adapter WN727N — 1 StĂŒck
  3. ein Paar nicht ganz schiefer HĂ€nde — 2 StĂŒck
  4. als Betriebssystem ist das neueste Raspbian (auf Basis von Debian 10 Buster) installiert
  5. Kernel Version 4.19.73-v7+

Ziel: Eine Verbindung zum Internet herstellen (WLAN von dem heimischen Router)

Nach dem Auspacken des Adapters lese ich die Anleitung im Inneren:

SystemkompatibilitÀt: Windows 10/8/7/XP (sogar XP) und MacOS 10.9-10.13

Tja, ĂŒber Linux steht wie ĂŒblich kein Wort. Es war 2019, und die Treiber mussten immer noch manuell zusammengestellt werden...

Wir hatten zwei Compiler, 75.000 Bibliotheken, fĂŒnf binĂ€re Blobs, ein halbes Array nackter Frauen mit Logo und ein ganzes Meer von Headern in allen Sprachen und Markup dabei. Nicht dass das der notwendige Satz fĂŒr die Arbeit war. Aber wenn man einmal anfĂ€ngt, ein System fĂŒr sich selbst zusammenzustellen, wird es schwer zu stoppen. Das Einzige, was mich besorgt hat, waren die Treiber fĂŒr Wi-Fi. Nichts ist hilfloser, unverantwortlicher und fehleranfĂ€lliger als das Zusammenstellen von Treibern aus dem Quellcode. Aber ich wusste, dass wir frĂŒher oder spĂ€ter auch diese Plage ĂŒberstehen wĂŒrden.

Wie bekannt, ist das Herumspielen mit USB-Wi-Fi unter Linux schmerzhaft und etwas unangenehm (wie russisches Sushi).

In der Verpackung liegt außerdem eine CD mit Treibern. Ohne große Hoffnung schaue ich, was darauf ist - natĂŒrlich, sie haben sich nicht darum gekĂŒmmert. Eine Suche im Internet fĂŒhrte mich zur Website des Herstellers, aber dort gibt es den Linux-Treiber nur fĂŒr die GerĂ€terevision v4, und ich hatte in den HĂ€nden v5.21. Außerdem ist es fĂŒr sehr alte Kernelversionen 2.6-3.16 geeignet. Entmutigt durch den Misserfolg gleich zu Beginn dachte ich, ich hĂ€tte besser den TL-WN727N nehmen sollen (er ist etwas teurer und kann 300 Mbps im Vergleich zu 150 Mbps meines, aber das hat sich als irrelevant fĂŒr den Raspberry herausgestellt, dazu mehr spĂ€ter). Das Wichtigste ist, dass die Treiber dafĂŒr bereits vorhanden sind und einfach ĂŒber ein Paket installiert werden können. firmware-ralink. Die Revision des GerĂ€ts kann normalerweise auf dem GehĂ€use auf einem Aufkleber neben der Seriennummer gefunden werden.

Weitere Recherchen und Besuche in verschiedenen Foren haben nicht viel Gutes gebracht. Offensichtlich hat vor mir niemand versucht, genau diesen Adapter unter Linux zu betreiben. Tja, ich hab's schwer wie ein Ertrunkener.

Aber nein, ich lĂŒge, die Besuche in Foren (hauptsĂ€chlich englischsprachigen) haben auch einige FrĂŒchte getragen. In einigen BeitrĂ€gen wurde ein Herr lwfinger erwĂ€hnt, der dafĂŒr bekannt ist, eine Anzahl von Treibern fĂŒr WLAN-Adapter geschrieben zu haben. Sein Git-Repository ist am Ende des Artikels in den Links zu finden. Und die zweite Lektion, die ich gelernt habe, ist, dass ich mein GerĂ€t identifizieren muss, um herauszufinden, welcher Treiber dafĂŒr geeignet sein könnte.

Teil 1. Identifikation des Borna

Beim Anschließen des GerĂ€ts an den Port leuchtet natĂŒrlich keine LED auf. Es ist ĂŒberhaupt nicht klar, ob es funktioniert oder nicht.

Um herauszufinden, ob das System unser GerÀt erkennt, schaue ich zuerst in dmesg:

[  965.606998] usb 1-1.3: neues Hochgeschwindigkeits-USB-GerÀt Nummer 9 mit dwc_otg
[  965.738195] usb 1-1.3: Neues USB-GerÀt gefunden, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Neue USB-GerÀtetexte: Mfr=1, Produkt=2, Seriennummer=3
[  965.738231] usb 1-1.3: Produkt: 802.11n NIC
[  965.738243] usb 1-1.3: Hersteller: Realtek
[  965.738255] usb 1-1.3: Seriennummer: 00E04C0001

Es stellte sich heraus, dass es erkannt wird, und es ist auch klar, dass der Chip Realtek ist, zusammen mit VID/PID des GerÀts an der USB-Leitung.

Fahren wir fort und sehen uns an, lsusb, und hier erwartet uns ein weiteres Missgeschick.

Bus 001 GerÀt 008: ID 2357:0111 
Bus 001 GerÀt 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 GerÀt 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 GerÀt 001: ID 1d6b:0002 Linux Foundation 2.0 Root-Hub

Das System weiß nicht, um welches GerĂ€t es sich handelt, und zeigt schĂŒchtern einen leeren Platz statt eines Namens an (obwohl vendor=2357 sicher TP-Link ist).

An diesem Punkt hat der neugierige Leser wahrscheinlich bereits etwas Interessantes bemerkt, aber wir werden das auf spÀter verschieben.

Die Untersuchung des Problems mit leeren Namen fĂŒhrte mich zu einer Seite mit IDs, auf der Informationen zu bekannten VID/PID eingetragen werden. Unser 2357:0111 war dort nicht zu finden. Wie sich spĂ€ter herausstellte, verwendet das Utility lsusb eine Datei /usr/share/misc/usb.ids, die dieselbe Liste von IDs von dieser Seite enthĂ€lt. Zur besseren Darstellung habe ich einfach die Zeilen fĂŒr den Hersteller TP-Link in mein System eingefĂŒgt.

2357  TP-Link
        0111  TL-WN727N v5.21

Nun haben wir die Darstellung in der GerĂ€teliste korrigiert, aber das hat uns hinsichtlich der Treiberwahl nicht wirklich weitergebracht. Um den richtigen Treiber auszuwĂ€hlen, muss man wissen, auf welchem Chip Ihr Adapter basiert. Weitere erfolglose Versuche, dies im Internet herauszufinden, fĂŒhrten zu nichts Gutem. Bewaffnet mit einem feinen Schlitzschraubendreher hebe ich vorsichtig die Abdeckung des Adapters an und vor mir entfaltet sich in all seiner ursprĂŒnglichen Nacktheit das fehlerhafte Kind von Onkel Liao. Unter der Lupe lĂ€sst sich der Name des Chips erkennen — RTL8188EUS. Das ist schon mal ein Fortschritt. In einigen Foren habe ich BeitrĂ€ge gesehen, dass der Treiber dieses Herrn lwfinger gut fĂŒr diesen Chip geeignet ist (auch wenn nur fĂŒr den RTL8188EU geschrieben steht).

Teil 2. Die Überlegenheit von Born

Ich lade die Quellcodes des Treibers aus Git herunter.

Es ist an der Zeit, Windows neu zu installieren und sich mit dem zu beschĂ€ftigen, was normalerweise mit Linux-Nutzern in Verbindung gebracht wird – dem Kompilieren von etwas aus Quellcode. Das Kompilieren von Treibern ist, wie sich herausstellt, wenig anders als das Kompilieren von Programmen:

make
sudo make install

aber fĂŒr die Kompilierung von Kernelmodulen benötigen wir die Header-Dateien des Kernels fĂŒr unsere spezifische Version.

Im Standard-Repository gibt es ein Paket raspberrypi-kernel-headers, aber es enthĂ€lt die Version der Dateien fĂŒr den Kernel 4.19.66-v7l+, und das passt uns nicht. Aber um die Header der benötigten Version zu erhalten, gibt es, wie sich herausstellt, ein praktisches Tool rpi-source (Link am Ende auf GitHub), mit dem man die benötigten Header herunterladen kann. Wir klonen das Repository, machen das Skript ausfĂŒhrbar und starten es. Der erste Start schlĂ€gt mit einem Fehler fehl – die Utility fehlt. bcGlĂŒcklicherweise ist sie im Repository und wir installieren sie einfach.

sudo apt-get install bc

Nach dieser Installation benötigt der erneute Start und das Herunterladen der Header (und dann die Einrichtung von etwas, daran erinnere ich mich jetzt nicht) einige Zeit, und man kann sich zurĂŒcklehnen; Windows hat sich in allen seinen Facetten verbessert.

Nachdem alle Header heruntergeladen wurden, ĂŒberprĂŒfen wir, ob das Verzeichnis erschienen ist. /lib/modules/4.19.73-v7+ und darin zeigt der Symlink auf den Ort, an dem die heruntergeladenen Dateien liegen (bei mir ist das /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, nun kann mit dem Kompilieren begonnen werden. Das Kompilieren der Module dauert wieder etwas Zeit, der Raspberry Pi ist kein schnelles Tier (er hat einen 32-Bit 900MHz Cortex ARM v7 Prozessor).
So, alles wurde kompiliert. Wir installieren den Treiber in Schritt 2 (make install), dabei werden auch weitere Firmware-Dateien kopiert, die fĂŒr den Betrieb 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. Ultimatum von Bourne

Ich stecke den USB-Dongle in den Port und
 es passiert nichts. War das alles umsonst?

Ich beginne, die Dateien im Projekt zu durchsuchen und finde in einer von ihnen die Ursache des Problems: Der Treiber gibt eine vollstĂ€ndige Liste der VID/PID-Identifikatoren an, die er bedienen kann. Damit unser GerĂ€t mit diesem Treiber funktioniert, habe ich einfach meine ID in die 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 */
        /*=== Kunden-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 */
        {}      /* Abschluss Eintrag */
};

Ich habe den Treiber neu kompiliert und im System erneut installiert.

Und dieses Mal hat alles geklappt. Die Lampe am Adapter ist angegangen und im Netzwerkinterface steht ein neues GerÀt.

Die Anzeige der drahtlosen Schnittstellen zeigt Folgendes an:

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0      keine drahtlosen Erweiterungen.

lo        keine drahtlosen Erweiterungen.

wlan0     nicht zugeordnet  ESSID:""  Nickname:""
          Modus:Automatisch  Frequenz=2,412 GHz  Zugangspunkt: Nicht zugeordnet   
          Empfindlichkeit:0/0  
          Wiederholung:aus   RTS-Schwelle:aus   Fragment-Schwelle:aus
          VerschlĂŒsselungsschlĂŒssel:aus
          Energiemanagement:aus
          Link-QualitÀt=0/100  SignalstÀrke=0 dBm  GerÀuschpegel=0 dBm
          Rx ungĂŒltige nwid:0  Rx ungĂŒltige crypt:0  Rx ungĂŒltige frag:0
          Tx ĂŒbermĂ€ĂŸige Wiederholungen:0  UngĂŒltig vermischt:0   Verpasste Beacon:0

Bonus fĂŒr diejenigen, die bis zum Ende gelesen haben

Erinnern Sie sich, wie ich gesagt habe, dass die angegebene maximale Geschwindigkeit Ihres Adapters nicht wichtig ist?
Nun, bei der Raspberry Pi (bis zur Version 4) sitzen alle GerĂ€te (einschließlich des Ethernet-Adapters) an einem einzigen USB-Bus. Ziemlich beeindruckend, oder? Deshalb wird die Bandbreite des USB-Bus zwischen allen GerĂ€ten aufgeteilt. Bei der Geschwindigkeitsermittlung sowohl ĂŒber Ethernet als auch ĂŒber USB-Wi-Fi (verbunden mit einem Router) und in der Luft sowie ĂŒber Kabel betrug die Geschwindigkeit etwa 20 Mbit/s.

P.S. Dieser Leitfaden zur Kompilierung des Treibers fĂŒr diesen spezifischen Adapter gilt nicht nur fĂŒr RPI. Ich habe es spĂ€ter auch auf meinem Desktop mit Linux Mint wiederholt — dort hat es ebenfalls funktioniert. Sie mĂŒssen lediglich die erforderlichen Header-Dateien fĂŒr Ihre verwendete Kernel-Version herunterladen.

UPD. Fachkundige Personen haben mir gesagt: Um nicht von der Kernel-Version abhÀngig zu sein, sollten Sie Treiber mit DKMS erstellen und installieren. Diese Option finden Sie auch im Readme des Treibers.

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. Der vorgeschlagene Patch Device-ID wurde in den Mainstream-Zweig des lwfinger/rtl8188eu-Repositorys aufgenommen.

Links
— RPi USB-Wi-Fi-Adapter
— GitHub lwfinger/rtl8188eu
— usb.ids
— rpi-source

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster