Pojďme se spřátelit s RaspberryPi s TP-Link TL-WN727N

Čau Habr!

Jednou jsem se rozhodl připojit svou malinu k internetu vzduchem.

Sotva řečeno, než uděláno, za tímto účelem jsem si v nejbližší prodejně pořídil usb wi-fi píšťalku od známé firmy TP-Link. Hned řeknu, že to není nějaký druh nano usb modulu, ale docela velké zařízení o velikosti běžného flash disku (nebo, chcete-li, velikosti ukazováčku dospělého muže). Před nákupem jsem si udělal malý průzkum v seznamu podporovaných výrobců píšťal pro RPI a TP-Link byl na seznamu (jak se však později ukázalo, nebral jsem v úvahu jemnosti, protože čert, jak víme , je v detailech). Chladný příběh mých neštěstí tedy začíná, představujeme vám detektivku ve 3 částech. Zájemci se obracejte na kat.

Článek Připojení WiFi adaptéru WN727N k Ubuntu/Mint Pomohlo mi to částečně, ale nejdřív.

Podmínky problému

Vzhledem k:

  1. jednodeskový počítač Raspberry Pi 2 B v1.1 – 1 kus
  2. usb wi-fi píšťalka WN727N - 1 kus
  3. pár ne zcela křivých rukou - 2 kusy
  4. Jako operační systém je nainstalován nejnovější Raspbian (založený na Debian 10 Buster)
  5. verze jádra 4.19.73-v7+

Najít: připojení k internetu (Wi-Fi je distribuováno z vašeho domácího routeru)

Po rozbalení adaptéru jsem si přečetl pokyny uvnitř:

Kompatibilita systému: Windows 10/8/7/XP (dokonce i nebe, dokonce i XP) a MacOS 10.9-10.13

Hmm, jako obvykle ani slovo o Linuxu. Bylo to 2k19 a ovladače bylo ještě potřeba složit ručně...

Měli jsme s sebou 2 kompilátory, 75 tisíc knihoven, pět binárních kuliček, polovinu pole nahých žen s logem a celé moře záhlaví všech jazyků a značek. Ne, že by to byla nezbytná sada pro práci. Ale jakmile začnete sestavovat systém pro sebe, je těžké přestat. Jediné, co mě znepokojovalo, byly ovladače pro wi-fi. Není nic bezmocnějšího, nezodpovědnějšího a zkorumpovanějšího než vytváření ovladačů ze zdroje. Ale věděl jsem, že dříve nebo později přejdeme na tyhle svinstva.

Obecně, jak víte, hrát si s usb wi-fi v Linuxu je bolestivé a poněkud bez chuti (jako ruské sushi).

Krabice obsahuje i CD s ovladači. Bez velké naděje se dívám na to, co na něm je - rozhodně se o to nestarali. Hledání na internetu mě přivedlo na web výrobce, ale tam je ovladač pro Linux pouze pro revizi zařízení v4a byl v mém náručí v5.21. A kromě toho pro velmi staré verze jádra 2.6-3.16. Odrazen neúspěchem na samém začátku jsem si už říkal, že jsem měl vzít TL-WN727N (je trochu dražší a u mě zvládne 300Mbps versus 150, ale jak se ukázalo, tohle vůbec nevadí u maliny, o tom bude napsáno později). Nejdůležitější ale je, že ovladače pro něj již existují a jednoduše se nainstalují jako balíček firmware-ralink. Revizi zařízení si obvykle můžete prohlédnout na těle zařízení na štítku vedle sériového čísla.

Další googlování a navštěvování různých fór moc dobrého nepřineslo. Zjevně nikdo přede mnou nezkoušel připojit takový adaptér k Linuxu. Hmm, mám štěstí jako utopenec.

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 byla zmínka o jistém panu lwfingerovi, který se proslavil psaním řady ovladačů pro Wi-Fi adaptéry . Jeho git repozitář je na konci článku v odkazech. A druhá lekce, kterou jsem se naučil, je, že musíte své zařízení identifikovat, abyste pochopili, který ovladač pro něj může být vhodný.

Část 1: Bourneova identita

Po zapojení zařízení do portu se samozřejmě žádná LED nerozsvítila. A obecně není žádným způsobem jasné, zda něco funguje nebo ne.

Nejprve, abych zjistil, 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 vidí, a dokonce je jasné, že na sběrnici usb je čip Realtek a VID/PID samotného zařízení.

Pojďme dál a podívejme se lsusb, a zde nás čeká 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í, o jaký druh zařízení se jedná, a ostýchavě ukazuje místo názvu prázdné místo (ačkoli vendor=2357 je určitě TP-Link).

V této fázi si zvídavý čtenář již pravděpodobně všiml něčeho zajímavého, ale to necháme až na naši dobu.

Zkoumání problému prázdných jmen mě přivedlo na stránku s identifikátory, kde se zadávají informace o známých VID/PID. Naše 2357:0111 tam nebyla. Jak se později ukázalo, utilita lsusb používá soubor /usr/share/misc/usb.ids, což je stejný seznam ID z tohoto webu. Pro krásu displeje jsem do svého systému jednoduše přidal řádky pro dodavatele TP-Link.

2357  TP-Link
        0111  TL-WN727N v5.21

Opravili jsme displej v seznamu zařízení, ale nepřiblížilo nás to ani o krok blíže k výběru ovladače. Pro výběr ovladače potřebujete vědět, na jakém čipu je vaše píšťalka vyrobena. Další neúspěšné pokusy zjistit to na internetu nevedly k ničemu dobrému. Vyzbrojen tenkým štěrbinovým šroubovákem opatrně vypáčím krytku adaptéru a objeví se zlomyslné dítě strýčka Liaa v celé své původní nahotě. Pod lupou vidíte název čipu - RTL8188EUS. To už je dobré. Na některých fórech jsem viděl příspěvky, že ovladač od stejného pána lwfingera se pro tento čip dobře hodí (i když píše jen o RTL8188EU).

Část 2: Bourneova nadvláda

Zdroje ovladačů stahuji z Gitu.

Je čas přeinstalovat Windows a udělat to, s čím jsou uživatelé Linuxu obvykle spojováni – sestavit něco z nějakého druhu. Sestavení ovladačů, jak se ukázalo, se jen málo liší od kompilace programů:

make
sudo make install

ale ke kompilaci modulů jádra potřebujeme hlavičkové soubory jádra pro naši konkrétní verzi.

Ve skladovém úložišti je balíček raspberrypi-kernel-headers, ale obsahuje verzi jádra souborů 4.19.66-v7l+, a to se nám nehodí. Ale k získání záhlaví požadované verze, jak se ukázalo, existuje pohodlný nástroj zdroj rpi (odkaz na konci na Github), pomocí kterého si můžete stáhnout potřebné hlavičky. Naklonujeme úložiště, uděláme skript spustitelným a spustíme jej. První spuštění se nezdaří s chybou - neexistuje žádný nástroj bc. Naštěstí je v úložišti a my ho jen nainstalujeme.

sudo apt-get install bc

Poté restartování a stažení hlaviček (a následné nastavení něčeho, teď si nepamatuji) nějakou dobu trvá a můžete se posadit na židli, Windows se zlepšil ve všech svých projevech.

Po stažení všech hlaviček zkontrolujte, zda se adresář zobrazuje /lib/modules/4.19.73-v7+ a v něm symbolický odkaz ukazuje na místo, kde se nacházejí stažené soubory (pro 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ůžete začít s montáží. Opětovné sestavení modulů nějakou dobu trvá, Raspberry není žádná rychlá bestie (má 32bit 900Mhz Cortex ARM v7).
Takže vše zkompilováno. Ovladač nainstalujeme ve 2. kroku (proveďte instalaci) a zároveň zkopírujeme další soubory firmwaru potřebné pro fungování 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. Bourneovo ultimátum

Zapojím píšťalku do portu a... nic se neděje. Bylo to všechno k ničemu?

Začnu studovat soubory uvnitř projektu a v jednom z nich najdu, v čem byl problém: ovladač specifikuje úplný seznam identifikátorů VID/PID, které může obsloužit. A aby naše zařízení s tímto ovladačem fungovalo, jednoduše jsem do souboru přidal své id 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 */
};

Znovu jsem zkompiloval ovladač a přeinstaloval jej do systému.

A tentokrát vše začalo. Kontrolka na adaptéru se rozsvítila 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:"<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 pro ty, kteří dočetli až do konce

Pamatujete si, jak jsem řekl, že nezáleží na maximální rychlosti uvedené na vašem adaptéru?
Takže na Malince (před vydáním modelu 4) jsou všechna zařízení (včetně ethernetového adaptéru) umístěna na stejné sběrnici USB. Skvělé, že? A proto je šířka pásma usb sběrnice rozdělena mezi všechna zařízení na ní. Při měření rychlosti jak přes ethernet, tak přes usb wi-fi (připojeno na 1 router) jak vzduchem, tak drátem, se pohybovala kolem 20Mbit/s.

PS Obecně platí, že tato příručka pro kompilaci ovladače pro tento konkrétní adaptér platí nejen pro RPI. Zopakoval jsem to pak na ploše s Linux Mintem – tam taky všechno fungovalo. Stačí si stejným způsobem stáhnout potřebné hlavičkové soubory pro vaši verzi jádra.

UPD. Zkušení lidé navrhovali: Abyste nezáviseli na verzi jádra, musíte shromáždit a nainstalovat ovladače pomocí dkms. Readme pro ovladač také obsahuje tuto možnost.

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ženo patch for device id byl přijat do hlavní větve úložiště lwfinger/rtl8188eu.

reference
- RPi USB Wi-Fi adaptéry
- Gitbub lwfinger/rtl8188eu
- usb.ids
- zdroj rpi

Zdroj: www.habr.com