Låt oss bli vänner RaspberryPi med TP-Link TL-WN727N

Hej Habr!

Jag bestämde mig en gång för att ansluta mitt hallon till Internet via etern.

Inte tidigare sagt än gjort, för detta ändamål köpte jag en usb wi-fi visselpipa från det välkända företaget TP-Link från närmaste butik. Jag ska genast säga att det här inte är någon form av nano-usb-modul, utan en ganska stor enhet, ungefär lika stor som en vanlig flashenhet (eller, om du vill, storleken på en vuxen mans pekfinger). Innan jag köpte gjorde jag lite research på listan över tillverkare av visselpipor som stöds för RPI och TP-Link fanns på listan (men, som det visade sig senare, tog jag inte hänsyn till subtiliteterna, eftersom djävulen, som vi vet , finns i detaljerna). Så, den kalla berättelsen om mina missöden börjar; vi presenterar för er uppmärksamhet en deckare i 3 delar. För den som är intresserad, hänvisa till kat.

Artikel Ansluter WN727N WiFi-adaptern till Ubuntu/Mint Det hjälpte mig delvis, men först till kvarn.

Villkor för problemet

Given:

  1. enkelkortsdator Raspberry Pi 2 B v1.1 – 1 st
  2. usb wi-fi visselpipa WN727N - 1 st
  3. ett par inte riktigt krokiga händer - 2 st
  4. Den senaste Raspbian är installerad som OS (baserat på Debian 10 Buster)
  5. kärnversion 4.19.73-v7+

Hitta: anslut till Internet (Wi-Fi distribueras från din hemrouter)

Efter att ha packat upp adaptern läste jag instruktionerna inuti:

Systemkompatibilitet: Windows 10/8/7/XP (även himlen, till och med XP) och MacOS 10.9-10.13

Hmm, som vanligt, inte ett ord om Linux. Det var 2k19, och drivrutinerna behövde fortfarande monteras manuellt...

Vi hade med oss ​​2 kompilatorer, 75 tusen bibliotek, fem binära blobbar, ett halvt utbud av nakna kvinnor med en logotyp och ett helt hav av rubriker för alla språk och märkningar. Inte för att detta är en nödvändig uppsättning för jobbet. Men när man väl börjar montera ett system åt sig själv blir det svårt att sluta. Det enda som orsakade mig oro var drivrutinerna för wi-fi. Det finns inget mer hjälplöst, oansvarigt och korrupt än att bygga förare från källan. Men jag visste att vi förr eller senare skulle byta till det här skräpet.

I allmänhet är det som ni vet att pilla med usb wi-fi på Linux smärtsamt och något smaklöst (som rysk sushi).

Boxen innehåller även en CD med drivrutiner. Utan mycket hopp tittar jag på vad som finns på den - de har definitivt inte tagit hand om det. En internetsökning tog mig till tillverkarens webbplats, men det finns en Linux-drivrutin där endast för enhetsrevision v4, och i mina armar var v5.21. Och dessutom, för mycket gamla kärnversioner 2.6-3.16. Avskräckt av misslyckandet i början tänkte jag redan att jag borde ha tagit TL-WN727N (den är lite dyrare och klarar 300 Mbps mot 150 för min, men som det visade sig spelar detta ingen roll alls för hallonet kommer det att skrivas om senare). Men det viktigaste är att drivrutiner för det redan finns och är helt enkelt installerade som ett paket firmware-ralink. Du kan vanligtvis se enhetsrevisionen på enhetens kropp på en etikett bredvid serienumret.

Att ytterligare googla och besöka olika forum gav inte mycket gott. Tydligen har ingen före mig försökt koppla en sådan adapter till Linux. Hmm, jag har tur som en drunknad man.

Även om, nej, jag ljuger, att besöka forum (mestadels engelskspråkiga) också bar frukt; i vissa ämnen nämndes en viss herr lwfinger, som är känd för att ha skrivit ett antal drivrutiner för Wi-Fi-adaptrar . Hans git-förråd finns i slutet av artikeln i länkarna. Och den andra lektionen jag lärde mig är att du måste identifiera din enhet för att förstå vilken drivrutin som kan vara lämplig för den.

Del 1: The Bourne Identity

När enheten var ansluten till porten tändes naturligtvis ingen lysdiod. Och i allmänhet är det inte klart på något sätt om något fungerar eller inte.

Först och främst, för att ta reda på om kärnan ser vår enhet, tittar jag i 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

Det visade sig att den ser, och det är till och med tydligt att det finns ett Realtek-chip och VID/PID för själva enheten på usb-bussen.

Låt oss gå vidare och titta lsusb, och här väntar oss ännu ett misslyckande

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

Systemet vet inte vilken typ av enhet det är, och visar blygsamt ett tomt utrymme istället för namnet (även om leverantör=2357 definitivt är TP-Link).

I det här skedet har nog den nyfikna läsaren redan lagt märke till något intressant, men det låter vi vara till vår tid.

Att undersöka problemet med tomma namn ledde mig till en sida med identifierare, där information om känt VID/PID läggs in. Vår 2357:0111 var inte där. Som det visade sig senare, verktyget lsusb använder filen /usr/share/misc/usb.ids, vilket är samma lista med ID:n från den här webbplatsen. För skärmens skönhet lade jag helt enkelt till rader för leverantören TP-Link i mitt system.

2357  TP-Link
        0111  TL-WN727N v5.21

Tja, vi korrigerade displayen i listan över enheter, men det förde oss inte ett steg närmare valet av drivrutin. För att välja en förare måste du veta vilket chip din visselpipa är gjord på. Nästa misslyckade försök att ta reda på detta på Internet ledde inte till något bra. Beväpnad med en tunn slitsad skruvmejsel bänder jag försiktigt bort adapterkåpan och farbror Liaos ondskefulla hjärna dyker upp i all sin orörda nakenhet. Under ett förstoringsglas kan du se namnet på chipet - RTL8188EUS. Det här är redan bra. På vissa forum såg jag inlägg om att drivrutinen från samma herre lwfinger är väl lämpad för detta chip (även om han bara skriver om RTL8188EU).

Del 2: The Bourne Supremacy

Jag laddar ner drivrutinskällorna från Git.

Det är dags att installera om Windows och göra det som Linux-användare vanligtvis förknippas med - att sätta ihop något av något slag. Att montera drivrutiner, som det visar sig, skiljer sig lite från att kompilera program:

make
sudo make install

men för att kompilera kärnmoduler behöver vi kärnhuvudfilerna för vår specifika version.

Det finns ett paket i lagerförrådet raspberrypi-kernel-headers, men den innehåller kärnversionen av filerna 4.19.66-v7l+, och det passar oss inte. Men för att få rubrikerna för den nödvändiga versionen, som det visade sig, finns det ett bekvämt verktyg rpi-källa (länk i slutet på Github), med vilken du kan ladda ner nödvändiga rubriker. Vi klonar förvaret, gör skriptet körbart och kör det. Den första lanseringen misslyckas med ett fel - det finns inget verktyg bc. Lyckligtvis finns det i förvaret och vi installerar det helt enkelt.

sudo apt-get install bc

Efter detta tar det lite tid att starta om och ladda ner rubrikerna (och sedan ställa in något, jag kommer inte ihåg nu) och du kan luta dig tillbaka i stolen, Windows har blivit bättre i alla dess manifestationer.

När alla rubriker har laddats ner, kontrollera att katalogen visas /lib/modules/4.19.73-v7+ och i den pekar symbollänken till platsen där de nedladdade filerna finns (för mig är det /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

Det förberedande skedet har slutförts, du kan börja monteringen. Att montera modulerna igen tar lite tid, Raspberry är ingen snabb best (den har en 32bit 900Mhz Cortex ARM v7).
Så allt sammanställt. Vi installerar drivrutinen i steg 2 (gör installation), samtidigt som vi kopierar fler firmwarefiler som krävs för att drivrutinen ska fungera:

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. The Bourne Ultimatum

Jag kopplar in visselpipan i hamnen och... ingenting händer. Var allt för ingenting?

Jag börjar studera filerna i projektet och i en av dem hittar jag vad problemet var: drivrutinen anger en komplett lista med VID/PID-identifierare som den kan betjäna. Och för att vår enhet skulle fungera med den här drivrutinen lade jag helt enkelt till mitt id i filen 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 */
};

Jag kompilerade om drivrutinen och installerade om den på systemet.

Och den här gången började allt. Lampan på adaptern tändes och en ny enhet dök upp i listan över nätverksgränssnitt.

Att titta på trådlösa gränssnitt visar följande:

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 för den som läser till slutet

Kommer du ihåg hur jag sa att det inte spelar någon roll vilken maxhastighet som anges på din adapter?
Så på Malinka (före lanseringen av modell 4) sitter alla enheter (inklusive Ethernet-adaptern) på samma usb-buss. Bra, eller hur? Och därför är bandbredden på usb-bussen uppdelad mellan alla enheter på den. Vid mätning av hastigheten både via ethernet och via usb wi-fi (ansluten till 1 router) både med flyg och tråd var den runt 20Mbit/s.

PS I allmänhet gäller den här guiden för att kompilera en drivrutin för just den här adaptern inte bara för RPI. Jag upprepade det sedan på mitt skrivbord med Linux Mint - allt fungerade där också. Du behöver bara ladda ner de nödvändiga rubrikfilerna för din kärnversion på samma sätt.

UPD. Kunniga personer föreslog: för att inte vara beroende av kärnversionen måste du samla in och installera drivrutiner med dkms. Readme för drivrutinen innehåller också detta alternativ.

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. Föreslagen plåster för enhets-id accepterades i mainstream-grenen av lwfinger/rtl8188eu-förvaret.

referenser
- RPi USB Wi-Fi-adaptrar
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-källa

Källa: will.com