Facciamo amicizia con RaspberryPi con TP-Link TL-WN727N

Ehi Habr!

Una volta ho deciso di connettere il mio Raspberry a Internet via etere.

Detto fatto, a questo scopo ho acquistato presso il negozio più vicino un fischietto wi-fi usb della nota azienda TP-Link. Dirò subito che questo non è una sorta di modulo nano USB, ma un dispositivo piuttosto grande, delle dimensioni di una normale unità flash (o, se preferisci, delle dimensioni dell'indice di un uomo adulto). Prima dell'acquisto, ho fatto una piccola ricerca sull'elenco dei produttori di fischietti supportati per RPI e TP-Link era nell'elenco (tuttavia, come si è scoperto in seguito, non ho tenuto conto delle sottigliezze, perché il diavolo, come sappiamo , è nei dettagli). Inizia così il freddo racconto delle mie disavventure; presentiamo alla vostra attenzione un romanzo poliziesco in 3 parti. Per chi fosse interessato si rimanda al cat.

Статья Collegamento dell'adattatore WiFi WN727N a Ubuntu/Mint Mi ha aiutato parzialmente, ma prima le cose.

Condizioni del problema

data:

  1. computer a scheda singola Raspberry Pi 2 B v1.1 – 1 pezzo
  2. fischietto wi-fi usb WN727N - 1 pezzo
  3. un paio di mani non del tutto storte - 2 pezzi
  4. Come sistema operativo è installato l'ultimo Raspbian (basato su Debian 10 Buster)
  5. versione del kernel 4.19.73-v7+

Trova: connettiti a Internet (il Wi-Fi è distribuito dal router di casa)

Dopo aver disimballato l'adattatore, ho letto le istruzioni all'interno:

Compatibilità di sistema: Windows 10/8/7/XP (anche Sky, anche XP) e MacOS 10.9-10.13

Hmm, come al solito, non una parola su Linux. Erano le 2k19 e i driver dovevano ancora essere assemblati manualmente...

Avevamo con noi 2 compilatori, 75mila librerie, cinque blob binari, mezza schiera di donne nude con logo e tutto un mare di intestazioni di tutte le lingue e markup. Non che questo sia un set necessario per il lavoro. Ma una volta che inizi ad assemblare un sistema per te stesso, diventa difficile fermarti. L'unica cosa che mi ha preoccupato sono stati i driver per il wi-fi. Non c'è niente di più indifeso, irresponsabile e corrotto che costruire driver dalla fonte. Ma sapevo che prima o poi saremmo passati a queste schifezze.

In generale, come sai, giocherellare con il Wi-Fi USB su Linux lo è doloroso e un po' insapore (come il sushi russo).

La confezione contiene anche un CD con i driver. Senza molta speranza guardo cosa c'è sopra: sicuramente non se ne sono presi cura. Una ricerca su Internet mi ha portato al sito web del produttore, ma lì si trova un driver Linux solo per la revisione del dispositivo v4, e tra le mie braccia era v5.21. Inoltre, per le versioni del kernel molto vecchie 2.6-3.16. Scoraggiato dal fallimento iniziale, ho già pensato che avrei dovuto prendere il TL-WN727N (è un po' più costoso e può gestire 300Mbps contro i 150 del mio, ma alla fine questo non ha alcuna importanza per il lampone, di questo si parlerà più avanti). Ma la cosa più importante è che i driver esistano già e vengano semplicemente installati come pacchetto firmware-ralink. Di solito è possibile visualizzare la revisione del dispositivo sul corpo del dispositivo su un adesivo accanto al numero di serie.

Ulteriori ricerche su Google e visite a vari forum non hanno portato molto bene. Apparentemente nessuno prima di me ha provato a connettere un simile adattatore a Linux. Hmm, sono fortunato come un uomo annegato.

Anche se no, sto mentendo, anche visitare i forum (per lo più in lingua inglese) ha dato i suoi frutti: in alcuni argomenti si menzionava un certo signor lwfinger, famoso per aver scritto numerosi driver per adattatori Wi-Fi . Il suo repository git si trova alla fine dell'articolo nei collegamenti. E la seconda lezione che ho imparato è che è necessario identificare il proprio dispositivo per capire quale driver potrebbe essere adatto.

Parte 1: L'identità Bourne

Quando il dispositivo è stato collegato alla porta, ovviamente, nessun LED si è acceso. E in generale non è chiaro in alcun modo se una cosa funzioni oppure no.

Prima di tutto, per sapere se il kernel vede il nostro dispositivo, cerco 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

Si è scoperto che vede, ed è anche chiaro che sul bus USB è presente un chip Realtek e il VID/PID del dispositivo stesso.

Andiamo oltre e guardiamo lsusb, e qui ci aspetta un altro fallimento

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

Il sistema non sa di che tipo di dispositivo si tratta e mostra timidamente uno spazio vuoto al posto del nome (anche se seller=2357 è sicuramente TP-Link).

A questo punto, il lettore curioso ha probabilmente già notato qualcosa di interessante, ma lo lasceremo al nostro momento.

La ricerca sul problema dei nomi vuoti mi ha portato a un sito con identificatori, dove vengono inserite informazioni su VID/PID noti. Il nostro 2357:0111 non c'era. Come si è scoperto dopo, l'utility lsusb utilizza il file /usr/share/misc/usb.ids, che è lo stesso elenco di ID di questo sito. Per la bellezza del display, ho semplicemente aggiunto delle righe per il fornitore TP-Link nel mio sistema.

2357  TP-Link
        0111  TL-WN727N v5.21

Bene, abbiamo corretto la visualizzazione nell'elenco dei dispositivi, ma questo non ci ha portato un passo avanti nella scelta del driver. Per selezionare un pilota, devi sapere su quale chip è realizzato il tuo fischietto. I successivi tentativi falliti di scoprirlo su Internet non hanno portato a nulla di buono. Armato di un sottile cacciavite a taglio, faccio leva con attenzione sul cappuccio dell'adattatore e il feroce frutto dell'ingegno di zio Liao appare in tutta la sua immacolata nudità. Sotto una lente d'ingrandimento puoi vedere il nome del chip - RTL8188EUS. Questo è già buono. Su alcuni forum ho visto post secondo cui il driver dello stesso signore lwfinger è adatto per questo chip (anche se scrive solo di RTL8188EU).

Parte 2: La supremazia di Bourne

Scarico i sorgenti dei driver da Git.

È ora di reinstallare Windows e fare ciò a cui sono solitamente associati gli utenti Linux: assemblare qualcosa di qualche tipo. L'assemblaggio dei driver, a quanto pare, differisce poco dalla compilazione dei programmi:

make
sudo make install

ma per compilare i moduli del kernel abbiamo bisogno dei file header del kernel per la nostra versione specifica.

C'è un pacchetto nel repository azionario intestazioni del kernel raspberrypi, ma contiene la versione del kernel dei file 4.19.66-v7l+, e questo non ci va bene. Ma per ottenere le intestazioni della versione richiesta, come si è scoperto, esiste uno strumento conveniente rpi-source (link alla fine su Github), con cui è possibile scaricare gli header necessari. Cloniamo il repository, rendiamo eseguibile lo script e lo eseguiamo. Il primo avvio fallisce con un errore: non è presente alcuna utilità bc. Fortunatamente, è nel repository e lo installiamo semplicemente.

sudo apt-get install bc

Dopodiché, riavviare e scaricare le intestazioni (e quindi impostare qualcosa, ora non ricordo) richiede del tempo e puoi rilassarti e Windows è migliorato in tutte le sue manifestazioni.

Dopo che tutte le intestazioni sono state scaricate, controlla che la directory venga visualizzata /lib/modules/4.19.73-v7+ e in esso il collegamento simbolico punta al luogo in cui si trovano i file scaricati (per me è /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

La fase preparatoria è stata completata, puoi iniziare il montaggio. Il riassemblaggio dei moduli richiede un po' di tempo, il Raspberry non è una bestia veloce (ha un Cortex ARM v32 a 900bit 7Mhz).
Quindi tutto compilato. Installiamo il driver nel secondo passaggio (make install), copiando anche altri file firmware necessari affinché il driver funzioni:

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

Parte 3. L'ultimatum di Bourne

Inserisco il fischietto nella porta e... non succede nulla. È stato tutto inutile?

Inizio a studiare i file all'interno del progetto e in uno di essi scopro qual era il problema: il driver specifica un elenco completo di identificatori VID/PID che può servire. E affinché il nostro dispositivo funzioni con questo driver, ho semplicemente aggiunto il mio ID al file 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 */
};

Ho ricompilato il driver e l'ho reinstallato sul sistema.

E questa volta tutto è iniziato. La luce sull'adattatore si è accesa e nell'elenco delle interfacce di rete è apparso un nuovo dispositivo.

La visualizzazione delle interfacce wireless mostra quanto segue:

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 per chi legge fino alla fine

Ricordi come ho detto che non importa quale sia la velocità massima indicata sul tuo adattatore?
Quindi, su Malinka (prima del rilascio del modello 4), tutti i dispositivi (incluso l'adattatore Ethernet) si trovano sullo stesso bus USB. Fantastico, vero? E quindi la larghezza di banda del bus USB è divisa tra tutti i dispositivi su di esso. Misurando la velocità sia via ethernet che via usb wi-fi (collegato a 1 router) sia via aerea che via cavo, era di circa 20 Mbit/s.

PS In generale, questa guida per compilare un driver per questo particolare adattatore è valida non solo per RPI. L'ho poi ripetuto sul mio desktop con Linux Mint: anche lì tutto ha funzionato. Devi solo scaricare i file header necessari per la tua versione del kernel allo stesso modo.

AGGIORNAMENTO. Le persone esperte hanno suggerito: per non dipendere dalla versione del kernel, è necessario raccogliere e installare i driver utilizzando dkms. Anche il file Leggimi del driver contiene questa opzione.

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. Proposto toppa per l'id del dispositivo è stato accettato nel ramo principale del repository lwfinger/rtl8188eu.

riferimenti
- Adattatori Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-source

Fonte: habr.com