Upoznajmo RaspberryPi sa TP-Link TL-WN727N

Hej Habr!

Jednom sam odlučio da svoj malin povežem sa internetom preko vazduha.

Tek što je rečeno, u tu svrhu kupio sam u najbližoj radnji usb wi-fi zviždaljku poznate kompanije TP-Link. Odmah ću reći da ovo nije neka vrsta nano usb modula, već prilično veliki uređaj, veličine običnog fleš diska (ili, ako želite, veličine kažiprsta odraslog muškarca). Prije kupovine, malo sam istražio listu podržanih proizvođača zviždaljki za RPI i TP-Link je bio na listi (međutim, kako se kasnije ispostavilo, nisam uzeo u obzir suptilnosti, jer đavo, kao što znamo , nalazi se u detaljima). Dakle, počinje hladna priča o mojim nesrećama; predstavljamo vam detektivsku priču u 3 dijela. Za sve zainteresovane obratite se kat.

Članak Povezivanje WN727N WiFi adaptera na Ubuntu/Mint Delimično mi je pomoglo, ali prvo.

Uslovi problema

S obzirom:

  1. jednopločni računar Raspberry Pi 2 B v1.1 – 1 kom
  2. usb wi-fi zviždaljka WN727N - 1 kom
  3. par ne sasvim iskrivljenih ruku - 2 komada
  4. Najnoviji Raspbian je instaliran kao OS (bazirano na Debian 10 Buster)
  5. kernel verzija 4.19.73-v7+

Pronađite: povežite se na internet (Wi-Fi se distribuira sa vašeg kućnog rutera)

Nakon što sam raspakovao adapter, pročitao sam uputstva unutra:

Kompatibilnost sistema: Windows 10/8/7/XP (čak i nebo, čak i XP) i MacOS 10.9-10.13

Hmm, kao i obično, ni riječi o Linuxu. Bilo je 2k19, a drajvere je još trebalo ručno sastaviti...

Imali smo sa sobom 2 kompajlera, 75 hiljada biblioteka, pet binarnih mrlja, pola niza golih žena sa logom i čitavo more zaglavlja svih jezika i oznaka. Nije da je ovo neophodan set za posao. Ali kada jednom počnete da sastavljate sistem za sebe, postaje teško zaustaviti se. Jedina stvar koja me je zabrinula su drajveri za wi-fi. Ne postoji ništa bespomoćnije, neodgovornije i korumpiranije od izgradnje pokretača iz izvora. Ali znao sam da ćemo prije ili kasnije preći na ovo smeće.

Općenito, kao što znate, petljanje s usb wi-fijem na Linuxu jeste bolno i pomalo neukusno (kao ruski suši).

U kutiji se nalazi i CD sa drajverima. Bez mnogo nade gledam šta je na njemu - definitivno se nisu pobrinuli za to. Internet pretraga me je dovela do web stranice proizvođača, ali tamo postoji Linux drajver samo za reviziju uređaja v4, a u mom naručju bio v5.21. Osim toga, za vrlo stare verzije kernela 2.6-3.16. Obeshrabren neuspjehom na samom početku, već sam mislio da sam trebao uzeti TL-WN727N (malo je skuplji i može podnijeti 300Mbps naspram 150 za moj, ali kako se ispostavilo, to uopće nije važno za malinu, o tome će biti pisano kasnije). Ali najvažnije je da drajveri za njega već postoje i da se jednostavno instaliraju kao paket firmware-ralink. Obično možete vidjeti reviziju uređaja na tijelu uređaja na naljepnici pored serijskog broja.

Dalje guglanje i posjećivanje raznih foruma nije donijelo mnogo dobrog. Očigledno niko prije mene nije pokušao spojiti takav adapter na Linux. Hmm, ja sam sretan kao utopljenik.

Mada, ne, lažem, i posećivanje foruma (uglavnom onih na engleskom) je urodilo plodom, u nekim temama se pominjao izvesni gospodin lwfinger, koji je poznat po tome što je napisao niz drajvera za Wi-Fi adaptere . Njegov git repozitorij je na kraju članka u linkovima. I druga lekcija koju sam naučio je da morate identificirati svoj uređaj kako biste razumjeli koji bi upravljački program mogao biti prikladan za njega.

Dio 1: Bourneov identitet

Kada je uređaj priključen na port, naravno, nije svijetlila LED dioda. I općenito nije jasno da li nešto funkcionira ili ne.

Prije svega, da saznam da li kernel vidi naš uređaj, pogledam u 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

Ispostavilo se da vidi, a čak je i jasno da postoji Realtek čip i VID/PID samog uređaja na usb magistrali.

Idemo dalje i pogledajmo lsusb, a tu nas čeka još jedan neuspjeh

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 zna o kakvom se uređaju radi i stidljivo pokazuje prazan prostor umjesto imena (iako je vendor=2357 definitivno TP-Link).

U ovoj fazi radoznali čitalac je vjerovatno već primijetio nešto zanimljivo, ali ćemo to ostaviti do našeg vremena.

Istraživanje problema praznih imena dovelo me je do sajta sa identifikatorima, gde se unose podaci o poznatim VID/PID-u. Naš 2357:0111 nije bio tamo. Kako se kasnije ispostavilo, uslužni program lsusb koristi fajl /usr/share/misc/usb.ids, što je ista lista ID-ova sa ove stranice. Zbog lepote ekrana, jednostavno sam dodao linije za dobavljača TP-Link u svom sistemu.

2357  TP-Link
        0111  TL-WN727N v5.21

Pa, ispravili smo prikaz na listi uređaja, ali to nas nije dovelo ni korak bliže odabiru drajvera. Da biste odabrali vozača, morate znati na kojem čipu je napravljena vaša zviždaljka. Sljedeći neuspješni pokušaji da se to sazna na internetu nisu doveli do ničega dobrog. Naoružan tankim šrafcigerom, pažljivo skidam poklopac adaptera i opaka zamisao ujaka Liaoa pojavljuje se u svoj svojoj iskonskoj golotinji. Pod lupom možete vidjeti naziv čipa - RTL8188EUS. Ovo je već dobro. Na nekim forumima sam vidio postove da je drajver tog istog gospodina lwfingera dobro prilagođen za ovaj čip (iako piše samo o RTL8188EU).

Dio 2: Bourneova nadmoć

Izvore drajvera preuzimam sa Gita.

Vrijeme je da ponovo instalirate Windows i učinite ono s čime se korisnici Linuxa obično povezuju - sastavljanje nečega od nekih vrsta. Sklapanje drajvera, kako se ispostavilo, malo se razlikuje od kompajliranja programa:

make
sudo make install

ali za kompajliranje modula kernela potrebni su nam fajlovi zaglavlja kernela za našu specifičnu verziju.

Postoji paket u skladištu zaliha raspberrypi-kernel-headers, ali sadrži verziju kernela datoteka 4.19.66-v7l+, a to nam ne odgovara. Ali da biste dobili zaglavlja potrebne verzije, kako se ispostavilo, postoji zgodan alat rpi-source (link na kraju na Githubu), sa kojim možete preuzeti potrebna zaglavlja. Kloniramo spremište, činimo skriptu izvršnom i pokrećemo je. Prvo pokretanje ne uspijeva s greškom - nema uslužnog programa bc. Srećom, nalazi se u spremištu i jednostavno ga instaliramo.

sudo apt-get install bc

Nakon ovoga, ponovno pokretanje i preuzimanje zaglavlja (i zatim podešavanje nečega, sad se ne sjećam) traje neko vrijeme i možete se zavaliti u svoju stolicu, Windows je postao bolji u svim svojim manifestacijama.

Nakon što su sva zaglavlja preuzeta, provjerite da li se pojavljuje direktorij /lib/modules/4.19.73-v7+ a u njemu simbolična veza ukazuje na mjesto gdje se nalaze preuzeti fajlovi (za mene 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

Pripremna faza je završena, možete započeti montažu. Ponovno sklapanje modula traje neko vrijeme, Raspberry nije brza zvijer (ima 32-bitni 900Mhz Cortex ARM v7).
Dakle, sve je sastavljeno. Instaliramo drajver u 2. koraku (napravimo instalaciju), dok također kopiramo još fajlova firmvera potrebnih za rad drajvera:

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

Dio 3. Bourneov ultimatum

Utaknem pištaljku u port i... ništa se ne dešava. Je li sve bilo uzalud?

Počinjem proučavati fajlove unutar projekta i u jednom od njih pronalazim u čemu je bio problem: drajver specificira kompletnu listu VID/PID identifikatora koje može poslužiti. A da bi naš uređaj radio sa ovim drajverom, jednostavno sam dodao svoj ID u fajl 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 */
};

Ponovo sam kompajlirao drajver i ponovo ga instalirao na sistem.

I ovog puta je sve počelo. Lampica na adapteru se upalila i novi uređaj se pojavio na listi mrežnih interfejsa.

Pregled bežičnih interfejsa pokazuje sledeće:

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 one koji pročitaju do kraja

Sjećate se kako sam rekao da nije važno koja je maksimalna brzina navedena na vašem adapteru?
Dakle, na Malinki (prije izlaska modela 4) svi uređaji (uključujući ethernet adapter) sjede na istoj usb magistrali. Odlično, zar ne? Zbog toga je propusni opseg usb magistrale podijeljen između svih uređaja na njoj. Prilikom mjerenja brzine i preko etherneta i preko usb wi-fi (povezan na 1 ruter) i zrakom i žicom, iznosila je oko 20Mbit/s.

PS Općenito, ovaj vodič za kompajliranje drajvera za ovaj određeni adapter vrijedi ne samo za RPI. Zatim sam to ponovio na svom desktopu sa Linux Mint-om - sve je radilo i tamo. Vi samo trebate preuzeti potrebne datoteke zaglavlja za svoju verziju kernela na isti način.

UPD. Stručnjaci su predložili: kako ne biste ovisili o verziji kernela, trebate prikupiti i instalirati drajvere pomoću dkms-a. Readme za drajver takođe sadrži ovu opciju.

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. Predloženo patch za ID uređaja je prihvaćen u mainstream granu lwfinger/rtl8188eu spremišta.

reference
- RPi USB Wi-Fi adapteri
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-source

izvor: www.habr.com