Lad os blive venner med RaspberryPi med TP-Link TL-WN727N

Hej Habr!

Jeg besluttede engang at forbinde min hindbær til internettet via luften.

Ikke før sagt end gjort, til dette formål købte jeg en usb wi-fi fløjte fra det velkendte firma TP-Link fra den nærmeste butik. Jeg vil med det samme sige, at dette ikke er en form for nano-usb-modul, men en ret stor enhed, på størrelse med et almindeligt flashdrev (eller, hvis du vil, på størrelse med en voksen mands pegefinger). Før jeg købte, lavede jeg lidt research på listen over understøttede fløjteproducenter til RPI, og TP-Link var på listen (men som det viste sig senere, tog jeg ikke højde for finesserne, fordi djævelen, som vi ved , er i detaljerne). Så den kolde fortælling om mine uheld begynder; vi præsenterer for din opmærksomhed en detektivhistorie i 3 dele. For interesserede henvises til kat.

artiklen Tilslutning af WN727N WiFi-adapteren til Ubuntu/Mint Det hjalp mig delvist, men først og fremmest.

Betingelserne for problemet

Givet:

  1. single board computer Raspberry Pi 2 B v1.1 – 1 stk
  2. usb wi-fi fløjte WN727N - 1 stk
  3. et par ikke helt skæve hænder - 2 stk
  4. Den seneste Raspbian er installeret som OS (baseret på Debian 10 Buster)
  5. kerneversion 4.19.73-v7+

Find: Opret forbindelse til internettet (Wi-Fi distribueres fra din hjemmerouter)

Efter at have pakket adapteren ud læste jeg instruktionerne indeni:

Systemkompatibilitet: Windows 10/8/7/XP (selv himlen, endda XP) og MacOS 10.9-10.13

Hmm, som sædvanlig, ikke et ord om Linux. Det var 2k19, og driverne skulle stadig samles manuelt...

Vi havde med os 2 compilere, 75 tusinde biblioteker, fem binære klatter, et halvt udvalg af nøgne kvinder med et logo og et helt hav af overskrifter på alle sprog og markeringer. Ikke at dette er et nødvendigt sæt til jobbet. Men når først du begynder at samle et system til dig selv, bliver det svært at stoppe. Det eneste, der gav mig bekymring, var driverne til wi-fi. Der er ikke noget mere hjælpeløst, uansvarligt og korrupt end at bygge chauffører fra kilden. Men jeg vidste, at vi før eller siden ville skifte til det her skrald.

Generelt er det, som du ved, at pille ved usb wi-fi på Linux smertefuldt og noget smagløst (som russisk sushi).

Æsken indeholder også en CD med drivere. Uden meget håb ser jeg på, hvad der står på den - de har bestemt ikke taget sig af det. En internetsøgning bragte mig til producentens hjemmeside, men der er en Linux-driver der kun til enhedsrevision v4, og i mine arme var v5.21. Og desuden for meget gamle kerneversioner 2.6-3.16. Modløs over fejlen i begyndelsen, tænkte jeg allerede, at jeg skulle have taget TL-WN727N (den er lidt dyrere og kan klare 300 Mbps mod 150 for min, men som det viste sig, betyder det ikke noget overhovedet for hindbær, dette vil blive skrevet om senere). Men det vigtigste er, at driverne til det allerede eksisterer og blot er installeret som en pakke firmware-ralink. Du kan normalt se enhedsrevisionen på enhedens krop på et klistermærke ved siden af ​​serienummeret.

Yderligere google og besøg på forskellige fora gav ikke meget godt. Tilsyneladende har ingen før mig forsøgt at tilslutte sådan en adapter til Linux. Hmm, jeg er lige så heldig som en druknet mand.

Selvom, nej, jeg lyver, bar besøg på fora (for det meste engelsksprogede) også frugt; i nogle emner var der en omtale af en vis hr. lwfinger, som er berømt for at skrive en række drivere til Wi-Fi-adaptere . Hans git-lager er i slutningen af ​​artiklen i links. Og den anden lektie, jeg lærte, er, at du skal identificere din enhed for at forstå, hvilken driver der kan være egnet til den.

Del 1: Bourne-identiteten

Når enheden blev sat i porten, tændte der selvfølgelig ingen LED. Og generelt er det ikke klart på nogen måde, om noget virker eller ej.

Først og fremmest, for at finde ud af, om kernen ser vores enhed, kigger jeg i 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

Det viste sig, at den ser, og det er endda tydeligt, at der er en Realtek-chip og VID/PID af selve enheden på usb-bussen.

Lad os gå videre og se så udfør lsusb, og her venter os endnu en fiasko

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

Systemet ved ikke, hvad det er for en enhed, og viser blufærdigt et tomt rum i stedet for navnet (selvom vendor=2357 bestemt er TP-Link).

På dette stadie har den videbegærlige læser sikkert allerede bemærket noget interessant, men vi lader det ligge til vores tid.

At undersøge problemet med tomme navne førte mig til et websted med identifikatorer, hvor information om kendt VID/PID er indtastet. Vores 2357:0111 var der ikke. Som det viste sig senere, værktøjet så udfør lsusb bruger fil /usr/share/misc/usb.ids, som er den samme liste over id'er fra dette websted. Af hensyn til skærmens skønhed tilføjede jeg blot linjer for leverandøren TP-Link i mit system.

2357  TP-Link
        0111  TL-WN727N v5.21

Nå, vi rettede visningen på listen over enheder, men det bragte os ikke et skridt tættere på at vælge en driver. For at vælge en driver skal du vide, hvilken chip din fløjte er lavet på. De næste mislykkede forsøg på at finde ud af dette på internettet førte ikke til noget godt. Bevæbnet med en tynd skruetrækker lirker jeg forsigtigt adapterhætten af, og onkel Liaos ondskabsfulde hjernebarn dukker op i al sin uberørte nøgenhed. Under et forstørrelsesglas kan du se chippens navn - RTL8188EUS. Det her er allerede godt. På nogle fora så jeg indlæg om, at driveren fra den samme gentleman lwfinger er velegnet til denne chip (selvom han kun skriver om RTL8188EU).

Del 2: The Bourne Supremacy

Jeg downloader driverkilderne fra Git.

Det er tid til at geninstallere Windows og gøre, hvad Linux-brugere normalt forbindes med - at samle noget fra en eller anden slags. Samling af drivere, som det viser sig, adskiller sig lidt fra kompilering af programmer:

make
sudo make install

men for at kompilere kernemoduler har vi brug for kernehovedfilerne til vores specifikke version.

Der er en pakke i lageret raspberrypi-kernel-headers, men den indeholder kerneversionen af ​​filerne 4.19.66-v7l+, og det passer os ikke. Men for at få overskrifterne til den krævede version, som det viste sig, er der et praktisk værktøj rpi-kilde (link i slutningen på Github), hvormed du kan downloade de nødvendige overskrifter. Vi kloner lageret, gør scriptet eksekverbart og kører det. Den første lancering mislykkes med en fejl - der er intet værktøj bc. Heldigvis er det i depotet, og vi installerer det bare.

sudo apt-get install bc

Herefter tager det lidt tid at genstarte og downloade overskrifterne (og så konfigurere noget, jeg kan ikke huske nu), og du kan læne dig tilbage i stolen, Windows er blevet bedre i alle dens manifestationer.

Når alle overskrifterne er blevet downloadet, skal du kontrollere, at mappen vises /lib/modules/4.19.73-v7+ og i det peger symbollinket til det sted, hvor de downloadede filer er placeret (for mig er det /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

Den forberedende fase er afsluttet, du kan begynde at samle. Det tager lidt tid at samle modulerne igen, Raspberry er ikke et hurtigt beist (den har en 32bit 900Mhz Cortex ARM v7).
Så alt kompileret. Vi installerer driveren i 2. trin (foretag installation), mens vi også kopierer flere firmwarefiler, der er nødvendige for at driveren kan fungere:

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

Del 3. Bourne Ultimatum

Jeg sætter fløjten i porten og... der sker ikke noget. Var det hele for ingenting?

Jeg begynder at studere filerne inde i projektet, og i en af ​​dem finder jeg, hvad problemet var: driveren angiver en komplet liste over VID/PID-identifikatorer, som den kan betjene. Og for at vores enhed kunne arbejde med denne driver, tilføjede jeg simpelthen mit id til filen 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 */
};

Jeg kompilerede driveren igen og geninstallerede den på systemet.

Og denne gang startede alt. Lyset på adapteren tændte, og en ny enhed dukkede op på listen over netværksgrænseflader.

Visning af trådløse grænseflader viser følgende:

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 til dem, der læser til ende

Kan du huske, hvordan jeg sagde, at det er ligegyldigt, hvilken maksimal hastighed der er angivet på din adapter?
Så på Malinka (før udgivelsen af ​​model 4) sidder alle enheder (inklusive ethernet-adapteren) på den samme usb-bus. Fantastisk, ikke? Og derfor er båndbredden på usb-bussen delt mellem alle enheder på den. Ved måling af hastigheden både via ethernet og via usb wi-fi (tilsluttet 1 router) både med fly og ledning, var den omkring 20Mbit/s.

PS Generelt gælder denne guide til kompilering af en driver til denne særlige adapter ikke kun for RPI. Jeg gentog det så på mit skrivebord med Linux Mint - alt fungerede også der. Du skal bare downloade de nødvendige header-filer til din kerneversion på samme måde.

UPD. Kyndige personer foreslog: For ikke at være afhængig af kerneversionen skal du indsamle og installere drivere ved hjælp af dkms. Readme til driveren indeholder også denne mulighed.

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. Foreslog lappe for enheds-id blev accepteret i mainstream-grenen af ​​lwfinger/rtl8188eu-lageret.

RЎSЃS <P "RєRё
RPi USB Wi-Fi-adaptere
Gitbub lwfinger/rtl8188eu
usb.ids
rpi-kilde

Kilde: www.habr.com