Să ne facem prieteni RaspberryPi cu TP-Link TL-WN727N

Hei Habr!

Odată am decis să-mi conectez zmeura la internet prin aer.

Nu mai devreme de zis, de făcut, în acest scop am achiziționat un fluier usb wi-fi de la cunoscuta companie TP-Link de la cel mai apropiat magazin. Voi spune imediat că acesta nu este un fel de modul nano USB, ci un dispozitiv destul de mare, cam de dimensiunea unei unități flash obișnuite (sau, dacă doriți, de dimensiunea degetului arătător al unui bărbat adult). Înainte de a cumpăra, am făcut o mică cercetare pe lista producătorilor de fluiere acceptați pentru RPI și TP-Link era pe listă (totuși, după cum s-a dovedit mai târziu, nu am ținut cont de subtilități, pentru că diavolul, după cum știm , este în detalii). Așadar, începe povestea rece a nenorocirilor mele; vă prezentăm atenției o poveste polițistă în 3 părți. Pentru cei interesați, vă rugăm să consultați cat.

articol Conectarea adaptorului WiFi WN727N la Ubuntu/Mint M-a ajutat parțial, dar pe primul loc.

Condițiile problemei

Dat:

  1. computer cu o singură placă Raspberry Pi 2 B v1.1 – 1 bucată
  2. fluier usb wi-fi WN727N - 1 bucată
  3. o pereche de mâini nu tocmai strâmbe - 2 bucăți
  4. Cel mai recent Raspbian este instalat ca sistem de operare (bazat pe Debian 10 Buster)
  5. versiunea de kernel 4.19.73-v7+

Găsiți: conectați-vă la Internet (Wi-Fi este distribuit de la routerul dvs. de acasă)

După ce am despachetat adaptorul, am citit instrucțiunile din interior:

Compatibilitate sistem: Windows 10/8/7/XP (chiar și cerul, chiar și XP) și MacOS 10.9-10.13

Hmm, ca de obicei, nici un cuvânt despre Linux. Era 2k19, iar driverele mai trebuiau asamblate manual...

Am avut cu noi 2 compilatoare, 75 de mii de biblioteci, cinci blob-uri binare, o jumătate de serie de femei goale cu un logo și o mare întreagă de anteturi pentru toate limbile și markupuri. Nu că acesta este un set necesar pentru job. Dar odată ce începeți să asamblați un sistem pentru dvs., devine dificil să vă opriți. Singurul lucru care m-a îngrijorat au fost driverele pentru wi-fi. Nu există nimic mai neajutorat, iresponsabil și mai corupt decât construirea de șoferi de la sursă. Dar știam că mai devreme sau mai târziu vom trece la acest gunoaie.

În general, după cum știți, jocul cu usb wi-fi pe Linux este dureroasă și oarecum lipsită de gust (ca sushi rusesc).

Cutia contine si un CD cu drivere. Fără prea multe speranțe, mă uit la ce este pe el - cu siguranță nu s-au ocupat de el. O căutare pe internet m-a adus pe site-ul producătorului, dar există un driver Linux acolo doar pentru revizuirea dispozitivului v4, și în brațele mele era v5.21. Și în plus, pentru versiunile de nucleu foarte vechi 2.6-3.16. Descurajat de eșecul de la bun început, m-am gândit deja că ar fi trebuit să iau TL-WN727N (este puțin mai scump și poate suporta 300Mbps față de 150 pentru al meu, dar după cum s-a dovedit, acest lucru nu contează deloc pentru zmeura despre asta se va scrie mai tarziu). Dar cel mai important lucru este că driverele pentru acesta există deja și sunt pur și simplu instalate ca pachet firmware-ralink. De obicei, puteți vedea versiunea dispozitivului pe corpul dispozitivului pe un autocolant de lângă numărul de serie.

Continuarea pe Google și vizitarea diferitelor forumuri nu a adus prea mult bine. Se pare că nimeni înaintea mea nu a încercat să conecteze un astfel de adaptor la Linux. Hmm, sunt la fel de norocos ca un om înecat.

Deși, nu, mint, vizitarea forumurilor (în mare parte cele în limba engleză) a dat roade și ele, în unele subiecte s-a menționat un anume domnul lwfinger, care este renumit pentru că a scris o serie de drivere pentru adaptoarele Wi-Fi . Depozitul lui git este la sfârșitul articolului în linkuri. Și a doua lecție pe care am învățat-o este că trebuie să vă identificați dispozitivul pentru a înțelege ce driver poate fi potrivit pentru acesta.

Partea 1: Identitatea Bourne

Când dispozitivul a fost conectat la port, desigur, niciun LED nu s-a aprins. Și, în general, nu este clar în niciun fel dacă ceva funcționează sau nu.

În primul rând, pentru a afla dacă nucleul vede dispozitivul nostru, mă uit în 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

S-a dovedit că vede și chiar e clar că există un cip Realtek și VID/PID-ul dispozitivului în sine pe magistrala USB.

Să mergem mai departe și să privim lsusb, și aici ne așteaptă un alt eșec

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

Sistemul nu știe ce fel de dispozitiv este și afișează cu timiditate un spațiu gol în loc de nume (deși vendor=2357 este cu siguranță TP-Link).

În această etapă, cititorul curios probabil că a observat deja ceva interesant, dar îl vom lăsa pe vremea noastră.

Cercetarea problemei numelor goale m-a condus la un site cu identificatori, unde sunt introduse informații despre VID/PID cunoscut. 2357:0111 nostru nu era acolo. După cum sa dovedit mai târziu, utilitatea lsusb folosește fișierul /usr/share/misc/usb.ids, care este aceeași listă de ID-uri de pe acest site. Pentru frumusețea afișajului, am adăugat pur și simplu linii pentru furnizorul TP-Link în sistemul meu.

2357  TP-Link
        0111  TL-WN727N v5.21

Ei bine, am corectat afișarea în lista de dispozitive, dar nu ne-a adus cu un pas mai aproape de alegerea unui driver. Pentru a selecta un șofer, trebuie să știi pe ce cip este făcut fluierul tău. Următoarele încercări nereușite de a afla acest lucru pe Internet nu au dus la nimic bun. Înarmat cu o șurubelniță subțire, scot cu grijă capacul adaptorului, iar creația vicioasă a unchiului Liao apare în toată goliciunea ei curată. Sub o lupă puteți vedea numele cipului - RTL8188EUS. Acest lucru este deja bun. Pe unele forumuri am văzut postări că șoferul aceluiași domn lwfinger este potrivit pentru acest cip (chiar dacă scrie doar despre RTL8188EU).

Partea 2: Supremația Bourne

Descarc sursele driverului din Git.

Este timpul să reinstalați Windows și să faceți ceea ce utilizatorii Linux sunt de obicei asociați - asamblarea ceva din anumite feluri. Asamblarea driverelor, după cum se dovedește, diferă puțin de compilarea programelor:

make
sudo make install

dar pentru a compila modulele kernel avem nevoie de fișierele antet kernel pentru versiunea noastră specifică.

Există un pachet în depozitul de stoc raspberrypi-kernel-headers, dar conține versiunea de kernel a fișierelor 4.19.66-v7l+, iar asta nu ne convine. Dar pentru a obține antetele versiunii necesare, după cum sa dovedit, există un instrument convenabil sursa rpi (link la final pe Github), cu ajutorul căruia poți descărca anteturile necesare. Clonăm depozitul, facem scriptul executabil și îl rulăm. Prima lansare eșuează cu o eroare - nu există utilitate bc. Din fericire, este în depozit și doar îl instalăm.

sudo apt-get install bc

După aceasta, repornirea și descărcarea anteturilor (și apoi configurarea a ceva, nu-mi amintesc acum) durează ceva timp și poți sta pe spate pe scaun, Windows a devenit mai bun în toate manifestările sale.

După ce toate anteturile au fost descărcate, verificați dacă directorul apare /lib/modules/4.19.73-v7+ și în el, linkul simbolic indică locul în care se află fișierele descărcate (pentru mine este /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

Etapa pregătitoare a fost finalizată, puteți începe asamblarea. Asamblarea modulelor din nou durează ceva timp, Raspberry nu este o bestie rapidă (are un Cortex ARM v32 pe 900 de biți 7Mhz).
Deci totul a fost compilat. Instalăm driverul în al 2-lea pas (efectuați instalarea), în timp ce copiem mai multe fișiere de firmware necesare pentru ca driverul să funcționeze:

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

Partea 3. Ultimatumul Bourne

Conectez fluierul în port și... nu se întâmplă nimic. A fost totul degeaba?

Încep să studiez fișierele din interiorul proiectului și într-unul dintre ele găsesc care a fost problema: driverul specifică o listă completă de identificatori VID/PID pe care îi poate servi. Și pentru ca dispozitivul nostru să funcționeze cu acest driver, am adăugat pur și simplu id-ul meu în fișier 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 */
};

Am recompilat driverul și l-am reinstalat pe sistem.

Și de data asta a început totul. Lumina de pe adaptor s-a aprins și un nou dispozitiv a apărut în lista de interfețe de rețea.

Vizualizarea interfețelor wireless arată următoarele:

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 pentru cei care citesc până la capăt

Îți amintești cum am spus că nu contează ce viteză maximă este specificată pe adaptorul tău?
Deci, pe Malinka (înainte de lansarea modelului 4), toate dispozitivele (inclusiv adaptorul ethernet) stau pe aceeași magistrală USB. Grozav, nu? Și, prin urmare, lățimea de bandă a magistralei USB este împărțită între toate dispozitivele de pe aceasta. La măsurarea vitezei atât prin ethernet, cât și prin usb wi-fi (conectat la 1 router) atât prin aer cât și prin fir, aceasta a fost în jur de 20Mbit/s.

PS În general, acest ghid pentru compilarea unui driver pentru acest adaptor special este valabil nu numai pentru RPI. Am repetat-o ​​apoi pe desktop-ul meu cu Linux Mint - totul a funcționat și acolo. Trebuie doar să descărcați fișierele de antet necesare pentru versiunea dvs. de kernel în același mod.

UPD. Oamenii cunoscători au sugerat: pentru a nu depinde de versiunea de kernel, trebuie să colectați și să instalați drivere folosind dkms. Readme pentru driver conține și această opțiune.

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. Propus plasture pentru ID-ul dispozitivului a fost acceptat în ramura principală a depozitului lwfinger/rtl8188eu.

referințe
- Adaptoare USB Wi-Fi RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- sursa rpi

Sursa: www.habr.com