Ahoj, Habr!
Razmýšľal som, ako prepojiť svoj Raspberry Pi s internetom bezdrôtovo.
Tak som sa pustil do akcie, na to som zakúpil v najbližšom obchode USB Wi-Fi adaptér známej značky TP-Link. Hneď poviem, že to nie je nejaký malý nano USB modul, ale dosť veľké zariadenie veľkosti bežného flash disku (alebo ak to považujete za vhodné, ako ukazovák dospelého muža). Pred nákupom som si trochu naštudoval zoznam podporovaných výrobcov adaptéra pre RPI a TP-Link bol v zozname (avšak ako sa neskôr ukázalo, nezohľadnil som detaily, veď diabol je známy tým, že sa skrýva v podrobnostiach). Dovoľte, aby som vám predstavil svoj príbeh plný peripetií, ponúkam vám detektívny príbeh v 3 častiach. Záujemcov prosím, aby sa dostavili pod nadpis.
Článok čiastočne mi to pomohlo, ale všetko po poriadku.
Podmienky úlohy
Dané:
- jednodeskový počítač Raspberry Pi 2 B v1.1 — 1 kus
- USB Wi-Fi adaptér WN727N — 1 kus
- pár nie úplne krivých rúk — 2 kusy
- ako operačný systém je nainštalovaný posledný Raspbian (na báze debian 10 Buster)
- jadro verzie 4.19.73-v7+
Nájsť: realizovať pripojenie na internet (Wi-Fi je zdieľané z domáceho routera)
Po vybalení adaptéra čítam návod vo vnútri:
System Compatibility: Windows 10/8/7/XP (aj nebo, aj XP) a MacOS 10.9-10.13
No, o Linuxe žiaľ ani slovo. Bol rok 2019 a ovládače bolo stále potrebné skladať manuálne...
Mali sme so sebou 2 kompilátory, 75 tisíc knižníc, päť binárnych blobov, polovicou súborov s logom a celé more hlavičkových súborov všetkých jazykov a značkovacích systémov. Nešlo o nevyhnutný súbor vecí na prácu. Ale ak raz začnete skladať systém pre seba, ťažko sa zastavíte. Jediné, čo ma znepokojovalo, boli ovládače pre Wi-Fi. Niet nič bezmocnejšieho, nezodpovednejšieho a skazeného, než skladať ovládače zo zdrojových kódov. Vedel som však, že skôr alebo neskôr sa do tejto neplechy dostaneme.
Ako je známe, mať na Linuxe USB Wi-Fi je bolestivé a trochu nechutné (ako ruské sushi).
V krabici je aj CD so ovládačmi. Bez veľkých očakávaní sa pozerám, čo na ňom je — presne tak, nezamysleli sa. Hľadanie na internete ma zaviedlo na stránku výrobcu, ale tam bol ovládač pre Linux len pre revíziu zariadenia v4, a ja som mal na rukách v5.21. A navy na veľmi staré verzie jadra 2.6-3.16. Odlomil som sa neúspechom už na samom začiatku a premýšľal som, že som mal vziať TL-WN727N (ten je trošku drahší a zvláda 300Mbps oproti 150 u môjho, ale ako sa ukázalo, pre malinu to vôbec nemá význam, o čom bude napísané neskôr). Ale čo je najdôležitejšie, ovládače pre neho už existujú a inštalujú sa jednoducho cez balíček firmware-ralink. Revíziu zariadenia si obyčajne môžete pozrieť na prípade zariadenia na nálepke vedľa sériového čísla.
Ďalšie gúglovanie a návšteva rôznych fór mi veľa dobrého nepriniesli. Zjavne nikto pred mnou tento konkrétny adaptér nepripojil na Linux. Mda, mám smolu ako utopenec.
Hoci nie, klamem, návšteva fór (väčšinou anglicky hovoriacich) tiež priniesla svoje ovocie, v niektorých témach sa objavovalo zmienka o akomsi pánovi lwfingerovi, ktorý je známy tým, že napísal niekoľko ovládačov pre wifi adaptéry. Jeho git repozitár je na konci článku v odkazoch. A druhá lekcia, ktorú som sa naučil — je potrebné identifikovať svoje zariadenie, aby sme pochopili, ktorý ovládač pre neho môže byť vhodný.
Časť 1. Identifikácia Borna
Po pripojení zariadenia do portu sa žiadny LED samozrejme nezapol. A vôbec nie je jasné, či niečo funguje alebo nie.
Ako prvé pre zisťovanie, či jadro vidí náš prístroj, sa pozerám do dmesg:
[ 965.606998] usb 1-1.3: nové vysokorýchlostné USB zariadenie číslo 9 pomocou dwc_otg
[ 965.738195] usb 1-1.3: Nové USB zariadenie nájdené, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[ 965.738219] usb 1-1.3: Nové USB zariadenie reťazce: Mfr=1, Produkt=2, Sériové číslo=3
[ 965.738231] usb 1-1.3: Produkt: 802.11n NIC
[ 965.738243] usb 1-1.3: Výrobca: Realtek
[ 965.738255] usb 1-1.3: Sériové číslo: 00E04C0001
Ukázalo sa, že ho vidí, a dokonca je jasné, že tam je čip Realtek a samotný VID/PID zariadenia na sbraine usb.
Ideme ďalej, pozeráme lsusb, a tu nás čaká ďalší neúspech
Bus 001 Device 008: ID 2357:0111
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Rýchly ethernetový adaptér
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
Systém nevie, čo to je za zariadenie, a hanblivo zobrazuje prázdne miesto namiesto mena (hoci vendor=2357 je určite TP-Link).
V tomto štádiu si zvedavý čitateľ možno už všimol niečo zaujímavé, ale odložíme to na neskôr.
Skúmanie problému prázdnych názvov ma priviedlo na stránku s identifikátormi, kde sa zaznamenáva informácia o známych VID/PID. Naše 2357:0111 tam nebolo. Ako sa ukázalo neskôr, utilita lsusb používa súbor /usr/share/misc/usb.ids, ktorý je rovnakým zoznamom identifikátorov z tejto stránky. Pre lepší vzhľad som si do systému pridal riadky pre dodávateľa TP-Link.
2357 TP-Link
0111 TL-WN727N v5.21
Takže zobrazenie v zozname zariadení sme opravili, ale k výberu ovládača nás to nijako nepriblížilo. Na výber ovládača je potrebné poznať, na akom čipe je váš adaptér. Opätovné neúspešné pokusy zistiť to na internete nepriniesli nič dobré. S tenkým skrutkovačom opatrne nadvihujem kryt adaptéra a objaví sa mi v celej svojej pôvodnej nahote poškodené dieťa strýka Liao. Pod lupou môžeme pozorovať názov čipu — RTL8188EUS. To už je dobré. Na niektorých fórach som videl príspevky, že pre tento čip dobre vyhovuje ovládač pána lwfinger (aj keď je tam napísané iba o RTL8188EU).
Časť 2. Prevaha Borna
Sťahujem zdrojové kódy ovládača z gitu.
Nastal čas preinštalovať Windows a venovať sa tomu, s čím sa zvyčajne spája linuxáci — zostavovaním niečoho zo zdrojov. Zostavovanie ovládačov sa, ako sa ukázalo, málo líši od kompilácie programov:
make
sudo make install
ale na kompiláciu modulov jadra potrebujeme hlavičkový súbor jadra pre našu konkrétnu verziu.
Vo štandardnom repozitári je balík raspberrypi-kernel-headers, ale obsahuje verziu súborov pre jadro 4.19.66-v7l+, a to nám nevyhovuje. Ale na získanie hlavičiek potrebnej verzie, ako sa ukázalo, existuje pohodlný nástroj rpi-source (odkaz na konci na GitHub), s ktorým môžeme stiahnuť potrebné hlavičky. Klonujeme repozitár, robíme skript vykonateľným, spúšťame. Pri prvom spustení to zlyhá s chybou — chýba utilita bc. Našťastie je v repozitári a jednoducho ju nainštalujeme.
sudo apt-get install bc
Po tom, čo znovu spustíme a sťahovanie hlavičiek (a potom nastavenie niečoho, už si presne nepamätám) trvá chvíľu, môžeme sa opýtať, že Windows sa vo všetkých svojich prejavoch zlepšil.
Po tom, čo sa všetky hlavičky stiahli, skontrolujeme, že sa objavil adresár /lib/modules/4.19.73-v7+ a v ňom symbolický odkaz ukazuje na to miesto, kde ležia stiahnuté súbory (u mňa 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
Príprava je dokončená, môžeme prejsť k zostavovaniu. Zostavenie modulov opäť trvá určitý čas, Raspberry Pi nie je rýchly (má 32bitový 900Mhz Cortex ARM v7).
Takže, všetko sa skompilovalo. Nainštalujeme ovládač 2. krokom (make install), pričom zároveň prebieha aj kopírovanie ďalších súborov firmvéru potrebných na prácu ovládača:
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/.
Časť 3. Ultimátum Borna
Vkladám USB adaptér do portu a… nič sa nedeje. To všetko bolo nadarmo?
Začínam skúmať súbory v projekte a v jednom z nich nachádzam, čo bola problém: ovládač uvádza úplný zoznam identifikátorov VID/PID, ktoré dokáže obslúžiť. A aby naše zariadenie s týmto ovládačom fungovalo, jednoducho som pridal svoj identifikátor do súboru 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 */
};
Prekompiloval som ovládač a znovu ho nainštaloval do systému.
A tentoraz všetko fungovalo. Indikátor na adaptéri sa rozsvietil a v zozname sieťových rozhraní sa objavilo nové zariadenie.
Kontrola bezdrôtových rozhraní ukazuje nasledujúce:
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 pre tých, ktorí dočítali až do konca
Pamätáte si, ako som hovoril, že nezáleží na tom, aká maximálna rýchlosť je uvedená na vašom adaptéri?
Takže, na Raspberry Pi (pred vydaním modelu 4) sú všetky zariadenia (vrátane ethernet adaptéra) pripojené na jednej USB zbernici. Je to úžasné, nie? Preto sa šírka pásma USB zbernice delí medzi všetky zariadenia na nej. Pri meraní rýchlosti cez ethernet, cez USB Wi-Fi (pripojené k jednému routeru) a bezdrôtovo, aj káblovo, sa dosiahlo okolo 20 Mbit/s.
P.S. Tento návod na kompiláciu ovládača pre tento konkrétny adaptér platí nielen pre RPI. Potom som ho zopakoval aj na svojom desktopovom počítači s Linux Mint — tam tiež všetko fungovalo. Musíte si len stiahnuť potrebné hlavičkové súbory pre vašu používanú verziu jadra.
UPD. Odborníci poradili: aby ste nezáviseli od verzie jadra, je potrebné kompilovať a inštalovať ovládače pomocou dkms. V readme k ovládaču je tento variant tiež uvedený.
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. Navrhnuté pre device id bolo prijaté do hlavného prúdu repozitára lwfinger/rtl8188eu.
Odkazy
—
—
—
—
Zdroj: habr.com
