Hello, Habr!
Nekega dne sem se odločil, da bom svojo malinko povezal z internetom na daljavo.
Zasnovano in narejeno, zato sem v najbližji trgovini kupil usb wi-fi adapter znane blagovne znamke TP-Link. Takoj moram reči, da to ni nek nanosusb modul, temveč precej velik naprava, velika približno kot običajen USB ključek (ali, če želite, kot kazalec odraslega moškega). Pred nakupom sem nekoliko preučil seznam podprtih adapterjev za RPI in TP-Link je bil na seznamu (vendar se je izkazalo, da sem pozabil na podrobnosti, saj se, kot je znano, hudič skriva v podrobnostih). Zdaj se začne moj hladni zapis o nesrečah, vaša pozornost je usmerjena na detektivsko zgodbo v treh delih. Zainteresirane prosim, da nadaljujejo.
na Lifehackerju. delno mi je pomagal, ampak vse po vrsti.
Pogoji naloge
Dano:
- enotna plošča Raspberry Pi 2 B v1.1 — 1 kos
- usb wi-fi adapter WN727N — 1 kos
- par ne ravno krivih rok — 2 kosi
- kot operacijski sistem je nameščen najnovejši Raspbian (na osnovi debiana 10 Buster)
- jedro različice 4.19.73-v7+
Najti: vzpostaviti povezavo z internetom (WiFi se deli z domačega usmerjevalnika)
Po razpakiranju adapterja preberem navodila znotraj:
Združljivost sistema: Windows 10/8/7/XP (tudi XP) in MacOS 10.9-10.13
Hm, o Linuxih pa seveda nobene besede. Leto 2019, a gonilniki jih je bilo še vedno treba ročno sestaviti…
Imeli smo s seboj 2 prevajalnika, 75 tisoč knjižnic, pet binarnih blobov, pol matričnih golih punc z logotipom in celo morje headerjev vseh jezikov in oznak. Ni bilo nujno potreben komplet za delo. Ampak, ko začneš sestavljati sistem po svoji meri, postane težko prenehati. Edina stvar, ki me je skrbela, so bili gonilniki za wi-fi. Nič ni bolj nemočno, brezvestno in pokvarjeno kot sestavljanje gonilnikov iz izvorne kode. Ampak vedel sem, da bomo prej ali slej prešli tudi na to težavo.
Splošno znano je, da je mučenje z usb wi-fi na Linuxu boleče in nekoliko neprijetno (kot ruski suši).
V škatli je še CD z gonilniki. Brez posebne upanja gledam, kaj je tam — čisto nič, niso se potrudili. Iskanje po internetu me je pripeljalo na spletno stran proizvajalca, a tam so bili linux gonilniki le za različico naprave v4, jaz pa sem imel v rokah v5.21. In addition, it works with very old kernel versions 2.6-3.16. Discouraged by the failure right at the start, I thought I should have chosen the TL-WN727N (which is a bit more expensive and supports 300Mbps compared to 150 of mine), but as it turned out, this doesn’t really matter for the Raspberry Pi, which I’ll explain later). But the most important thing is that drivers for it are already available and can be installed easily via a package. firmware-ralink. You can usually find the revision of the device on the case next to the serial number on a sticker.
Further Googling and visiting various forums didn't yield anything particularly helpful. Apparently, no one before me had tried connecting this exact adapter on Linux. Well, I seem to have the luck of a drowned person.
Although no, I take that back, visiting forums (mostly in English) also bore fruit; in some threads, there was mention of a certain mr. lwfinger, who is famous for having written a number of drivers for WiFi adapters. His GitHub repository will be linked at the end of the article. And the second lesson I learned is that you need to identify your device to understand which driver might be suitable for it.
Part 1. Identifying the Device
When plugging in the device, obviously, no LED lights up. And it's not clear in any way whether something is working or not.
First, to find out if the kernel sees our device, I check 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
It turns out it is detected, and it is clear that the chip is Realtek, with the VID/PID of the device on the USB bus.
Let's move on and check. lsusb, and here we encounter another failure.
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
The system does not recognize what this device is and embarrassingly shows a blank space instead of a name (although vendor=2357 is definitely TP-Link).
At this stage, an inquisitive reader might have already noticed something interesting, but we'll put that off for now.
Researching the issue of blank names led me to a site with identifiers, which keeps track of information on known VID/PID. Our 2357:0111 was not there. As it turned out later, the utility lsusb uporablja datoteko /usr/share/misc/usb.ids, ki je enaka seznamu identifikatorjev s te strani. Za lepšo prikazovanje sem preprosto dodal vrstice za dobavitelja TP-Link v svoj sistem.
2357 TP-Link
0111 TL-WN727N v5.21
No, prikaz v seznamu naprav smo popravili, a izbira gonilnika nas ni prav nič približala. Za izbiro gonilnika je treba vedeti, na katerem čipu je narejen vaš adapter. Ponovno neuspešni poskusi, da bi to ugotovili na spletu, niso obrodili sadov. Opremljen s tankim izvijačem previdno odklepam pokrovček adapterja in pred mojimi očmi se v vsej svoji prvotni goloti pojavi pregrešno dete strica Ljaa. Pod lupo lahko vidimo naziv čipa — RTL8188EUS. To je že dobro. Na nekaterih forumih sem videl objave, da je za ta čip dobro primeren prav ta gonilnik gospoda lwfingerja (tudi če piše samo o RTL8188EU).
Del 2. Prednost Borna
Prenosim izvorne datoteke gonilnika iz git-a.
Prišla je čas, da ponovno namestim Šindous in se lotim tistega, kar običajno povezujejo z linuxarji — sestavo nečesa iz izvorov. Sestava gonilnikov se kot se zdi malo razlikuje od kompilacije programov:
make
sudo make install
ampak za kompilacijo modulov jedra potrebujemo glave jedra za našo specifično različico.
V privatem repozitoriju je paket raspberrypi-kernel-headers, vendar vsebuje različico datotek za jedro 4.19.66-v7l+, in to nam ne ustreza. Vendar se je izkazalo, da obstaja priročno orodje za pridobitev glav potrebne različice rpi-source (povezava na koncu na GitHubu), s katerim lahko prenesemo potrebne glave. Kloniramo repozitorij, naredimo skripto izvršljivo in jo zaženemo. Prvi zagon se konča z napako — manjkajoča orodje bc. Na srečo je na voljo v repozitoriju in jo preprosto namestimo.
sudo apt-get install bc
Potem ponovni zagon in prenos glav (in nato nastavitev nečesa, zdaj se ne spomnim več) traja nekaj časa in lahko se znebimo stresa, windoos se je izboljšal v vseh svojih manifestacijah.
Ko so vse glave prenesene, preverimo, da se je pojavil imenik /lib/modules/4.19.73-v7+ in v njem simbolna povezava kaže na mesto, kjer so prenesene datoteke (pri meni 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 zaključena, lahko začnemo s sestavljanjem. Sestavljanje modulov vzame določen čas, malinca ni hitro (ima 32bit 900Mhz Cortex ARM v7).
Torej, vse se je skompiliralo. Namestimo gonilnik v 2. koraku (make install), pri tem pa se kopirajo tudi drugi datoteke firmware, 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/.
Del 3. Ultimatum Borne
Vstavljam USB ključek v priključek in … nič se ne zgodi. Ali je bilo vse to zaman?
Začnem raziskovati datoteke znotraj projekta in v eni izmed njih najdem, kje je bila težava: v gonilniku je navedena celotna lista identifikatorjev VID/PID, ki jih lahko obravnava. Da bi naše 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 */
};
Ponovno sem prekompiliral gonilnik in ga ponovno namestil v sistemu.
In tokrat je vse delovalo. Lučka na adapterju se je prižgala in v seznamu omrežnih vmesnikov se je pojavila nova naprava.
Pregled brezžičnih vmesnikov kaže naslednje:
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 za tiste, ki so do konca prebrali
Se spomnite, kako sem povedal, da ni pomembno, kakšna je maksimalna hitrost, ki je navedena na vašem adapterju?
Na Raspberry Pi (do izdanja modela 4) su svi uređaji (uključujući ethernet adapter) povezani preko iste USB magistrale. Super, zar ne? Stoga se propusnost USB magistrale deli između svih uređaja na njoj. Prilikom merenja brzine, i preko ethernet-a, i preko USB Wi-Fi (priključeni na 1 ruter) i bežično, i žično, daje oko 20 Mbit/s.
P.S. Ovaj vodič za kompilaciju drajvera za ovaj konkretni adapter važi ne samo za RPI. Ponovo sam ga odradio na svom desktopu sa Linux Mint — tamo je sve takođe radilo. Samo trebate preuzeti potrebne zaglavlja za verziju jezgra koju koristite.
UPD. Znate li, ljudi su mi rekli: da ne zavisite od verzije jezgra, treba da pravite i instalirate drajvere pomoću dkms. U readme-u za drajver postoji i ova opcija.
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ženi device id je prihvaćen u mainstream granu repozitorijuma lwfinger/rtl8188eu.
Povezave
—
—
—
—
Izvor: habr.com
