La oss bli venner med RaspberryPi med TP-Link TL-WN727N

Hei Habr!

Jeg bestemte meg en gang for å koble bringebæret mitt til Internett over luften.

Ikke før sagt enn gjort, for dette formålet kjøpte jeg en usb wi-fi-fløyte fra det velkjente selskapet TP-Link fra nærmeste butikk. Jeg vil si med en gang at dette ikke er en slags nano-usb-modul, men en ganske stor enhet, omtrent på størrelse med en vanlig flash-stasjon (eller, hvis du vil, størrelsen på en voksen manns pekefinger). Før jeg kjøpte, gjorde jeg litt research på listen over støttede fløyteprodusenter for RPI og TP-Link var på listen (men som det viste seg senere, tok jeg ikke hensyn til finessene, fordi djevelen, som vi vet , er i detaljene). Så den kalde historien om mine ulykker begynner; vi presenterer for din oppmerksomhet en detektivhistorie i 3 deler. For de som er interessert, vennligst referer til kat.

artikkel Koble til WN727N WiFi-adapteren til Ubuntu/Mint Det hjalp meg delvis, men først.

Betingelsene for problemet

gitt:

  1. enkeltbretts datamaskin Raspberry Pi 2 B v1.1 – 1 stk
  2. usb wi-fi fløyte WN727N - 1 stk
  3. et par ikke helt skjeve hender - 2 stk
  4. Den nyeste Raspbian er installert som OS (basert på Debian 10 Buster)
  5. kjerneversjon 4.19.73-v7+

Finn: koble til Internett (Wi-Fi distribueres fra hjemmeruteren)

Etter å ha pakket ut adapteren, leste jeg instruksjonene på innsiden:

Systemkompatibilitet: Windows 10/8/7/XP (til og med himmelen, til og med XP) og MacOS 10.9-10.13

Hmm, som vanlig, ikke et ord om Linux. Det var 2k19, og driverne måtte fortsatt monteres manuelt...

Vi hadde med oss ​​2 kompilatorer, 75 tusen biblioteker, fem binære blobs, et halvt utvalg av nakne kvinner med en logo og et helt hav av overskrifter på alle språk og markeringer. Ikke at dette er et nødvendig sett for jobben. Men når du først begynner å sette sammen et system for deg selv, blir det vanskelig å stoppe. Det eneste som forårsaket meg bekymring var driverne for wi-fi. Det er ikke noe mer hjelpeløst, uansvarlig og korrupt enn å bygge sjåfører fra kilden. Men jeg visste at før eller siden ville vi gå over til dette søppelet.

Generelt, som du vet, er det å fikle med usb wi-fi på Linux smertefullt og noe smakløst (som russisk sushi).

Esken inneholder også en CD med drivere. Uten mye håp ser jeg på hva som står på den - de har definitivt ikke tatt vare på det. Et Internett-søk førte meg til produsentens nettsted, men det er en Linux-driver der kun for enhetsrevisjon v4, og i armene mine var v5.21. Og dessuten, for svært gamle kjerneversjoner 2.6-3.16. Motløs av feilen helt i begynnelsen, tenkte jeg allerede at jeg burde ha tatt TL-WN727N (den er litt dyrere og tåler 300 Mbps mot 150 for min, men som det viste seg, spiller dette ingen rolle i det hele tatt for bringebæret vil dette bli skrevet om senere). Men det viktigste er at drivere for det allerede eksisterer og er ganske enkelt installert som en pakke firmware-ralink. Du kan vanligvis se enhetsrevisjonen på enhetens kropp på et klistremerke ved siden av serienummeret.

Ytterligere googling og besøk på ulike fora ga ikke mye bra. Det er visstnok ingen før meg som har prøvd å koble en slik adapter til Linux. Hmm, jeg er like heldig som en druknet mann.

Selv om, nei, jeg lyver, bar det også frukt av å besøke fora (for det meste engelskspråklige); i noen emner ble det nevnt en viss Mr. lwfinger, som er kjent for å skrive en rekke drivere for Wi-Fi-adaptere . Git-depotet hans er på slutten av artikkelen i lenkene. Og den andre leksjonen jeg lærte er at du må identifisere enheten din for å forstå hvilken driver som kan passe for den.

Del 1: The Bourne Identity

Når enheten ble koblet til porten, lyste selvfølgelig ingen LED. Og generelt er det ikke klart på noen måte om noe fungerer eller ikke.

Først av alt, for å finne ut om kjernen ser enheten vår, ser 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 seg at den ser, og det er til og med tydelig at det er en Realtek-brikke og VID/PID til selve enheten på usb-bussen.

La oss gå videre og se lsusb, og her venter en ny fiasko på oss

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 vet ikke hva slags enhet det er, og viser en tom plass i stedet for navnet (selv om leverandør=2357 definitivt er TP-Link).

På dette stadiet har nok den nysgjerrige leser allerede lagt merke til noe interessant, men vi lar det ligge til vår tid.

Å undersøke problemet med tomme navn førte meg til et nettsted med identifikatorer, hvor informasjon om kjent VID/PID legges inn. Vår 2357:0111 var ikke der. Som det viste seg senere, verktøyet lsusb bruker fil /usr/share/misc/usb.ids, som er den samme listen over ID-er fra dette nettstedet. For skjønnheten til skjermen la jeg ganske enkelt til linjer for leverandøren TP-Link i systemet mitt.

2357  TP-Link
        0111  TL-WN727N v5.21

Vel, vi korrigerte skjermen i listen over enheter, men det førte oss ikke ett skritt nærmere valg av driver. For å velge en sjåfør, må du vite hvilken chip fløyta er laget på. De neste mislykkede forsøkene på å finne ut av dette på Internett førte ikke til noe godt. Bevæpnet med en tynn skrutrekker lirker jeg forsiktig av adapterhetten og onkel Liaos ondskapsfulle hjernebarn dukker opp i all sin uberørte nakenhet. Under et forstørrelsesglass kan du se navnet på brikken - RTL8188EUS. Dette er allerede bra. På noen fora så jeg innlegg om at driveren fra den samme mannen lwfinger er godt egnet for denne brikken (selv om han bare skriver om RTL8188EU).

Del 2: The Bourne Supremacy

Jeg laster ned driverkildene fra Git.

Det er på tide å installere Windows på nytt og gjøre det Linux-brukere vanligvis forbindes med - å sette sammen noe fra noen slags. Å sette sammen drivere, som det viser seg, skiller seg lite fra å kompilere programmer:

make
sudo make install

men for å kompilere kjernemoduler trenger vi kjernehodefilene for vår spesifikke versjon.

Det er en pakke i lageret raspberrypi-kernel-headers, men den inneholder kjerneversjonen av filene 4.19.66-v7l+, og det passer ikke oss. Men for å få overskriftene til den nødvendige versjonen, som det viste seg, er det et praktisk verktøy rpi-kilde (lenke på slutten på Github), som du kan laste ned nødvendige overskrifter med. Vi kloner depotet, gjør skriptet kjørbart og kjører det. Den første lanseringen mislykkes med en feil - det er ingen verktøy bc. Heldigvis er det i depotet, og vi installerer det bare.

sudo apt-get install bc

Etter dette tar det litt tid å starte og laste ned overskriftene på nytt (og deretter sette opp noe, jeg husker ikke nå), og du kan lene deg tilbake i stolen, Windows har blitt bedre i alle dens manifestasjoner.

Etter at alle overskriftene er lastet ned, kontroller at katalogen vises /lib/modules/4.19.73-v7+ og i den peker symbolkoblingen til stedet der de nedlastede filene er plassert (for meg 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

Det forberedende stadiet er fullført, du kan begynne montering. Å sette sammen modulene igjen tar litt tid, Raspberry er ikke et raskt beist (den har en 32bit 900Mhz Cortex ARM v7).
Så alt kompilert. Vi installerer driveren i det andre trinnet (gjør install), samtidig som vi kopierer flere fastvarefiler som er nødvendige for at driveren skal 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. The Bourne Ultimatum

Jeg kobler fløyta til porten og... ingenting skjer. Var alt for ingenting?

Jeg begynner å studere filene inne i prosjektet, og i en av dem finner jeg hva problemet var: driveren spesifiserer en komplett liste over VID/PID-identifikatorer som den kan betjene. Og for at enheten vår skal fungere med denne driveren, la jeg ganske enkelt ID-en min 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 kompilerte driveren på nytt og installerte den på nytt på systemet.

Og denne gangen startet alt. Lyset på adapteren lyste opp og en ny enhet dukket opp i listen over nettverksgrensesnitt.

Visning av trådløse grensesnitt 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 for de som leser til slutt

Husker du hvordan jeg sa at det ikke spiller noen rolle hvilken maksimal hastighet som er angitt på adapteren din?
Så, på Malinka (før utgivelsen av modell 4), sitter alle enheter (inkludert ethernet-adapteren) på samme usb-bussen. Flott, ikke sant? Og derfor er båndbredden til usb-bussen delt mellom alle enhetene på den. Ved måling av hastigheten både via ethernet og via usb wi-fi (koblet til 1 ruter) både med fly og ledning var den rundt 20Mbit/s.

PS Generelt er denne veiledningen for å kompilere en driver for denne spesielle adapteren ikke bare gyldig for RPI. Jeg gjentok det på skrivebordet mitt med Linux Mint - alt fungerte der også. Du trenger bare å laste ned de nødvendige header-filene for kjerneversjonen din på samme måte.

UPD. Kunnskapsrike personer foreslo: For ikke å være avhengig av kjerneversjonen, må du samle inn og installere drivere ved å bruke dkms. Readme for driveren inneholder også dette alternativet.

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. Foreslått lapp for enhets-ID ble akseptert i mainstream-grenen til lwfinger/rtl8188eu-depotet.

referanser
- RPi USB Wi-Fi-adaptere
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-kilde

Kilde: www.habr.com