Colleghiamo RaspberryPi con TP-Link TL-WN727N

Ciao, Habr!

Un giorno ho pensato di connettere il mio Raspberry Pi a Internet senza fili.

Detto fatto, ho acquistato in un negozio vicino un adattatore USB Wi-Fi della nota marca TP-Link. Preciso che non si tratta di un modulo USB nano, ma di un dispositivo dalle dimensioni comparabili a una normale chiavetta USB (o, se preferite, alla lunghezza di un dito indice di un uomo adulto). Prima dell'acquisto, ho studiato un po' l'elenco dei produttori di adattatori compatibili con il RPI e TP-Link era nella lista (anche se, come si è poi rivelato, non avevo tenuto conto di alcune sottigliezze, poiché, come si dice, il diavolo si nasconde nei dettagli). Ed ecco che inizia il freddo racconto delle mie disavventure, vi presento una storia di detective in tre parti. Gli interessati, proseguite.

Articolo Colleghiamo l'adattatore WiFi WN727N a Ubuntu/Mint mi ha aiutato in parte, ma andiamo con calma.

Condizioni del compito

Dati:

  1. computer single-board Raspberry Pi 2 B v1.1 — 1 unità
  2. adattatore USB Wi-Fi WN727N — 1 unità
  3. due mani non proprio goffe — 2 unità
  4. come sistema operativo è installato l'ultimo Raspbian (basato su Debian 10 Buster)
  5. kernel versione 4.19.73-v7+

Cerca: effettuare una connessione a Internet (il Wi-Fi è condiviso dal router domestico)

Dopo aver aperto l'adattatore, leggo le istruzioni all'interno:

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

Eh sì, di Linux come al solito non si parla. Era il 2019 e i driver dovevano essere ancora assemblati a mano…

Avevamo con noi due compilatori, 75.000 librerie, cinque blob binari, mezzo armadio pieno di copertine logo e un intero mare di header in tutte le lingue e markup. Non che fosse un insieme necessario per lavorare. Ma una volta che inizi a costruire un sistema personalizzato, diventa difficile fermarsi. L'unica cosa che mi preoccupava erano i driver per il Wi-Fi. Non c'è nulla di più impotente, irresponsabile e frustrante che assemblare driver dai sorgenti. Ma sapevo che prima o poi saremmo arrivati anche a questa roba.

In generale, come si sa, gestire il Wi-Fi USB su Linux è doloroso e piuttosto sgradevole (come il sushi russo).

Nella scatola c'è anche un CD con i driver. Senza molta speranza, guardo cosa c'è sopra— proprio così, non si sono preoccupati. La ricerca su Internet mi ha portato al sito del produttore, ma lì c'è solo un driver per Linux per la revisione del dispositivo. v4, ma avevo tra le mani v5.21. E inoltre, per versioni del kernel molto vecchie 2.6-3.16. Disperato per il fallimento già all'inizio, avevo pensato di dover prendere il TL-WN727N (che è leggermente più caro e supporta 300Mbps contro i 150 del mio, ma, come si è rivelato, non ha alcuna importanza per Raspberry, di questo parlerò più avanti). Ma soprattutto, i driver per esso sono già disponibili e si installano facilmente con un pacchetto firmware-ralink. Di solito, la revisione del dispositivo può essere vista sul corpo del dispositivo su un'etichetta vicino al numero di serie.

Ulteriori ricerche su Google e visite a vari forum non hanno portato nulla di buono. A quanto pare, nessuno prima di me ha provato a collegare proprio questo adattatore su Linux. Uffa, sono proprio sfortunato.

Anche se no, mento, visitare i forum (principalmente anglofoni) ha dato i suoi frutti; in alcuni argomenti ho visto menzionato un certo signor lwfinger, noto per aver scritto diversi driver per adattatori Wi-Fi. Il suo repository Git è linkato alla fine dell'articolo. E il secondo insegnamento che ho imparato è: è necessario identificare il proprio dispositivo per capire quale driver potrebbe andare bene.

Parte 1. Identificazione del dispositivo

Quando collego il dispositivo alla porta, nessun LED si accende. E in generale non è chiaro se qualcosa funzioni o meno.

Per prima cosa, per verificare se il kernel rileva il nostro dispositivo, do un'occhiata a dmesg:

[  965.606998] usb 1-1.3: nuovo dispositivo USB ad alta velocità numero 9 in uso dwc_otg
[  965.738195] usb 1-1.3: Nuovo dispositivo USB trovato, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Nuove stringhe del dispositivo USB: Mfr=1, Prodotto=2, Numero di serie=3
[  965.738231] usb 1-1.3: Prodotto: 802.11n NIC
[  965.738243] usb 1-1.3: Produttore: Realtek
[  965.738255] usb 1-1.3: Numero di serie: 00E04C0001

Si è scoperto che viene rilevato e si capisce che c'è un chip Realtek e il VID/PID del dispositivo sulla bus USB.

Procediamo, vediamo lsusb, e qui ci aspetta un'altra delusione

Bus 001 Dispositivo 008: ID 2357:0111 
Bus 001 Dispositivo 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Dispositivo 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Dispositivo 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

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

A questo punto, il lettore curioso avrà probabilmente notato qualcosa di interessante, ma rimanderemo a un momento più opportuno.

L'indagine sul problema dei nomi vuoti mi ha portato a un sito con identificatori dove vengono inserite informazioni sui noti VID/PID. Il nostro 2357:0111 non era presente. Come si è scoperto più tardi, l'utilità lsusb utilizza il file /usr/share/misc/usb.ids, che è lo stesso elenco di identificatori di questo sito. Per migliorare la visualizzazione, ho semplicemente aggiunto nel mio sistema righe per il venditore TP-Link.

2357  TP-Link
        0111  TL-WN727N v5.21

Bene, abbiamo corretto la visualizzazione nell'elenco dei dispositivi, ma ciò non ci ha avvicinato di un passo alla scelta del driver. Per scegliere il driver, bisogna sapere su quale chip è stato realizzato il tuo adattatore. Nuove tentativi infruttuosi di scoprirlo su Internet non hanno portato a nulla di buono. Armato di un cacciavite a taglio sottile, sollevo con cura il coperchio dell'adattatore e mi si presenta davanti in tutta la sua nuda originalità la creazione infelice dello zio Liao. Sotto la lente si può osservare il nome del chip — RTL8188EUS. Questo è già un buon segno. Su alcuni forum ho visto messaggi che per questo chip si adatta bene proprio il driver di quel signore lwfinger (anche se c'è scritto solo riguardo a RTL8188EU).

Parte 2. La superiorità di Born

Sto scaricando i sorgenti del driver da Git.

È giunto il momento di reinstallare Windows e occuparsi di ciò che di solito viene associato ai linucsoidi: la compilazione di qualcosa dai sorgenti. Compilare i driver, come si è rivelato, non è molto diverso dalla compilazione di programmi:

make
sudo make install

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

Nel repository di default c'è un pacchetto raspberrypi-kernel-headers, ma contiene la versione dei file per il kernel 4.19.66-v7l+, e questo non va bene per noi. Ma per ottenere le intestazioni della versione necessaria, come si è scoperto, c'è uno strumento comodo chiamato rpi-source (link alla fine su GitHub), tramite il quale è possibile scaricare le intestazioni necessarie. Cloniamo il repository, rendiamo illo script eseguibile e lo avviamo. La prima esecuzione genera un errore: manca l'utility bc. Per fortuna, è presente nel repository e la installiamo.

sudo apt-get install bc

Dopo questo, il secondo avvio e il download delle intestazioni (e poi la configurazione di qualcosa, ora non ricordo) richiede un po' di tempo e ci si può rilassare sulla sedia: Windows è migliorato in tutte le sue manifestazioni.

Dopo aver scaricato tutte le intestazioni, verifichiamo che sia apparso il catalogo /lib/modules/4.19.73-v7+ e in esso il symlink 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 è completata, possiamo procedere con la compilazione. La costruzione dei moduli richiede nuovamente del tempo, il Raspberry Pi non è molto veloce (ha un processore a 32 bit 900 MHz Cortex ARM v7).
E così, tutto è stato compilato. Installeremo il driver con il secondo passaggio (make install), durante il quale vengono copiati anche i file firmware necessari per il funzionamento del 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/.

Parte 3. L'ultimatum di Bourne

Inserisco la chiavetta nella porta e… non succede niente. È stato tutto inutile?

Inizio a esaminare i file all'interno del progetto e in uno di essi trovo il problema: il driver specifica un elenco completo di identificatori VID/PID che può gestire. Affinché il nostro dispositivo funzioni con questo driver, ho semplicemente aggiunto il mio id nel file rtl8188eu/os_dep/usb_intf.c

static struct usb_device_id rtw_usb_id_tbl[] = {
        /*=== Scheda demoboard Realtek ===*/
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
        /*=== ID cliente ===*/
        /****** 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 */
        {}      /* Voce di terminazione */
};

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

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

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:""
          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 arriva fino alla fine

Ricordate come ho detto che non importa quale sia la velocità massima dichiarata per il vostro adattatore?
Ebbene, sulla Raspberry Pi (fino all'uscita del modello 4), tutti i dispositivi (incluso l'adattatore ethernet) sono collegati a un'unica porta USB. Fantastico, vero? E quindi la larghezza di banda della porta USB è condivisa tra tutti i dispositivi collegati. Durante le misurazioni della velocità, sia tramite ethernet che tramite Wi-Fi USB (collegati a un solo router), sia in modalità wireless che cablata, erogava circa 20 Mbit/s.

P.S. In realtà, questa guida per la compilazione del driver per questo specifico adattatore è valida non solo su RPI. L'ho ripetuta anche sul mio desktop con Linux Mint — anche lì tutto ha funzionato. È solamente necessario scaricare i file header richiesti per la versione del kernel che state utilizzando.

UPD. Persone esperte hanno suggerito: per non dipendere dalla versione del kernel, è necessario compilare e installare i driver utilizzando dkms. Questa opzione è anche presente nel readme del 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. Proposto per correggere l'errore. per l'identificazione del dispositivo è stato accettato nel ramo principale del repository lwfinger/rtl8188eu.

Link
Adattatori USB Wi-Fi RPi
GitHub lwfinger/rtl8188eu
usb.ids
rpi-source

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster