Ciao, Habr!
Un giorno ho deciso di connettere il mio Raspberry Pi a Internet senza fili.
Detto-fatto, ho acquistato in un negozio vicino un adattatore usb wi-fi di un noto marchio, TP-Link. Ci tengo a dire che non si tratta di un nano usb, ma di un dispositivo piuttosto voluminoso, all'incirca delle dimensioni di una comune chiavetta USB (o, se preferite, come un dito indice di un adulto). Prima di acquistarlo, ho esaminato un po' la lista dei produttori di adattatori supportati per RPI, e TP-Link era nella lista (anche se, come scoprii poi, non avevo considerato i dettagli, poiché, come si sa, il diavolo si nasconde nei dettagli). Quindi, la fredda storia delle mie disavventure inizia; vi propongo un racconto misterioso in tre atti. Gli interessati sono pregati di proseguire.
su Lifehacker. mi ha aiutato parzialmente, ma andiamo con ordine.
Condizioni del compito
Dati:
- un computer a scheda unica Raspberry Pi 2 B v1.1 — 1 unità
- adattatore usb wi-fi WN727N — 1 unità
- un paio di mani non completamente storte — 2 unità
- come sistema operativo è installato l'ultimo Raspbian (basato su debian 10 Buster)
- nucleo versione 4.19.73-v7+
Trovare: stabilire una connessione a Internet (il wi-fi è fornito dal router di casa)
Dopo aver disimballato l'adattatore, leggo le istruzioni all'interno:
Compatibilità di sistema: Windows 10/8/7/XP (anche XP, incredibile) e MacOS 10.9-10.13
Beh, del mondo Linux non c'era nemmeno una parola. Eravamo nel 2019, e i driver erano ancora da compilare a mano...
Avevamo con noi 2 compilatori, 75 mila librerie, cinque blob binari, mezzo stagno di donne nude con il logo e un oceano di header di tutti i linguaggi e markup. Non che fosse un kit necessario per lavorare. Ma una volta che inizi a compilare un sistema su misura per te, diventa difficile fermarsi. L'unica cosa che mi preoccupava erano i driver per il wi-fi. Non c'è nulla di più impotente, irresponsabile e rovinato della compilazione di driver dai sorgenti. Ma sapevo che prima o poi avremmo affrontato anche questa brutta faccenda.
Come si sa, maneggiare un adattatore usb wi-fi su Linux è doloroso e un po' sgradevole (come i sushi russi).
Nella confezione c'è anche un CD con i driver. Senza particolari aspettative, guardo cosa c'è — ecco, non si sono presi cura di questo. Una ricerca su Internet mi ha portato al sito del produttore, ma lì c'è solo un driver Linux per la revisione del dispositivo v4, e io ne avevo in mano v5.21. E inoltre, per versioni molto vecchie del kernel 2.6-3.16. Disorientato dal fallimento già all’inizio, ho pensato che avrei dovuto prendere il TL-WN727N (un po' più caro e capace di 300Mbps contro i 150 del mio, ma, come si è rivelato, questo non ha affatto importanza per il Raspberry, su cui scriverò più avanti). Ma soprattutto, i driver per esso sono già disponibili e si installano semplicemente tramite pacchetto. firmware-ralink. È possibile controllare la revisione del dispositivo di solito sul corpo del dispositivo, su un'etichetta vicino al numero di serie.
Ulteriori approfondimenti su Google e la visita a vari forum non hanno portato a nulla di buono. A quanto pare, nessuno prima di me ha provato a collegare esattamente questo adattatore su Linux. Sì, sembra che io abbia proprio le sfortune.
Anche se, no, mento, la visita ai forum (principalmente quelli in inglese) ha dato i suoi frutti; in alcuni topic ho visto il nome di un certo lwfinger, noto per avere scritto diversi driver per adattatori WiFi. Il suo repository Git è linkato a fine articolo. E un’altra lezione che ho appreso è che è necessario identificare il proprio dispositivo per capire quale driver possa andar bene.
Parte 1. Identificazione del dispositivo
Collegando il dispositivo alla porta, non si è accesa alcuna spia LED, e in generale non è affatto chiaro se qualcosa stia funzionando o meno.
Per prima cosa, per capire se il kernel riconosce il nostro dispositivo, guardo in dmesg:
[ 965.606998] usb 1-1.3: nuovo dispositivo USB ad alta velocità numero 9 usando 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, SerialNumber=3
[ 965.738231] usb 1-1.3: Prodotto: 802.11n NIC
[ 965.738243] usb 1-1.3: Fabbricante: Realtek
[ 965.738255] usb 1-1.3: Numero di serie: 00E04C0001
Risulta che sia visibile, e si può anche capire che c'è il chip Realtek e il VID/PID del dispositivo sulla bus USB.
Andiamo avanti, vediamo lsusb, e qui ci aspetta un'altra delusione
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 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 già notato qualcosa di interessante, ma rimandiamo ciò a un momento successivo.
Indagando sul problema dei nomi vuoti, sono finito su un sito con identificatori dove viene registrata l'informazione sui noti VID/PID. Il nostro 2357:0111 non era presente. Come si è scoperto in seguito, l'utility lsusb utilizza un file /usr/share/misc/usb.ids, che è lo stesso elenco di identificatori di questo sito. Per una migliore presentazione, ho semplicemente aggiunto delle righe per il fornitore TP-Link nel mio sistema.
2357 TP-Link
0111 TL-WN727N v5.21
Bene, abbiamo sistemato la visualizzazione nell'elenco dei dispositivi, ma questo non ci ha avvicinato di un passo alla scelta del driver. Per scegliere il driver, è necessario sapere quale chip è presente nella vostra chiavetta. I tentativi infruttuosi per scoprirlo su internet non hanno portato a nulla di buono. Armato di un cacciavite a taglio sottile, sollevo delicatamente il coperchio dell'adattatore e mi si presenta alla vista, nella sua primordiale nudità, la creatura malefica dello zio Liao. Con la lente d'ingrandimento posso leggere il nome del chip — RTL8188EUS. Questo è già un buon inizio. Su alcuni forum ho visto post che indicano che per questo chip il driver del signore lwfinger è particolarmente adatto (anche se è scritto solo per RTL8188EU).
Parte 2. L'Eccellenza di Born
Scarico il codice sorgente del driver da git.
È arrivato il momento di reinstallare Windows e dedicarmi a ciò che di solito è associato ai linusoid — assemblare qualcosa dai sorgenti. L'assemblaggio dei driver, come si è rivelato, non differisce molto dalla compilazione dei programmi:
make
sudo make install
ma per compilare i moduli del kernel abbiamo bisogno dei file di intestazione del kernel per la nostra versione specifica.
Nel repository standard c'è un pacchetto raspberrypi-kernel-headers, ma contiene la versione dei file per il kernel 4.19.66-v7l+, e questo non va bene. Ma per ottenere le intestazioni della versione desiderata, come si è scoperto, c'è uno strumento conveniente rpi-source (link alla fine su GitHub), tramite il quale è possibile scaricare le intestazioni necessarie. Cloniamo il repository, rendiamo eseguibile lo script e lo avviamo. Il primo avvio fallisce con un errore — manca l'utilità bc. Per fortuna, è presente nel repository e la installiamo semplicemente.
sudo apt-get install bc
Dopo questo, un nuovo avvio e il download delle intestazioni (e poi la configurazione di qualcosa, ora non ricordo) richiede un po' di tempo e posso rilassarmi sulla sedia, Windows è migliorato in ogni sua manifestazione.
Dopo aver scaricato tutte le intestazioni, controlliamo che sia apparso il catalogo /lib/modules/4.19.73-v7+ e in esso un link simbolico indica il luogo dove 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, si può procedere con l'assemblaggio. L'assemblaggio dei moduli richiede di nuovo un certo tempo, il Raspberry Pi non è veloce (ha un processore a 32 bit Cortex ARM v7 a 900 MHz).
Quindi, tutto è stato compilato. Installiamo il driver al passo 2 (make install), durante il quale avviene anche la copia di alcuni 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 nulla. È stato tutto inutile?
Inizio a studiare i file all'interno del progetto e in uno di essi trovo il problema: il driver indica l'elenco completo degli identificatori VID/PID che può gestire. E 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[] = {
/*=== 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 nel sistema.
E questa volta tutto ha funzionato. La spia 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:""
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 ha letto fino alla fine
Ricordate quando ho detto che non importa quale sia la massima velocità dichiarata per il vostro adattatore?
Quindi, sulla Raspberry Pi (prima del rilascio del modello 4), tutti i dispositivi (incluso l'adattatore ethernet) sono connessi a un'unica linea USB. Fantastico, vero? E quindi, la banda passante della linea USB è suddivisa tra tutti i dispositivi collegati. Misurando la velocità sia tramite ethernet che tramite USB Wi-Fi (collegati a un router) e sia in wireless che via cavo, si ottenevano 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 — lì ha funzionato anch'esso. Dovete semplicemente scaricare i file di intestazione necessari per la versione del kernel che utilizzate.
UPD. Persone esperte mi hanno suggerito: per non dipendere dalla versione del kernel, è meglio costruire e installare i driver utilizzando dkms. Questa opzione è menzionata anche 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 il device id è stato accettato nel ramo principale del repository lwfinger/rtl8188eu.
Link
—
—
—
—
Fonte: habr.com
