Bok, Habr!
Jednom sam odlučio povezati svoj Raspberry Pi na internet bežično.
Rečeno – učinjeno, za to sam u najbližoj trgovini kupio USB Wi-Fi adapter poznate marke TP-Link. Odmah da kažem, to nije neki mali USB modul, već prilično velik uređaj veličine otprilike obične USB memorijske jedinice (ili ako vam tako više odgovara, veličine kažiprsta odraslog muškarca). Prije kupnje malo sam ispitao popis podržanih proizvođača adaptera za RPi i TP-Link je bio na listi (iako se, kako se kasnije ispostavilo, nisam obazirao na suptilnosti, jer, kao što je poznato, đavao se krije u detaljima). Dakle, počinje hladna priča o mojim nevoljama, a vašoj pažnji se nudi detektivska priča u 3 dijela. Zainteresirane molim da pređu ispod ovoga.
na Lifehackeru. djelomično mi je pomoglo, ali sve po redu.
Uvjeti zadatka
Zadano:
- jednokartični računar Raspberry Pi 2 B v1.1 — 1 komad
- USB Wi-Fi adapter WN727N — 1 komad
- par ne baš krivih ruku — 2 komada
- kao operativni sustav instaliran je posljednji Raspbian (na bazi Debian 10 Buster)
- jezgra verzije 4.19.73-v7+
Naći: ostvariti povezivanje na internet (Wi-Fi je od kućnog usmjerivača)
Nakon otpackanja adaptera čitam upute unutra:
Sustavna kompatibilnost: Windows 10/8/7/XP (čak i XP) i MacOS 10.9-10.13
Eh, kao obično, o Linuxu ni riječi. Bilo je 2019., a drivere je i dalje bilo potrebno ručno sastavljati…
Imali smo sa sobom 2 kompajlera, 75 tisuća biblioteka, pet binarnih blobova, pola skupa golih djevojaka s logotipom i cijelo more zaglavlja svih jezika i markup-a. Ne da je to bio nužan set za rad. No, ako ste počeli sastavljati sustav za sebe, teško je stati. Jedino što me je brinulo bili su drajveri za Wi-Fi. Nema ničeg bespomoćnijeg, neodgovornijeg i pokvarenijeg od sastavljanja drajvera iz izvornog koda. Ali znao sam da ćemo prije ili kasnije preći i na tu glupost.
Uopće, kao što je poznato, petljanje s USB Wi-Fi na Linuxu je bolno i pomalo neugodno (kao ruski sushi).
U kutiji se nalazi i CD s drajverima. Bez prevelikih očekivanja gledam što se nalazi na njemu — točno, nisu se potrudili. Pretraživanje interneta odvelo me na stranicu proizvođača, ali tamo je Linux drajver samo za reviziju uređaja v4, a u mojim rukama je bila v5.21. A osim toga, podržava vrlo stare verzije jezgre 2.6-3.16. Obeshrabren neuspehom već na samom početku, pomislio sam da sam trebao uzeti TL-WN727N (malo je skuplji i može do 300Mbps u odnosu na 150 moga, ali to se pokazalo da za Raspberry Pi uopšte nije važno, o tome će biti reči dalje). No, najvažnije je da već postoje drajveri za njega i lako se instaliraju putem paketa firmware-ralink. Obično se revizija uređaja može pogledati na kućištu uređaja na nalepnici pored serijskog broja.
Dalje pretraživanje i poseta raznim forumima posebno nije donela ništa dobro. Izgleda da niko pre mene nije probao da priključi baš taj adapter na Linux. Da, stvarno, sreća mi je kao utopljeniku.
Ipak, lagao bih, poseta forumima (pretežno na engleskom) takođe je dala svoje plodove, u nekim temama se pomenjao neki gospodin lwfinger, koji je poznat po tome što je napisao određeni broj drajvera za WiFi adaptere. Njegov Git repozitorijum nalazi se na kraju članka u linkovima. A druga lekcija koju sam naučio — potrebno je identifikovati svoj uređaj, da bih shvatio koji drajver bi mogao odgovarati.
Deo 1. Identifikacija Borna
Pri uključivanju uređaja u port, nijedan LED naravno nije zasvetleo. I uopšte nije jasno da li nešto radi ili ne.
Prvo za utvrđivanje da li jezgro vidi naš uređaj, pogledam u dmesg:
[ 965.606998] usb 1-1.3: novi USB uređaj visoke brzine broj 9 koristeći dwc_otg
[ 965.738195] usb 1-1.3: Nađen novi USB uređaj, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[ 965.738219] usb 1-1.3: Nove USB karakteristike uređaja: Mfr=1, Product=2, SerialNumber=3
[ 965.738231] usb 1-1.3: Proizvod: 802.11n NIC
[ 965.738243] usb 1-1.3: Proizvođač: Realtek
[ 965.738255] usb 1-1.3: Serijski broj: 00E04C0001
Ispostavilo se da ga vidi, i čak se može zaključiti da je čip Realtek i sam VID/PID uređaja na USB sabirnici.
Idemo dalje, gledamo lsusb, i ovde nas čeka još jedan neuspeh
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
Sistem ne zna šta je to za uređaj i sramotno prikazuje prazno mesto umesto imena (iako vendor=2357 je sigurno TP-Link).
U ovom trenutku, radoznao čitatelj je verovatno već primetio nešto zanimljivo, ali ćemo to odložiti za kasnije.
Istraživanje problema praznih imena odvelo me je do stranice sa identifikatorima, gde se upisuje informacija o poznatim VID/PID. Naš 2357:0111 tamo nije bilo. Kako se kasnije ispostavilo, alat lsusb koristi datoteku /usr/share/misc/usb.ids, koja je ista lista identifikatora s ove stranice. Za ljepše prikazivanje, jednostavno sam dodao redove za TP-Link u svoj sustav.
2357 TP-Link
0111 TL-WN727N v5.21
Pa, ispravili smo prikaz na popisu uređaja, no to nas nije ni na koji način približilo odabiru vozača. Za odabir vozača potrebno je znati na kojem čipu je napravljen vaš adapter. Ponovno bezuspješne pokušaje da to saznam na internetu nije rezultiralo ničim dobrim. Naoružan tankim šarafcigerom pažljivo otvaram poklopac adaptera i pred mojim očima se u svojoj prvobitnoj golotinji pojavljuje gremlin ujaka Liao. Pod povećalom se može vidjeti naziv čipa — RTL8188EUS. To je već dobro. Na nekim forumima sam vidio postove da ovaj čip dobro radi s vozačem gospodina lwfinger (iako je napisano samo za RTL8188EU).
Dio 2. Superiornost Borna
Skidam izvorne datoteke vozača s gita.
Došlo je vrijeme da ponovo instaliram Windows i bavim se onim čime se obično bave Linux korisnici — sastavljanjem nečega iz izvora. Sastavljanje vozača ispostavilo se da se malo razlikuje od kompilacije programa:
make
sudo make install
no za kompilaciju modula jezgre potrebni su nam zaglavlja jezgre za našu konkretnu verziju.
U standardnom repozitoriju postoji paket raspberrypi-kernel-headers, ali sadrži verziju datoteka za jezgru 4.19.66-v7l+, i to nam ne odgovara. No, za dobivanje zaglavlja potrebne verzije, kao što se ispostavilo, postoji zgodan alat rpi-source (link na kraju na GitHubu), s kojim možete preuzeti potrebna zaglavlja. Kloniramo repozitorij, postavljamo skriptu da bude izvršna, pokrećemo je. Prvo pokretanje ne uspijeva zbog greške — nema alata bc. Na sreću, nalazi se u repozitoriju i jednostavno ga instaliramo.
sudo apt-get install bc
Nakon toga, ponovnim pokretanjem i preuzimanjem zaglavlja (a zatim postavljanjem nečega, sada se već ne sjećam) traje neko vrijeme, i mogu se opustiti jer je Windows postao bolje u svim svojim manifestacijama.
Nakon što su sva zaglavlja preuzeta, provjeravamo je li se pojavio direktorij /lib/modules/4.19.73-v7+ i u njemu simbolička poveznica ukazuje na mjesto gdje se nalaze preuzete datoteke (kod mene je to /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
Pripremna faza je završena, možemo preći na sastavljanje. Sastavljanje modula opet traje određeno vreme, malina nije brza (ima čip od 32b 900MHz Cortex ARM v7).
Dakle, sve se uspešno kompajlirano. Instaliramo drajver drugim korakom (make install), pri čemu se takođe prebacuju još neki firmware fajlovi potrebni za rad drajvera:
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/.
Deo 3. Ultimatum Borne
Ubacio sam USB uređaj u port i… ništa se ne dešava. Da li je sve to bilo uzalud?
Počeo sam da proučavam fajlove unutar projekta i u jednom od njih pronašao ono u čemu je bio problem: drajver sadrži kompletnu listu identifikatora VID/PID koje može da obradi. Da bi naše uređaj radio sa tim drajverom, jednostavno sam dodao svoj ID u fajl 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 */
/*=== Custome 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 */
};
Ponovo sam kompajlirao drajver i ponovo ga instalirao u sistemu.
I ovog puta sve je proradilo. Lampica na adapteru se upalila i u listi mrežnih интерфейса prikazalo se novo uređaj.
Pregled bežičnih интерфейса daje sledeće:
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 za one koji su pročitali do kraja
Sećate se kako sam govorio da nije važno koja je maksimalna brzina navedena na vašem adapteru?
Dakle, na malinki (prije izlaska modela 4) svi uređaji (uključujući ethernet adapter) nalaze se na jednoj USB sabirnici. Super, zar ne? Zbog toga se propusnost USB sabirnice dijeli između svih uređaja na njoj. Kada smo mjerili brzinu, i preko ethernet-a, i preko USB Wi-Fi (spojenih na jedan router) i bežično i žično, imali smo oko 20 Mbit/s.
P.S. Ovaj vodič za kompilaciju drajvera za ovaj konkretni adapter vrijedi ne samo za RPI. Kasnije sam ga ponovio i na svom desktopu sa Linux Mint-om — sve je također radilo. Samo, trebate preuzeti potrebne zaglavne datoteke za vašu verziju jezgre.
UPD. Znalačke osobe su mi sugerirale: kako ne biste ovisili o verziji jezgre, trebate kompilirati i instalirati drajvere pomoću dkms-a. Ova opcija je također uključena u README za drajver.
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. Predložen device id je prihvaćen u mainstream granu repozitorija lwfinger/rtl8188eu.
Linkovi
—
—
—
—
Izvor: habr.com
