Priateľenie RaspberryPi s TP-Link TL-WN727N

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 Pripojujeme WiFi adaptér WN727N k Ubuntu/Mint čiastočne mi to pomohlo, ale všetko po poriadku.

Podmienky úlohy

Dané:

  1. jednodeskový počítač Raspberry Pi 2 B v1.1 — 1 kus
  2. USB Wi-Fi adaptér WN727N — 1 kus
  3. pár nie úplne krivých rúk — 2 kusy
  4. ako operačný systém je nainštalovaný posledný Raspbian (na báze debian 10 Buster)
  5. 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é záplata pre device id bolo prijaté do hlavného prúdu repozitára lwfinger/rtl8188eu.

Odkazy
— RPi USB Wi-Fi adaptéry
— GitHub lwfinger/rtl8188eu
— usb.ids
— rpi-source

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster