Spoprijateljimo se z RaspberryPi s TP-Link TL-WN727N

Pozdravljeni, Habr!

Enkrat sem se odločil, da svojo malino povežem z internetom po zraku.

Rečeno kot storjeno, v ta namen sem v najbližji trgovini kupil usb wi-fi piščalko znanega podjetja TP-Link. Takoj bom rekel, da to ni nekakšen nano usb modul, ampak precej velika naprava, približno velikosti običajnega bliskovnega pogona (ali, če želite, velikosti kazalca odraslega moškega). Pred nakupom sem malo raziskal seznam podprtih proizvajalcev piščalk za RPI in na seznamu je bil TP-Link (vendar, kot se je kasneje izkazalo, nisem upošteval tankosti, ker hudič, kot vemo , je v podrobnostih). Tako se začne hladna zgodba o mojih nesrečah, vaši pozornosti predstavljamo detektivsko zgodbo v treh delih. Kogar zanima, se obrnite na kat.

Članek Povezovanje adapterja WN727N WiFi z Ubuntu/Mint Pomagalo mi je delno, ampak najprej.

Pogoji problema

Glede na:

  1. računalnik z eno ploščo Raspberry Pi 2 B v1.1 – 1 kos
  2. usb wi-fi piščalka WN727N - 1 kos
  3. par ne povsem ukrivljenih rok - 2 kosa
  4. Najnovejši Raspbian je nameščen kot OS (temelji na Debian 10 Buster)
  5. različica jedra 4.19.73-v7+

Najdi: povežite se z internetom (Wi-Fi se distribuira iz vašega domačega usmerjevalnika)

Po razpakiranju adapterja sem prebral navodila v notranjosti:

Združljivost sistema: Windows 10/8/7/XP (celo nebo, celo XP) in MacOS 10.9-10.13

Hmm, kot ponavadi, niti besede o Linuxu. Bil je 2k19, gonilnike pa je bilo treba še ročno sestaviti...

S seboj smo imeli 2 prevajalnika, 75 tisoč knjižnic, pet binarnih blobov, pol niza golih žensk z logotipom in celo morje glav vseh jezikov in oznak. Ne, da je to potreben komplet za delo. Toda ko začnete sami sestavljati sistem, se je težko ustaviti. Edino kar me je skrbelo so bili gonilniki za wi-fi. Nič ni bolj nemočnega, neodgovornega in pokvarjenega kot ustvarjanje gonilnikov iz vira. Sem pa vedel, da bomo prej ali slej prešli na te smeti.

Na splošno, kot veste, je igranje z usb wi-fi v Linuxu boleče in nekoliko brez okusa (kot ruski suši).

V škatli je tudi CD z gonilniki. Brez velikega upanja pogledam, kaj je na njem - zagotovo niso poskrbeli za to. Iskanje po internetu me je pripeljalo na spletno stran proizvajalca, vendar je tam gonilnik za Linux samo za revizijo naprave v4, in v mojem naročju je bil v5.21. In poleg tega za zelo stare različice jedra 2.6-3.16. Že na začetku sem bil malodušen zaradi neuspeha in sem že pomislil, da bi moral vzeti TL-WN727N (je malo dražji in zmore 300Mbps proti 150 pri mojem, a kot se je izkazalo, to sploh ni pomembno). za malino bo o tem napisano kasneje). Najpomembneje pa je, da gonilniki zanj že obstajajo in so preprosto nameščeni kot paket firmware-ralink. Revizijo naprave si običajno lahko ogledate na ohišju naprave na nalepki poleg serijske številke.

Nadaljnje guglanje in obiskovanje raznih forumov ni prineslo veliko dobrega. Očitno nihče pred mano ni poskusil priključiti takega adapterja na Linux. Hmm, jaz sem srečen kot utopljenec.

Čeprav, ne, lažem, je tudi obiskovanje forumov (predvsem angleških) obrodilo sadove, v nekaterih temah je bil omenjen neki gospod lwfinger, ki je znan po pisanju številnih gonilnikov za Wi-Fi adapterje . Njegov repozitorij git je na koncu članka v povezavah. In druga lekcija, ki sem se je naučil, je, da morate identificirati svojo napravo, da bi razumeli, kateri gonilnik bi lahko bil primeren zanjo.

1. del: Bournova identiteta

Ko je bila naprava priključena na vrata, seveda ni svetila nobena LED. In na splošno nikakor ni jasno, ali nekaj deluje ali ne.

Najprej, da ugotovim, ali jedro vidi našo napravo, pogledam v 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

Izkazalo se je, da vidi in je celo jasno, da je na usb vodilu Realtek čip in VID/PID same naprave.

Pojdimo dalje in poglejmo lsusb, in tukaj nas čaka nov 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 ve, za kakšno napravo gre, in namesto imena sramežljivo pokaže prazen prostor (čeprav je vendor=2357 zagotovo TP-Link).

Na tej stopnji je vedoželjni bralec verjetno že opazil kaj zanimivega, vendar bomo to pustili za naš čas.

Raziskovanje problematike praznih imen me je pripeljalo do strani z identifikatorji, kjer se vpisuje podatek o znanem VID/PID. Našega 2357:0111 ni bilo tam. Kot se je kasneje izkazalo, pripomoček lsusb uporablja datoteko /usr/share/misc/usb.ids, ki je isti seznam ID-jev s tega mesta. Zaradi lepote zaslona sem preprosto dodal vrstice za prodajalca TP-Link v svoj sistem.

2357  TP-Link
        0111  TL-WN727N v5.21

No, popravili smo prikaz na seznamu naprav, vendar nas to ni pripeljalo niti korak bližje izbiri gonilnika. Za izbiro gonilnika morate vedeti, na katerem čipu je narejena vaša piščalka. Naslednji neuspešni poskusi, da bi to izvedeli na internetu, niso pripeljali do nič dobrega. Oborožen s tankim izvijačem z režo, previdno odtrgam pokrovček adapterja in zlobna zamisel strica Liaa se prikaže v vsej svoji neokrnjeni goloti. Pod povečevalnim steklom lahko vidite ime čipa - RTL8188EUS. To je že dobro. Na nekaterih forumih sem zasledil objave, da je gonilnik od istega gospoda lwfinger zelo primeren za ta čip (čeprav piše samo o RTL8188EU).

2. del: Bournova premoč

Izvorne kode gonilnika prenesem iz Gita.

Čas je, da znova namestite Windows in naredite tisto, s čimer uporabnike Linuxa običajno povezujete - sestavite nekaj iz različnih vrst. Izkazalo se je, da se sestavljanje gonilnikov malo razlikuje od prevajanja programov:

make
sudo make install

toda za prevajanje modulov jedra potrebujemo datoteke glave jedra za našo specifično različico.

V zalogi je paket raspberrypi-kernel-headers, vendar vsebuje različico jedra datotek 4.19.66-v7l+, in to nam ne ustreza. Toda za pridobitev glav zahtevane različice, kot se je izkazalo, obstaja priročno orodje rpi-vir (povezava na koncu na Githubu), s katero lahko prenesete potrebne glave. Kloniramo repozitorij, naredimo skript izvršljiv in ga zaženemo. Prvi zagon ne uspe z napako - ni pripomočka bc. Na srečo je v skladišču in ga samo namestimo.

sudo apt-get install bc

Po tem ponovni zagon in prenos glav (in nato nastavitev nečesa, zdaj se ne spomnim) traja nekaj časa in lahko se usedete nazaj na stol, Windows je postal boljši v vseh svojih manifestacijah.

Ko so vse glave prenesene, preverite, ali se prikaže imenik /lib/modules/4.19.73-v7+ in v njem simbolna povezava kaže na mesto, kjer se nahajajo prenesene datoteke (zame 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

Pripravljalna faza je končana, lahko začnete z montažo. Ponovno sestavljanje modulov traja nekaj časa, Raspberry ni hitra žival (ima 32bit 900Mhz Cortex ARM v7).
Torej vse sestavljeno. Gonilnik namestimo v 2. koraku (make install), pri tem pa prekopiramo še več firmware datotek, ki so potrebne za delovanje gonilnika:

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/.

3. del. Bournov ultimat

Priklopim piščalko na vrata in ... nič se ne zgodi. Je bilo vse zaman?

Začnem preučevati datoteke znotraj projekta in v eni od njih najdem, v čem je bila težava: gonilnik poda celoten seznam identifikatorjev VID/PID, ki jih lahko služi. In da bi naša naprava delovala s tem gonilnikom, sem preprosto dodal svoj ID v datoteko 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 */
};

Znova sem prevedel gonilnik in ga znova namestil v sistem.

In tokrat se je vse začelo. Lučka na adapterju je zasvetila in na seznamu omrežnih vmesnikov se je pojavila nova naprava.

Ogled brezžičnih vmesnikov pokaže naslednje:

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 za tiste, ki preberete do konca

Se spomnite, kako sem rekel, da ni pomembno, katera največja hitrost je navedena na vašem adapterju?
Torej, na Malinki (pred izdajo modela 4) so ​​vse naprave (vključno z ethernet adapterjem) na istem usb vodilu. Super, kajne? In zato je pasovna širina vodila usb razdeljena med vse naprave na njem. Pri merjenju hitrosti tako preko etherneta kot preko usb wi-fi (povezan na 1 router) tako po zraku kot po žici je bila okoli 20Mbit/s.

PS Na splošno ta vodnik za prevajanje gonilnika za ta poseben adapter ne velja samo za RPI. Nato sem to ponovil na namizju z Linux Mint - tudi tam je vse delovalo. Na enak način morate samo prenesti potrebne datoteke glave za vašo različico jedra.

UPD. Poznavalci so predlagali: da ne boste odvisni od različice jedra, morate zbrati in namestiti gonilnike z dkms. Readme za gonilnik vsebuje tudi to 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. Predlagano obliž za id naprave je bil sprejet v glavno vejo repozitorija lwfinger/rtl8188eu.

reference
- RPi USB Wi-Fi adapterji
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-vir

Vir: www.habr.com