Wir verbinden RaspberryPi mit TP-Link TL-WN727N

Hallo, Habra!

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

Gesagt, getan. DafĂŒr wurde in einem nahegelegenen GeschĂ€ft ein USB-Wi-Fi-Stick der bekannten Marke TP-Link gekauft. Ich sage gleich, das ist kein Nano-USB-Modul, sondern ein ganz normales GerĂ€t in der GrĂ¶ĂŸe eines gewöhnlichen USB-Sticks (oder, wenn es Ihnen lieber ist, in der GrĂ¶ĂŸe des Zeigefingers eines erwachsenen Mannes). Vor dem Kauf habe ich ein wenig die Liste der unterstĂŒtzten Stick-Hersteller fĂŒr RPI studiert und TP-Link war auf der Liste (obwohl ich spĂ€ter bemerkte, dass ich die Feinheiten nicht berĂŒcksichtigt hatte, denn der Teufel steckt bekanntlich im Detail). Nun, die kalte Geschichte meiner Abenteuer beginnt. Ihnen wird eine Detektivgeschichte in 3 Teilen prĂ€sentiert. Interessierte sind eingeladen, weiterlesen.

Artikel Wir verbinden den WiFi-Adapter WN727N mit Ubuntu/Mint hatte mir teilweise geholfen, aber der Reihe nach.

Aufgabenbedingungen

Gegeben:

  1. Einplatinencomputer Raspberry Pi 2 B v1.1 – 1 StĂŒck
  2. USB-Wi-Fi-Stick WN727N – 1 StĂŒck
  3. paar nicht ganz krummer HĂ€nde – 2 StĂŒck
  4. als Betriebssystem ist das neueste Raspbian (basierend auf Debian 10 Buster) installiert
  5. Kernel-Version 4.19.73-v7+

Zu finden: eine Verbindung zum Internet herstellen (Wi-Fi wird vom Heimrouter bereitgestellt)

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

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

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


Wir hatten 2 Compiler, 75.000 Bibliotheken, fĂŒnf binĂ€re Blobs, die halbe Menge weiblicher Modelle mit Logo und eine Menge Header in allen Programmiersprachen und Markup. Es war nicht so, als ob dies ein unbedingt erforderliches Set fĂŒr die Arbeit war. Aber wenn man einmal anfĂ€ngt, ein System fĂŒr sich selbst aufzubauen, wird es schwierig, zu stoppen. Einziger Punkt, der mir Sorgen bereitete – die Treiber fĂŒr Wi-Fi. Nichts ist hilfloser, verantwortungsloser und missratener als die Erstellung von Treibern aus dem Quellcode. Aber ich wusste, dass wir frĂŒher oder spĂ€ter auch an diesen Punkt kommen wĂŒrden.

Im Allgemeinen ist wie bekannt das Herumhantieren mit USB-Wi-Fi unter Linux schmerzhaft und etwas unangenehm (wie russische Sushi).

In der Box liegt auch eine CD mit Treibern. Ohne große Hoffnungen schaue ich nach, was darauf ist – genau, sie haben sich nicht gekĂŒmmert. Eine Internetrecherche brachte mich zur Herstellerseite, aber dort gab es den Linux-Treiber nur fĂŒr die GerĂ€terevision v4, und ich hatte in den HĂ€nden v5.21. Und auch fĂŒr sehr alte Kernversionen 2.6-3.16. Entmutigt durch das Scheitern zu Beginn dachte ich schon, dass ich den TL-WN727N hĂ€tte nehmen sollen (er ist etwas teurer und kann 300 Mbps gegenĂŒber 150 bei meinem, aber wie sich herausstellte, hat das fĂŒr die Raspberry Pi ĂŒberhaupt keine Bedeutung, darĂŒber wird spĂ€ter geschrieben). Aber das Wichtigste ist, dass die Treiber dafĂŒr bereits vorhanden sind und einfach als Paket installiert werden. firmware-ralink. Die Revision des GerĂ€ts kann normalerweise auf dem GehĂ€use des GerĂ€ts auf einem Aufkleber neben der Seriennummer abgelesen werden.

Weiteres Googeln und der Besuch verschiedener Foren haben nicht viel Gutes gebracht. Offensichtlich hat vorher niemand versucht, genau diesen Adapter unter Linux anzuschließen. Tja, ich habe GlĂŒck wie ein Ertrinkender.

Obwohl ich lĂŒge, die Besuche von Foren (hauptsĂ€chlich englischsprachigen) haben auch einige FrĂŒchte getragen; in einigen Themen wurde ein gewisser Herr lwfinger erwĂ€hnt, der dafĂŒr bekannt ist, eine Reihe von Treibern fĂŒr WLAN-Adapter geschrieben zu haben. Sein Git-Repository befindet sich am Ende des Artikels in den Links. Und die zweite Lektion, die ich gelernt habe, ist, dass man sein GerĂ€t identifizieren muss, um zu verstehen, welcher Treiber dafĂŒr geeignet sein könnte.

Teil 1. Identifizierung des GerÀts

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

Zuerst schaue ich in dmesg, um herauszufinden, ob der Kernel unser GerÀt erkennt:

[  965.606998] usb 1-1.3: neues Highspeed-USB-GerÀt mit der Nummer 9 verwendet 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 er es erkennt, und es ist sogar klar, dass dort ein Realtek-Chip vorhanden ist und die VID/PID des GerÀts an der USB-Schnittstelle.

Gehen wir weiter, schauen wir uns an lsusb, und hier erwartet uns das nÀchste Missgeschick.

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, was das fĂŒr ein GerĂ€t ist, und zeigt schĂŒchtern einen leeren Platz anstelle des Namens an (obwohl vendor=2357 definitiv TP-Link ist).

An diesem Punkt hat der neugierige Leser wahrscheinlich schon etwas Interessantes bemerkt, aber wir werden das bis zu einem spÀteren Zeitpunkt aufschieben.

Die Untersuchung des Problems mit den leeren Namen fĂŒhrte mich zu einer Website mit Identifikatoren, auf der Informationen zu bekannten VID/PID eingetragen werden. Unser 2357:0111 war dort nicht zu finden. Wie sich spĂ€ter herausstellte, das Dienstprogramm ... lsusb verwendet die Datei /usr/share/misc/usb.ids, die dieselbe Liste von Identifikatoren von dieser Website ist. Zur besseren Anzeige habe ich einfach in meinem System die Zeilen fĂŒr den Anbieter TP-Link hinzugefĂŒgt.

2357  TP-Link
        0111  TL-WN727N v5.21

Nun haben wir die Anzeige in der GerĂ€teliste korrigiert, aber das bringt uns bei der Auswahl des Treibers keinen Schritt weiter. Um den Treiber auszuwĂ€hlen, muss man wissen, auf welchem Chip Ihr Dongle basiert. Wiederholte erfolglose Versuche, dies im Internet herauszufinden, fĂŒhrten zu nichts Gutem. Mit einem feinen Schraubendreher hebe ich vorsichtig die Abdeckung des Adapters an und erblicke in seiner ursprĂŒnglichen Pracht das fehlerhafte Kind von Onkel Lyao. Unter der Lupe lĂ€sst sich die Bezeichnung des Chips erkennen — RTL8188EUS. Das ist schon mal gut. Auf einigen Foren habe ich BeitrĂ€ge gesehen, dass fĂŒr diesen Chip genau der Treiber des Herrn lwfinger gut geeignet ist (auch wenn dort nur ĂŒber RTL8188EU geschrieben steht).

Teil 2. Die Überlegenheit von Born

Ich lade die Quellcodes des Treibers von Git herunter.

Es ist Zeit, Windows neu zu installieren und sich dem zu widmen, was man normalerweise mit Linuxianern assoziiert — dem Zusammenstellen von etwas aus Quellcodes. Die Zusammenstellung von Treibern unterscheidet sich kaum von der Kompilierung 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 das 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 bekommen, gibt es anscheinend 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 — das Dienstprogramm bc. Zum GlĂŒck ist es im Repository und wir installieren es einfach.

sudo apt-get install bc

Nach dieser Installation dauert der erneute Start und das Herunterladen der Header (und dann die Einrichtung von etwas, daran erinnere ich mich jetzt nicht mehr) eine Weile, und man kann sich zurĂŒcklehnen, Windows wird in all ihren Aspekten besser.

Nachdem alle Header heruntergeladen wurden, ĂŒberprĂŒfen wir, ob das Verzeichnis vorhanden ist /lib/modules/4.19.73-v7+ und ob darin ein symbolischer Link auf den Ort zeigt, 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, wir können mit der Montage beginnen. Der Zusammenbau der Module dauert wieder etwas Zeit, der Raspberry Pi ist kein schneller Kerl (er hat einen 32-Bit 900 MHz Cortex ARM v7 Prozessor).
Also, alles wurde kompiliert. Wir installieren den Treiber mit Schritt 2 (make install), dabei werden auch andere Firmware-Dateien kopiert, die fĂŒr den Betrieb des Treibers notwendig 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 Stick in den Anschluss und
 es passiert nichts. War das alles umsonst?

Ich beginne, die Dateien im Projekt zu untersuchen und finde in einer von ihnen das Problem: Im Treiber ist eine vollstĂ€ndige Liste von VID/PID-Identifikatoren angegeben, 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 erneut im System installiert.

Und dieses Mal hat alles funktioniert. Die Lampe am Adapter leuchtet und im Netzwerkinterface-Verzeichnis ist ein neues GerÀt erschienen.

Die ÜberprĂŒfung der drahtlosen Schnittstellen zeigt Folgendes:

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

lo        keine drahtlosen Erweiterungen.

wlan0     unassoziiert  ESSID:""  Nickname:""
          Modus:Auto  Frequenz=2.412 GHz  Zugangspunkt: Nicht assoziiert   
          Empfindlichkeit:0/0  
          Wiederholungsversuch:aus   RTS-Impulse:aus   Fragmentierungs-Impulse: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 VerschlĂŒsselung:0  Rx ungĂŒltige Fragmente:0
          Tx ĂŒbermĂ€ĂŸige Wiederholungsversuche:0  UngĂŒltige MISC:0   Verpasste Beacon:0

Bonus fĂŒr alle, die bis zum Ende mitgelesen haben

Erinnert ihr euch, wie ich gesagt habe, dass es nicht wichtig ist, welche maximale Geschwindigkeit euer Adapter angibt?
Also, auf dem Raspberry Pi (vor der Veröffentlichung des Modells 4) sitzen alle GerĂ€te (einschließlich des Ethernet-Adapters) an einem einzigen USB-Bus. Tolle Sache, oder? Daher wird die Bandbreite des USB-Busses auf alle daran angeschlossenen GerĂ€te aufgeteilt. Bei der Messung der Geschwindigkeit ĂŒber Ethernet und ĂŒber den USB-WLAN (beide an einen Router angeschlossen), sowohl kabellos als auch ĂŒber Kabel, betrug die Geschwindigkeit etwa 20 Mbit/s.

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

UPD. Wissende Leute haben mir geraten: Um nicht von der Kernel-Version abhÀngig zu sein, sollten Sie Treiber mit dkms erstellen und installieren. In der Readme des Treibers gibt es auch diesen Ansatz.

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 fĂŒr die GerĂ€te-ID wurde in den Hauptzweig des Repositories lwfinger/rtl8188eu aufgenommen.

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

Quelle: habr.com

60GB SSD 8Gb DDR4