Salut, Habr!
Am decis odată să conectez Raspberry Pi-ul meu la internet wireless.
Spus și făcut, pentru aceasta am achiziționat de la cel mai apropiat magazin un adaptor USB Wi-Fi de la binecunoscuta firmă TP-Link. Voi spune din start că nu este un modul USB nano, ci un dispozitiv destul de voluminos, de aproximativ dimensiunea unei unități flash obișnuite (sau, dacă preferați, similar cu degetul arătător al unui bărbat adult). Înainte de a cumpăra, am studiat puțin lista producătorilor de adaptoare suportate pentru RPI și TP-Link era pe listă (deși, așa cum s-a dovedit mai târziu, nu am luat în considerare detaliile, căci diavolul, după cum se știe, se ascunde în detalii). Așadar, povestea mea despre peripeții începe, iar dumneavoastră aveți plăcerea să citiți o poveste de investigație în 3 părți. Cei interesați sunt rugați să urmeze.
Articol m-a ajutat parțial, dar toate la timpul lor.
Cerințele sarcinii
Datele problemei:
- computator cu un singur placă Raspberry Pi 2 B v1.1 — 1 bucată
- adaptor USB Wi-Fi WN727N — 1 bucată
- părinți cu două mâini mai puțin stângace — 2 bucăți
- ca sistem de operare este instalat ultimul Raspbian (bazat pe Debian 10 Buster)
- kernel versiunea 4.19.73-v7+
A găsi: a realiza conectarea la internet (Wi-Fi-ul provine de la routerul de acasă)
După despachetarea adaptorului, citesc instrucțiunile de pe interior:
Compatibilitate sistem: Windows 10/8/7/XP (chiar și XP) și MacOS 10.9-10.13
Hmm, despre Linux-uri, ca de obicei, niciun cuvânt. Era 2019, dar încă era nevoie să adun drivere manual...
Aveam cu noi 2 compilatoare, 75 de mii de biblioteci, cinci bloburi binare, jumătate dintr-un mozaic de caractere cu un logo și o mare cantitate de header-e din toate limbile și formatele. Nu că acesta ar fi fost un set necesar pentru muncă. Dar, o dată ce ai început să construiești sistemul pentru tine, devine greu să te oprești. Singurul lucru care îmi provoca îngrijorare era driverele pentru Wi-Fi. Nu există nimic mai neajutorat, iresponsabil și ruinat decât construirea driverelor din surse. Dar știam că mai devreme sau mai târziu vom ajunge și la acest lucru.
În general, după cum se știe, a te ocupa de USB Wi-Fi pe Linux este dur și oarecum dezgustător (ca sushi-ul rusesc).
În cutie mai este un CD cu drivere. Fără mari speranțe, mă uit ce este pe el — desigur, nu s-au obosit să se ocupe de asta. Căutarea pe internet m-a dus la site-ul producătorului, dar acolo există driver Linux doar pentru revizia dispozitivului v4, iar eu aveam în mână v5.21. De asemenea, pentru versiunile foarte vechi ale nucleului 2.6-3.16. Dezmoralizat de eșecul de la început, m-am gândit că ar fi trebuit să iau TL-WN727N (este puțin mai scump și are 300Mbps în comparație cu 150 al meu, dar, așa cum s-a dovedit, pentru Raspberry Pi nu are nicio importanță, despre asta voi scrie mai departe). Însă, cel mai important, driverele pentru el sunt deja disponibile și se instalează ușor din pachet. firmware-ralink. Poți verifica de obicei revizia dispozitivului pe corpul acestuia, pe eticheta de lângă numărul de serie.
Căutările ulterioare pe Google și vizitarea diferitelor forumuri nu m-au ajutat prea mult. Se pare că nimeni până acum nu a încercat să conecteze exact acest adaptor pe Linux. Hmm, pare că am ghinion.
De fapt, mă înșel, vizitarea forumurilor (în principal cele în limba engleză) a dat și rezultate, în unele discuții apărea menționată o anumită persoană pe nume lwfinger, care este cunoscut pentru că a scris câteva drivere pentru adaptoare Wi-Fi. Repositoriul său de pe Git se află la finalul articolului în linkuri. Și a doua lecție pe care am învățat-o este că trebuie să îți identifici dispozitivul pentru a înțelege ce driver ar putea fi potrivit pentru el.
Partea 1. Identificarea dispozitivului
Când am conectat dispozitivul la port, bineînțeles că niciun LED nu s-a aprins. Și nu era deloc clar dacă funcționează ceva sau nu.
Primul lucru pe care l-am verificat pentru a vedea dacă nucleul recunoaște dispozitivul nostru a fost să 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
Se pare că este recunoscut, și este clar că există un chip Realtek și VID/PID-ul dispozitivului pe magistrala USB.
Hai să mergem mai departe, să verificăm lsusb, și aici ne așteaptă o altă neplăcere
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 este acest dispozitiv și modest, arată un loc gol în loc de nume (deși vendor=2357 este cu siguranță TP-Link).
În acest stadiu, cititorul curios probabil a observat ceva interesant, dar vom amâna asta pentru mai târziu.
Cercetarea problemei numelui lipsă m-a condus pe un site cu identificatori, unde sunt înscrise informații despre VID/PID-urile cunoscute. Al nostru 2357:0111 nu era acolo. Așa cum s-a dovedit mai târziu, utilitarul lsusb utilizează fișierul /usr/share/misc/usb.ids, care este aceeași listă de identificatori de pe acest site. Pentru a îmbunătăți aspectul, am adăugat în sistemul meu rânduri pentru furnizorul TP-Link.
2357 TP-Link
0111 TL-WN727N v5.21
Ei bine, am corectat afișarea în lista de dispozitive, dar alegerea driverului nu ne-a adus mai aproape cu nimic. Pentru a alege un driver, trebuie să știm ce chip este folosit în stickul dvs. O nouă încercare nereușită de a afla acest lucru pe internet nu a dus la nimic bun. Armându-mă cu o șurubelniță subțire, ridic cu grijă capacul adaptorului și îmi apare în față, în toată gloria sa, creația păcătoasă a unchiului Liao. Sub lupă, pot observa denumirea chipului — RTL8188EUS. Este un început bun. Pe unele forumuri, am văzut postări că pentru acest chip se potrivește bine driverul lui lwfinger (chiar dacă acolo se menționează doar despre RTL8188EU).
Partea 2. Superioritatea lui Born
Descarc sursele driverului din git.
A venit momentul să reinstalez Windows și să mă ocup de ceea ce de obicei asociază utilizatorii de Linux — compilarea ceva din surse. Compilarea driverelor, așa cum s-a dovedit, nu diferă prea mult de compilarea programelor:
make
sudo make install
dar pentru a compila modulele kernel, avem nevoie de fișierele de antet pentru versiunea noastră specifică.
În depozitul standard există pachetul raspberrypi-kernel-headers, dar acesta conține versiunea fișierelor pentru kernelul 4.19.66-v7l+, și asta nu este potrivit pentru noi. Dar, pentru a obține anteturile versiunii corecte, așa cum s-a dovedit, există un instrument convenabil rpi-source (link la sfârșitul paginii pe GitHub), cu ajutorul căruia putem descărca anteturile necesare. Clonăm depozitul, facem scriptul executabil, îl pornim. La prima rulare apare o eroare — utilitarul bc. Din fericire, acesta se află în depozit și îl instalăm pur și simplu.
sudo apt-get install bc
După aceasta, la rularea ulterioară, descărcarea anteturilor (și apoi configurarea a ceva, acum nu-mi mai amintesc) durează ceva timp și pot să mă relaxez pe spătarul scaunului, Windows a devenit mai bun în toate privințele.
După ce toate anteturile au fost descărcate, verificăm că a apărut directorul /lib/modules/4.19.73-v7+ și că în el există un link simbolic care indică locul unde sunt fișierele descărcate (în cazul meu 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 de pregătire a fost finalizată, putem începe montajul. Montajul modulelor durează din nou un timp determinat, Raspberry Pi-ul nu este foarte rapid (procesorul are 32 biți 900Mhz Cortex ARM v7).
Așadar, totul s-a compilat. Instalăm driverul în pasul 2 (make install), în timpul căruia se copiază și fișierele firmware necesare pentru funcționarea driverului:
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 lui Bourne
Introduc stick-ul în port și… nu se întâmplă nimic. A fost totul în zadar?
Încep să analizez fișierele din proiect și într-unul din ele găsesc problema: driverul specifică toată lista de identificatori VID/PID pe care o poate gestiona. Și pentru ca dispozitivul nostru să funcționeze cu acest driver, am adăugat pur și simplu ID-ul meu în fișierul rtl8188eu/os_dep/usb_intf.c
static struct usb_device_id rtw_usb_id_tbl[] = {
/*=== Placa demoboard Realtek ===*/
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
/*=== ID Client ===*/
/****** 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 */
{} /* Intrare de terminare */
};
Am recompilat driverul și l-am reinstalat în sistem.
Și acum totul a funcționat. Indicatorul de pe adaptor s-a aprins și a apărut un nou dispozitiv în lista interfețelor de rețea.
Vizionarea interfețelor wireless oferă următoarele rezultate:
pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0 no wireless extensions.
lo no wireless extensions.
wlan0 unassociated ESSID:"" Nickname:""
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 au citit până la capăt
Amintiți-vă cum am spus că nu contează care este viteza maximă declarată a adaptorului dumneavoastră?
Așa că, pe Raspberry Pi (până la lansarea modelului 4), toate dispozitivele (inclusiv adaptorul ethernet) sunt conectate pe aceeași magistrală USB. Foarte interesant, nu-i așa? Și, prin urmare, lățimea de bandă a magistralei USB este împărțită între toate dispozitivele conectate la ea. La testarea vitezei, atât prin ethernet, cât și prin USB Wi-Fi (conectate la un singur router), prin aer și prin cablu, am obținut aproximativ 20 Mbit/s.
P.S. În general, acest ghid pentru compilarea driverului pentru acest adaptor specific este valabil nu doar pe RPI. L-am repetat și pe desktopul meu cu Linux Mint — a funcționat la fel. Pur și simplu trebuie să descărcați fișierele de antet necesare pentru versiunea kernel pe care o folosiți.
UPD. Oamenii cunoscători mi-au sugerat: pentru a nu depinde de versiunea kernel-ului, ar trebui să compilați și să instalați driverele folosind dkms. Această opțiune este menționată și în readme-ul driverului.
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 pentru id-ul dispozitivului a fost acceptat în ramura principală a depozitului lwfinger/rtl8188eu.
Linkuri
—
—
—
—
Sursa: habr.com
