Vriendschap tussen RaspberryPi en TP-Link TL-WN727N

Hallo, Habr!

Ik besloot op een dag mijn Raspberry Pi draadloos met internet te verbinden.

Gezegd, gedaan; hiervoor kocht ik een usb wi-fi dongle van het welbekende merk TP-Link in de dichtstbijzijnde winkel. Laat ik meteen zeggen dat dit geen van die nano usb-modules is, maar een redelijk groot apparaat ter grootte van een gewone USB-stick (of, als je wilt, net zo groot als de wijsvinger van een volwassene). Voor de aankoop heb ik een beetje onderzoek gedaan naar de lijst van ondersteunde dongles voor de RPI, en TP-Link stond op die lijst (maar zoals later bleek, negeerde ik een aantal details, want de duivel schuilt zoals bekend in de details). Dus, het koude verhaal over mijn avonturen begint hier; ik presenteer u een detectiveverhaal in drie delen. Geïnteresseerden kunnen onder de kat klikken.

Artikel Sluit de WiFi-adapter WN727N aan op Ubuntu/Mint Het hielp me gedeeltelijk, maar alles op zijn tijd.

Taakvoorwaarden

Gegeven:

  1. eenbordcomputer Raspberry Pi 2 B v1.1 — 1 stuk
  2. usb wi-fi dongle WN727N — 1 stuk
  3. een paar niet al te kromme handen — 2 stuks
  4. de nieuwste Raspbian is als besturingssysteem geïnstalleerd (op basis van debian 10 Buster)
  5. kernversie 4.19.73-v7+

Doel: verbindt met internet (wifi komt van de thuisrouter)

Na het uitpakken van de adapter lees ik de instructie binnenin:

Systeemcompatibiliteit: Windows 10/8/7/XP (zelfs XP, zelfs XP) en MacOS 10.9-10.13

Tja, over Linux zoals altijd geen woord. Het was 2019 en de drivers moesten nog steeds handmatig worden samengesteld...

We hadden twee compilators bij ons, 75.000 bibliotheken, vijf binaire blobs, een halve reeks naakte dames met logo's en een hele zee aan headers in alle talen en opmaak. Niet dat dit een noodzakelijke set was voor het werk. Maar als je eenmaal bent begonnen met het samenstellen van een systeem voor jezelf, wordt het moeilijk om te stoppen. Het enige dat me verontrustte, waren de drivers voor wifi. Er is niets zo hulpeloos, onverantwoordelijks en bedorven als het samenstellen van drivers uit de broncode. Maar ik wist dat we vroeg of laat ook aan deze ellende zouden beginnen.

Het is algemeen bekend dat het rommelen met usb wi-fi op Linux pijnlijk en een beetje onsmakelijk is (zoals Russische sushi).

In de doos ligt ook een cd met drivers. Zonder veel hoop kijk ik wat erop staat – juist, ze hebben er niet voor gezorgd. Een zoektocht op internet leidde me naar de website van de fabrikant, maar daar is alleen een Linux-driver voor revisie v4, en ik had v5.21 in handen.. En bovendien voor zeer oude kernversies 2.6-3.16. Gedesillusioneerd door mijn mislukking al in het begin, dacht ik dat ik toch maar de TL-WN727N moest nemen (die is iets duurder en ondersteunt 300Mbps in plaats van 150 van de mijne, maar dat blijkt voor de Raspberry Pi helemaal niet van belang te zijn, daarover later meer). Maar het belangrijkste is dat er al drivers voor zijn en deze gewoon als een pakket kunnen worden geïnstalleerd. firmware-ralink. De revisie van het apparaat kun je meestal vinden op de behuizing van het apparaat op een sticker naast het serienummer.

Verder zoeken op Google en verschillende forums heeft niet veel goeds opgeleverd. Blijkbaar heeft niemand voor mij zo'n specifieke adapter op Linux aangesloten. Mmm, ik heb een beetje pech.

Hoewel nee, ik lieg, het bezoeken van forums (voornamelijk Engelstalige) heeft ook zijn vruchten afgeworpen, in sommige discussies werd een zekere heer lwfinger genoemd, die beroemd is geworden omdat hij verschillende drivers voor wifi-adapters heeft geschreven. Zijn Git-repository is aan het eind van dit artikel in de links. En de tweede les die ik heb geleerd - het is belangrijk om je apparaat te identificeren om te begrijpen welke driver ervoor geschikt kan zijn.

Deel 1. Identificatie van de Adapter

Bij het aansluiten van het apparaat op de poort ging er natuurlijk geen enkele led branden. En het was op geen enkele manier duidelijk of het werkte of niet.

Als eerste om te achterhalen of de kernel ons apparaat ziet, kijk ik in dmesg:

[  965.606998] usb 1-1.3: nieuw high-speed USB apparaat nummer 9 met dwc_otg
[  965.738195] usb 1-1.3: Nieuw USB-apparaat gevonden, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Nieuwe USB-apparaat strings: Mfr=1, Product=2, SerialNumber=3
[  965.738231] usb 1-1.3: Product: 802.11n NIC
[  965.738243] usb 1-1.3: Fabrikant: Realtek
[  965.738255] usb 1-1.3: Serienummer: 00E04C0001

Blijkbaar ziet hij het wel, en het is ook duidelijk dat daar een Realtek chip zit, evenals de VID/PID van het apparaat op de usb-bus.

Laten we verder kijken, lsusb, en hier wacht ons weer een teleurstelling.

Bus 001 Appear 008: ID 2357:0111 
Bus 001 Appear 003: ID 0424:ec00 Standaard Micro-systeem Corp. SMSC9512/9514 Snelle Ethernet Adapter
Bus 001 Appear 002: ID 0424:9514 Standaard Micro-systeem Corp. SMC9514 Hub
Bus 001 Appear 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Het systeem weet niet wat voor apparaat dit is, en toont beschaamd een lege ruimte in plaats van een naam (hoewel vendor=2357 dat is zeker TP-Link).

In deze fase heeft de nieuwsgierige lezer waarschijnlijk al iets interessants opgemerkt, maar dat bewaren we voor later.

Het onderzoeken van het probleem van lege namen leidde me naar een site met identificaties, waar informatie over bekende VID/PID wordt geregistreerd. Onze 2357:0111 bleek daar niet te zijn. Zoals later bleek, was er een utiliteit. lsusb gebruikt het bestand /usr/share/misc/usb.ids, dat dezelfde lijst met identificaties van deze site is. Voor een betere weergave heb ik gewoon regels voor de leverancier TP-Link aan mijn systeem toegevoegd.

2357  TP-Link
        0111  TL-WN727N v5.21

We hebben de weergave in de lijst met apparaten verbeterd, maar dat heeft ons niet dichter bij de selectie van de stuurprogramma's gebracht. Voor het selecteren van een stuurprogramma moet je weten op welke chip jouw dongle is gebaseerd. Herhaalde pogingen om dit online te achterhalen waren niet succesvol. Gewapend met een kleine schroevendraaier til ik voorzichtig het dekseltje van de adapter op en zie het ondeugende kind van ome Liao in al zijn primaire glorie. Onder de loep kunnen we de naam van de chip zien — RTL8188EUS. Dit is al positief. Op sommige forums heb ik berichten gezien dat voor deze chip het stuurprogramma van de heer lwfinger goed werkt (ook al staat er alleen iets over RTL8188EU).

Deel 2. De Superieure Borna

Ik download de bronbestanden van de git.

Het is tijd om Windows opnieuw te installeren en bezig te zijn met wat vaak met Linux-gebruikers wordt geassocieerd — het samenstellen van iets uit de broncode. Het samenstellen van stuurprogramma's blijkt weinig te verschillen van het compileren van programma's:

make
sudo make install

maar voor het compileren van kernelmodules hebben we de headerbestanden van de kernel voor onze specifieke versie nodig.

In de standaardrepository is er een pakket raspberrypi-kernel-headers, maar dit bevat de versie van de bestanden voor de kernel 4.19.66-v7l+, en dat is niet geschikt voor ons. Maar om de headers van de juiste versie te krijgen, is er gelukkig een handige tool rpi-source (link aan het einde op GitHub), waarmee je de benodigde headers kunt downloaden. We klonen de repository, maken het script uitvoerbaar en starten het. Bij de eerste start valt het terug met een foutmelding — het miste een tool bc. Gelukkig is het in de repository aanwezig en installeren we het gewoon.

sudo apt-get install bc

Na deze installatie duurt het een tijdje voordat we de headers opnieuw kunnen starten en downloaden (en dan iets instellen, ik weet het nu niet meer) en kan ik me achterover leunen, Windows is in alle opzichten beter geworden.

Nadat alle headers zijn gedownload, controleren we of de map is aangemaakt /lib/modules/4.19.73-v7+ en deze symlink wijst naar de locatie waar de gedownloade bestanden zijn opgeslagen (bij mij is dat /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

De voorbereidende fase is voorbij, we kunnen beginnen met de assemblage. Het assembleren van de modules kost weer enige tijd, de Raspberry Pi is geen snel apparaat (het heeft een 32-bit 900Mhz Cortex ARM v7 chip).
Dus, alles is gecompileerd. We installeren de driver in stap 2 (make install), terwijl ook enkele firmwarebestanden worden gekopieerd die nodig zijn voor het functioneren van de driver:

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

Deel 3. Ultimatum van Bourne

Ik steek de dongle in de poort en… er gebeurt niets. Was dit alles voor niets?

Ik begin de bestanden in het project te bestuderen en vind in een ervan wat het probleem was: de driver geeft een volledige lijst van VID/PID-identificatie nummers op die hij kan bedienen. En om ervoor te zorgen dat ons apparaat met deze driver werkte, heb ik gewoon mijn id aan het bestand toegevoegd. 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 */
        /*=== Klant-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 */
};

Ik heb de driver opnieuw gecompileerd en opnieuw in het systeem geïnstalleerd.

En deze keer werkte alles. Het lampje op de adapter ging branden en er verscheen een nieuw apparaat in de lijst met netwerkinterfaces.

Het bekijken van de draadloze interfaces levert het volgende op:

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
deth0      geen draadloze extensies.

lo        geen draadloze extensies.

wlan0     niet-geassocieerd  ESSID:""  Vrije naam:""
          Modus:Auto  Frequentie=2.412 GHz  Toegangspunt: Niet-Geassocieerd   
          Gevoeligheid:0/0  
          Herhaling:uit   RTS drempel:uit   Fragment drempel:uit
          Versleutelingssleutel:uit
          Energiebeheer:uit
          Kwaliteit van de verbinding=0/100  Signaalniveau=0 dBm  Ruisniveau=0 dBm
          Rx ongeldig nwid:0  Rx ongeldig crypt:0  Rx ongeldig frag:0
          Tx overdreven herhalingen:0  Ongeldig divers:0   Gemiste beacon:0

Bonus voor degenen die tot het einde hebben gelezen

Vergeet niet dat ik zei dat de maximale snelheid die op uw adapter is aangegeven niet belangrijk is?
Dus, op de Raspberry Pi (tot de release van model 4) zijn alle apparaten (inclusief de ethernetadapter) verbonden via één USB-bus. Best indrukwekkend, nietwaar? En daarom wordt de bandbreedte van de USB-bus gedeeld tussen alle apparaten daarop. Bij het meten van de snelheid via zowel ethernet als USB Wi-Fi (verbonden met één router), zowel draadloos als bedraad, kwam ik rond de 20 Mbps uit.

P.S. Deze gids voor het compileren van de driver voor deze specifieke adapter geldt niet alleen voor de RPI. Ik heb het later ook uitgevoerd op mijn desktop met Linux Mint — daar werkte het ook. Je moet gewoon de benodigde headerbestanden voor jouw kernelversie downloaden.

UPD. Deskundigen hebben gesuggereerd: om niet afhankelijk te zijn van de kernelversie, moet je drivers verzamelen en installeren met behulp van DKMS. Deze optie staat ook in de readme van de driver.

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. Voorstel patch voor device id is opgenomen in de mainstream tak van de repository lwfinger/rtl8188eu.

Links
— RPi USB Wi-Fi Adapters
— Gitbub lwfinger/rtl8188eu
— usb.ids
— rpi-source

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster