Laten we vrienden maken met RaspberryPi met TP-Link TL-WN727N

Hé Habr!

Ik heb ooit besloten om mijn framboos via de ether met internet te verbinden.

Zo gezegd, zo gedaan, hiervoor kocht ik in de dichtstbijzijnde winkel een usb wifi-fluit van het bekende bedrijf TP-Link. Ik zal meteen zeggen dat dit niet een soort nano-USB-module is, maar een behoorlijk groot apparaat, ongeveer zo groot als een gewone flashdrive (of, als je wilt, zo groot als de wijsvinger van een volwassen man). Voordat ik tot aankoop overging, deed ik wat onderzoek naar de lijst met ondersteunde fluitfabrikanten voor RPI en TP-Link stond op de lijst (maar zoals later bleek, hield ik geen rekening met de subtiliteiten, omdat de duivel, zoals we weten , staat in de details). Dus het koude verhaal van mijn tegenslagen begint; we presenteren een detectiveverhaal in 3 delen onder uw aandacht. Voor geïnteresseerden zie cat.

artikel De WN727N WiFi-adapter verbinden met Ubuntu/Mint Het heeft me gedeeltelijk geholpen, maar eerst en vooral.

Voorwaarden van het probleem

gegeven:

  1. single board computer Raspberry Pi 2 B v1.1 – 1 stuk
  2. usb wifi fluitje WN727N - 1 stuk
  3. een paar niet helemaal kromme handen - 2 stuks
  4. De nieuwste Raspbian is geïnstalleerd als besturingssysteem (gebaseerd op Debian 10 Buster)
  5. kernelversie 4.19.73-v7+

Zoek: maak verbinding met internet (Wi-Fi wordt gedistribueerd vanaf uw thuisrouter)

Nadat ik de adapter had uitgepakt, las ik de instructies erin:

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

Hmm, zoals gewoonlijk geen woord over Linux. Het was 2k19 en de drivers moesten nog steeds handmatig worden gemonteerd...

We hadden 2 compilers bij ons, 75 duizend bibliotheken, vijf binaire blobs, een halve reeks naakte vrouwen met een logo en een hele zee aan headers van alle talen en markeringen. Niet dat dit een noodzakelijke set is voor de klus. Maar als je eenmaal voor jezelf een systeem in elkaar zet, wordt het moeilijk om te stoppen. Het enige dat mij zorgen baarde, waren de stuurprogramma's voor wifi. Er is niets hulpelozer, onverantwoordelijker en corrupter dan het bouwen van drivers vanaf de bron. Maar ik wist dat we vroeg of laat op deze onzin zouden overstappen.

Over het algemeen is, zoals je weet, het spelen met USB Wi-Fi op Linux dat wel pijnlijk en enigszins smakeloos (zoals Russische sushi).

In de doos zit ook een cd met stuurprogramma's. Zonder veel hoop kijk ik naar wat erop staat - ze hebben er absoluut niet voor gezorgd. Een zoektocht op internet bracht me naar de website van de fabrikant, maar daar staat alleen een Linux-stuurprogramma voor apparaatrevisie v4, en in mijn armen was v5.21. En bovendien, voor zeer oude kernelversies 2.6-3.16. Ontmoedigd door de mislukking aan het begin, dacht ik al dat ik de TL-WN727N had moeten nemen (deze is iets duurder en kan 300 Mbps aan versus 150 voor de mijne, maar het bleek dat dit helemaal niets uitmaakt voor de framboos, hierover wordt later geschreven). Maar het belangrijkste is dat er al stuurprogramma's voor bestaan ​​en eenvoudigweg als pakket worden geïnstalleerd firmware-ralink. Meestal kunt u de apparaatrevisie op de behuizing van het apparaat bekijken op een sticker naast het serienummer.

Verder googlen en diverse fora bezoeken leverde niet veel goeds op. Blijkbaar heeft niemand vóór mij geprobeerd een dergelijke adapter op Linux aan te sluiten. Hmm, ik heb zoveel geluk als een verdronken man.

Hoewel, nee, ik lieg, het bezoeken van forums (meestal Engelstalige) heeft ook zijn vruchten afgeworpen; in sommige onderwerpen werd melding gemaakt van een zekere meneer Lwfinger, die bekend staat om het schrijven van een aantal stuurprogramma's voor Wi-Fi-adapters . Zijn git-repository staat aan het einde van het artikel in de links. En de tweede les die ik heb geleerd is dat je je apparaat moet identificeren om te begrijpen welk stuurprogramma daarvoor geschikt kan zijn.

Deel 1: De Bourne-identiteit

Toen het apparaat op de poort werd aangesloten, brandde er uiteraard geen LED. En over het algemeen is het op geen enkele manier duidelijk of iets werkt of niet.

Om erachter te komen of de kernel ons apparaat ziet, kijk ik allereerst in 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

Het bleek dat hij het ziet, en het is zelfs duidelijk dat er een Realtek-chip en de VID/PID van het apparaat zelf op de usb-bus zit.

Laten we verder gaan en kijken lsusb, en hier wacht ons weer een mislukking

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

Het systeem weet niet wat voor soort apparaat het is en toont verlegen een lege ruimte in plaats van de naam (hoewel leverancier=2357 beslist TP-Link is).

In dit stadium heeft de nieuwsgierige lezer waarschijnlijk al iets interessants opgemerkt, maar we zullen het tot onze tijd laten liggen.

Onderzoek naar het probleem van lege namen leidde me naar een site met identificatiegegevens, waar informatie over bekende VID/PID wordt ingevoerd. Onze 2357:0111 was er niet. Zoals later bleek, het hulpprogramma lsusb gebruikt bestand /usr/share/misc/usb.ids, wat dezelfde lijst met ID's van deze site is. Voor de schoonheid van het display heb ik eenvoudigweg regels voor de leverancier TP-Link in mijn systeem toegevoegd.

2357  TP-Link
        0111  TL-WN727N v5.21

Welnu, we hebben de weergave in de lijst met apparaten gecorrigeerd, maar het heeft ons geen stap dichter bij het kiezen van een stuurprogramma gebracht. Om een ​​coureur te selecteren, moet je weten op welke chip je fluitje is gemaakt. De volgende mislukte pogingen om dit op internet te achterhalen, leidden niet tot iets goeds. Gewapend met een dunne sleufschroevendraaier wrik ik voorzichtig de adapterdop los en het gemene geesteskind van oom Liao verschijnt in al zijn ongerepte naaktheid. Onder een vergrootglas zie je de naam van de chip - RTL8188EUS. Dit is al goed. Op sommige forums zag ik berichten dat de driver van diezelfde meneer Lwfinger goed geschikt is voor deze chip (ook al schrijft hij alleen over RTL8188EU).

Deel 2: De Bourne-suprematie

Ik download de stuurprogrammabronnen van Git.

Het is tijd om Windows opnieuw te installeren en te doen waar Linux-gebruikers gewoonlijk mee geassocieerd worden: iets van een bepaalde aard in elkaar zetten. Het samenstellen van stuurprogramma's verschilt, zo blijkt, weinig van het compileren van programma's:

make
sudo make install

maar om kernelmodules te compileren hebben we de kernelheaderbestanden voor onze specifieke versie nodig.

Er staat een pakket in de voorraadrepository raspberrypi-kernel-headers, maar het bevat de kernelversie van de bestanden 4.19.66-v7l+, en dat past niet bij ons. Maar om de headers van de vereiste versie te krijgen, zo bleek, is er een handige tool rpi-bron (link onderaan op Github), waarmee je de benodigde headers kunt downloaden. We klonen de repository, maken het script uitvoerbaar en voeren het uit. De eerste keer opstarten mislukt met een fout: er is geen hulpprogramma bc. Gelukkig staat het in de repository en installeren we het eenvoudig.

sudo apt-get install bc

Hierna duurt het herstarten en downloaden van de headers (en dan nog iets instellen, ik weet het nu niet meer) even en kun je achterover in je stoel leunen, Windows is beter geworden in al zijn verschijningsvormen.

Nadat alle headers zijn gedownload, controleert u of de map verschijnt /lib/modules/4.19.73-v7+ en daarin verwijst de symlink naar de plaats waar de gedownloade bestanden zich bevinden (voor mij is het /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 voltooid, u kunt beginnen met de montage. Het weer in elkaar zetten van de modules kost wat tijd, de Raspberry is geen snel beest (hij heeft een 32bit 900Mhz Cortex ARM v7).
Dus alles samengesteld. We installeren het stuurprogramma in de tweede stap (make install), terwijl we ook meer firmwarebestanden kopiëren die nodig zijn om het stuurprogramma te laten werken:

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. Het Bourne-ultimatum

Ik sluit het fluitje aan op de poort en... er gebeurt niets. Is het allemaal voor niets geweest?

Ik begin de bestanden binnen het project te bestuderen en in een ervan ontdek ik wat het probleem was: de driver specificeert een volledige lijst met VID/PID-identifiers die hij kan gebruiken. En om ons apparaat met dit stuurprogramma te laten werken, heb ik eenvoudigweg 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 */
        /*=== 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 */
};

Ik heb het stuurprogramma opnieuw gecompileerd en opnieuw op het systeem geïnstalleerd.

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

Als u draadloze interfaces bekijkt, ziet u het volgende:

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 voor wie tot het einde leest

Weet je nog dat ik zei dat het niet uitmaakt welke maximale snelheid op je adapter staat?
Op Malinka (vóór de release van model 4) zitten dus alle apparaten (inclusief de ethernetadapter) op dezelfde usb-bus. Geweldig, toch? En daarom wordt de bandbreedte van de usb-bus verdeeld over alle apparaten die erop staan. Bij het meten van de snelheid zowel via ethernet als via usb wifi (aangesloten op 1 router) zowel via de lucht als via de kabel, lag deze rond de 20Mbit/s.

PS Over het algemeen geldt deze handleiding voor het compileren van een stuurprogramma voor deze specifieke adapter niet alleen voor RPI. Ik herhaalde het vervolgens op mijn desktop met Linux Mint - daar werkte alles ook. U hoeft alleen maar op dezelfde manier de benodigde headerbestanden voor uw kernelversie te downloaden.

UPD. Mensen met kennis van zaken suggereerden: om niet afhankelijk te zijn van de kernelversie, moet je stuurprogramma's verzamelen en installeren met behulp van dkms. Het leesmij-bestand voor het stuurprogramma bevat deze optie ook.

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. Voorgesteld lapje voor apparaat-ID werd geaccepteerd in de reguliere tak van de lwfinger/rtl8188eu-repository.

referenties
- RPi USB Wi-Fi-adapters
- Gitbub lwfinger/rtl8188eu
- usb.id's
- rpi-bron

Bron: www.habr.com