Ahoj, Habr!
Jednou jsem se rozhodl připojit svůj Raspberry Pi k internetu bezdrátově.
Bylo to řečeno a uděláno, pro to byl zakoupen v nejbližším obchodě USB Wi-Fi adaptér známé značky TP-Link. Hned říkám, že to není nějaký malý USB modul, ale docela objemné zařízení velikosti běžné flashky (nebo pokud vám to vyhovuje, velikosti ukazováčku dospělého muže). Před koupí jsem si trochu prostudoval seznam podporovaných adaptérů pro RPI a TP-Link byl na seznamu (pravda, jak se později ukázalo, nevzal jsem v úvahu nuance, protože jak známo, ďábel se skrývá v detailech). Takže začíná chladný příběh o mých peripetiích, váš pozornost je přesměrována na detektivní příběh ve třech částech. Zájemce prosím pod kat.
Článek částečně mi to pomohlo, ale o všem postupně.
Podmínky úkolu
Dané:
- jednodeskový počítač Raspberry Pi 2 B v1.1 — 1 kus
- USB Wi-Fi adaptér WN727N — 1 kus
- pár ne zcela křivých rukou — 2 kusy
- jako operační systém je nainstalován poslední Raspbian (na základě Debian 10 Buster)
- jádro verze 4.19.73-v7+
Najít: připojit se k internetu (Wi-Fi je poskytováno domácím routerem)
Po vybalení adaptéru čtu návod uvnitř:
Systémová kompatibilita: Windows 10/8/7/XP (dokonce i XP) a MacOS 10.9-10.13
No, o Linuxu jako obvykle ani slovo. Bylo rok 2019, ale ovladače stále bylo potřeba skládat ručně...
Měli jsme s sebou 2 kompilátory, 75 tisíc knihoven, pět binárních blobů, půl pole holých žen s logem a celé moře hlaviček všech jazyků a značkování. Ne že by to byl nezbytný set na práci. Ale pokud se pustíte do sestavování systému pro sebe, stává se obtížné přestat. Jediné, co mě znepokojovalo, byly ovladače pro Wi-Fi. Není nic bezmocnějšího, nezodpovědného a poškozeného, než sestavování ovladačů z zdrojových kódů. Ale věděl jsem, že dříve či později se k tomu také dostaneme.
Jak je známo, hrát si s USB Wi-Fi na Linuxu je bolestivé a poněkud nevkusné (jako ruské sushi).
V krabici je také CD s ovladači. Bez velké naděje se dívám, co na něm je — přesně, nepostarali se. Hledání na internetu mě zavedlo na web výrobce, ale tam je ovladač pro Linux pouze pro revizi zařízení v4, a já měl v rukou v5.21. A navíc pro velmi staré verze jádra 2.6-3.16. Zklamaný neúspěchem už na začátku jsem si pomyslel, že jsem měl vzít TL-WN727N (je o něco dražší a podporuje 300 Mbps proti 150 u mého, ale jak se ukázalo, pro Raspberry Pi to vůbec není důležité, o tom bude psáno dále). Ale co je nejdůležitější, ovladače pro něj již existují a instalují se jednoduše pomocí balíčku. firmware-ralink. Revizi zařízení obvykle najdete na štítku na těle zařízení vedle sériového čísla.
Další vyhledávání na Googlu a návštěva různých fór mi příliš dobrého nepřinesla. Zdá se, že nikdo přede mnou nezkoušel připojit tento konkrétní adaptér k Linuxu. Ach jo, mám opravdu smůlu.
I když ne, lžu, návštěva fór (většinou anglicky psaných) také přinesla své ovoce, v některých tématech se objevovalo zmínění jistého pána lwfinger, který je znám tím, že napsal několik ovladačů pro Wi-Fi adaptéry. Jeho git repozitář na konci článku v odkazech. A druhou lekci, kterou jsem pochopil, je, že je třeba identifikovat své zařízení, abychom zjistili, jaký ovladač pro něj může být vhodný.
Část 1. Identifikace zařízení
Při připojení zařízení k portu samozřejmě žádná LED dioda nezhasla. A vůbec není jasné, zda něco funguje nebo ne.
Nejprve chci zjistit, zda jádro vidí naše zařízení, podívám se do 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
Ukázalo se, že jej vidí, a je jasné, že tam je čip Realtek a samotný VID/PID zařízení na sběrnici USB.
Jdeme dál, podíváme se lsusb, a zde nás číhá další neúspěch
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
Systém neví, co je to za zařízení, a stydlivě zobrazuje prázdné místo místo názvu (i když vendor=2357 je určitě TP-Link).
V této fázi si zvídavý čtenář pravděpodobně již všiml něčeho zajímavého, ale to odložíme na později.
Výzkum problému prázdných názvů mě dovedl na web s identifikátory, kde se shromažďují informace o známých VID/PID. Náš 2357:0111 tam nebyl. Jak se později ukázalo, nástroj lsusb používá soubor /usr/share/misc/usb.ids, který je stejným seznamem identifikátorů z této stránky. Pro lepší zobrazení jsem do svého systému přidal řádky pro dodavatele TP-Link.
2357 TP-Link
0111 TL-WN727N v5.21
Takže zobrazení v seznamu zařízení jsme opravili, ale k výběru ovladače nás to nijak neposunulo. Pro výběr ovladače je potřeba vědět, na jakém čipu je váš adaptér vyroben. Další neúspěšné pokusy zjistit to na internetu nikam nevedly. Vybaven jemným plochým šroubovákem opatrně odklápím kryt adaptér a před mým zrakem se v celé své původní nahotě zjevuje hříšný výtvor strýčka Liao. Pod lupou lze vidět název čipu — RTL8188EUS. To už je dobré. Na nějakých fórech jsem viděl příspěvky, že pro tento čip se dobře hodí právě ovladač onoho pána lwfinger (i přesto, že tam je napsáno jen o RTL8188EU).
Část 2. Nadřazenost Borna
Stahuji zdrojový kód ovladače z gitu.
Nastalo čas přeinstalovat Windows a věnovat se tomu, co se obvykle spojuje s linuxáky — kompilaci něčeho ze zdrojových kódů. Kompilace ovladačů se, jak se ukázalo, málo liší od kompilace programů:
make
sudo make install
ale pro kompilaci modulů jádra potřebujeme hlavičkové soubory jádra pro naši konkrétní verzi.
Ve standardním repozitáři je balíček raspberrypi-kernel-headers, ale obsahuje verzi souborů pro jádro 4.19.66-v7l+, a to nám nevyhovuje. Ale pro získání hlaviček potřebné verze, jak se ukázalo, existuje užitečný nástroj rpi-source (odkaz na konci na GitHubu), pomocí kterého si můžeme stáhnout potřebné hlavičky. Klonujeme repozitář, děláme skript spustitelným, spouštíme. První spuštění selže s chybou — chybí utilita bc. Naštěstí je v repozitáři a jednoduše ji nainstalujeme.
sudo apt-get install bc
Po tomto opakovaném spuštění a stažení hlaviček (a pak nastavení něčeho, teď už si nepamatuji) zabere nějaký čas a můžeme se opřít do židle, Windows se stalo lepším ve všech svých projevech.
Jakmile se všechny hlavičky stáhnou, zkontrolujeme, že se objevil adresář /lib/modules/4.19.73-v7+ a v něm symlink ukazuje na to místo, kde jsou stažené soubory (u mě 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
Přípravná fáze byla dokončena, můžeme přistoupit ke skládání. Skládání modulů opět zabere určitou dobu, Raspberry Pi není moc rychlý (má 32bitový procesor 900Mhz Cortex ARM v7).
Takže, všechno se zkompilovalo. Nainstalujeme ovladač ve druhém kroku (make install), při tom se zkopírují další soubory firmwaru potřebné pro práci ovladače:
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/.
Část 3. Ultimátum Borna
Zastrčím USB do portu a... nic se neděje. Bylo to všechno zbytečné?
Začínám prozkoumávat soubory uvnitř projektu a v jednom z nich nacházím příčinu problému: ovladač uvádí kompletní seznam identifikátorů VID/PID, které může obsluhovat. Aby naše zařízení s tímto ovladačem fungovalo, jednoduše jsem přidal svůj identifikátor do souboru 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 */
};
Ovladač jsem znovu zkompiloval a znovu ho nainstaloval do systému.
A tentokrát se všechno rozjelo. Světlo na adaptéru se rozsvítilo a v seznamu síťových rozhraní se objevilo nové zařízení.
Zobrazení bezdrátových rozhraní ukazuje následující:
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 pro ty, kteří dočetli až do konce
Pamatujete, jak jsem říkal, že nezáleží na tom, jaká je maximální rychlost uvedena na vašem adaptéru?
Aha, na Raspberry Pi (před vydáním modelu 4) jsou všechna zařízení (včetně ethernet adaptéru) připojena na jedné USB sběrnici. Skvělé, že? A proto se propustnost USB sběrnice dělí mezi všechna zařízení na ní. Při měření rychlosti jak přes ethernet, tak přes USB Wi-Fi (připojená k jednomu routeru) a vzduchem, stejně jako po kabelu to ukazovalo kolem 20 Mbit/s.
P.S. Tento návod ke kompilaci ovladače pro tento konkrétní adaptér platí nejen na RPI. Já jsem ho pak zopakoval i na svém desktopu s Linux Mint — tam také všechno fungovalo. Jen si musíte stáhnout potřebné hlavičkové soubory pro vaši používanou verzi jádra.
UPD. Odborníci mi poradili: abychom nedependovali na verzi jádra, musíme ovladače sestavit a nainstalovat pomocí dkms. Tato možnost je také uvedena v readme k ovladači.
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. Navržený pro device id byl přijat do mainstream větve repozitáře lwfinger/rtl8188eu.
Odkazy
—
—
—
—
Zdroj: habr.com
