Olá, Habr!
Um dia eu pensei em conectar meu Raspberry Pi à internet sem fio.
Dito e feito, para isso comprei na loja mais próxima um adaptador USB Wi-Fi da conhecida marca TP-Link. De imediato, devo mencionar que não se trata de um mini módulo USB, mas de um dispositivo de tamanho considerável, aproximadamente tão grande quanto um pen drive comum (ou, se preferir, do tamanho do dedo indicador de um adulto). Antes de comprar, estudei um pouco a lista de adaptadores compatíveis com o RPI e a TP-Link estava na lista (embora, como depois percebi, eu não tenha levado em conta alguns detalhes, afinal, o diabo está nos detalhes). Assim, o frio relato das minhas desventuras começa, e apresento a vocês uma história de mistério em 3 partes. Os interessados podem continuar lendo.
Artigo isso me ajudou parcialmente, mas vamos por partes.
Condições da tarefa
Dado:
- um computador de placa única Raspberry Pi 2 B v1.1 — 1 unidade
- adaptador USB Wi-Fi WN727N — 1 unidade
- um par de mãos não tão desajeitadas — 2 unidades
- o sistema operacional instalado é o último Raspbian (baseado no Debian 10 Buster)
- kernel versão 4.19.73-v7+
Encontrar: conectar-se à internet (o Wi-Fi é fornecido pelo roteador doméstico)
Após desembalar o adaptador, leio o manual interno:
Compatibilidade do Sistema: Windows 10/8/7/XP (incrivelmente, até XP) e MacOS 10.9-10.13
Pois é, sobre Linux, como sempre, não dizem nada. Era 2019, e os drivers ainda precisavam ser compilados manualmente...
Tínhamos 2 compiladores, 75 mil bibliotecas, cinco blobs binários, meio array de headers com logotipo e um mar de cabeçalhos de todas as linguagens e marcações. Não que fosse um conjunto necessário para o trabalho. Mas quando você começa a compilar um sistema para si, torna-se difícil parar. A única coisa que me preocupava eram os drivers para Wi-Fi. Não há nada mais frustrante, irresponsável e mau que compilar drivers a partir do código fonte. Mas eu sabia que cedo ou tarde teríamos que enfrentar essa tarefa.
De fato, como se sabe, lidar com USB Wi-Fi no Linux é doloroso e um pouco desagradável (como sushi russo).
Na caixa, ainda havia um CD com drivers. Sem muita esperança, vejo o que tem nele — claro, eles não se preocuparam. A pesquisa na internet me levou ao site do fabricante, mas lá tinha driver para Linux apenas para a revisão do dispositivo v4, e eu tinha em mãos v5.21. E também para versões muito antigas do kernel 2.6-3.16. Desencorajado pela falha logo no início, pensei que deveria ter pegado o TL-WN727N (um pouco mais caro e que suporta 300Mbps em vez dos 150 do meu, mas, como se viu, isso não faz diferença para o Raspberry Pi, sobre isso falarei mais adiante). Mas o mais importante é que já existem drivers para ele e são instalados facilmente via pacote. firmware-ralink. Você pode verificar a revisão do dispositivo geralmente no corpo do dispositivo em um adesivo próximo ao número de série.
Uma pesquisa mais aprofundada e a visita a vários fóruns não trouxeram resultados significativos. Aparentemente, ninguém havia tentado conectar esse adaptador específico no Linux antes. Pois é, parece que estou tendo azar.
Embora não, estou mentindo, a visita aos fóruns (principalmente de língua inglesa) também trouxe alguns resultados, em alguns tópicos surgiu a menção de um certo senhor lwfinger, que é conhecido por ter escrito vários drivers para adaptadores Wi-Fi. Seu repositório no Git está ao final do artigo nos links. E a segunda lição que aprendi — é necessário identificar seu dispositivo para entender qual driver pode funcionar para ele.
Parte 1. Identificação do Hardware
Ao conectar o dispositivo na porta, nenhuma luz LED acendeu, e de fato não ficou claro se algo estava funcionando ou não.
Primeiro, para descobrir se o kernel está reconhecendo nosso dispositivo, verifico o dmesg:
[ 965.606998] usb 1-1.3: novo dispositivo USB de alta velocidade número 9 usando dwc_otg
[ 965.738195] usb 1-1.3: Novo dispositivo USB encontrado, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[ 965.738219] usb 1-1.3: Novas strings do dispositivo USB: Mfr=1, Product=2, SerialNumber=3
[ 965.738231] usb 1-1.3: Produto: 802.11n NIC
[ 965.738243] usb 1-1.3: Fabricante: Realtek
[ 965.738255] usb 1-1.3: SerialNumber: 00E04C0001
Aparentemente, está sendo reconhecido, e está claro que há um chip Realtek com o VID/PID do dispositivo no barramento USB.
Vamos em frente, observando lsusb, e aqui nos deparamos com mais uma falha
Bus 001 Device 008: ID 2357:0111
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Adaptador Ethernet Rápido
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Hub SMC9514
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
O sistema não sabe que dispositivo é esse e timidamente mostra um espaço vazio em vez do nome (embora o vendor=2357 seja definitivamente TP-Link).
Neste ponto, o leitor curioso deve ter notado algo interessante, mas vamos deixar isso para depois.
A pesquisa sobre o problema dos nomes vazios me levou a um site com identificadores, onde é armazenada informação sobre VID/PID conhecidos. O nosso 2357:0111 não estava lá. Como descobri mais tarde, a utilidade lsusb usa um arquivo /usr/share/misc/usb.ids, que é a mesma lista de identificadores deste site. Para uma melhor apresentação, apenas adicionei linhas para o vendedor TP-Link no meu sistema.
2357 TP-Link
0111 TL-WN727N v5.21
Bem, corrigimos a exibição na lista de dispositivos, mas isso não nos aproximou nem um pouco da seleção do driver. Para escolher o driver, é necessário saber qual chip foi usado no seu adaptador. Tentativas infrutíferas de descobrir isso na internet não levaram a nada bom. Armado com uma chave de fenda fina, cuidadosamente abro a tampa do adaptador e, diante de meus olhos, está o indescritível fruto do tio Liao em sua nudez primitiva. Sob a lupa, posso observar o nome do chip — RTL8188EUS. Isso já é algo bom. Em alguns fóruns, vi postagens que este chip se dá bem com o driver do senhor lwfinger (mesmo que nele esteja escrito apenas sobre RTL8188EU).
Parte 2. A Superioridade de Born
Baixando os fontes do driver do git.
Chegou a hora de reinstalar o Windows e lidar com o que geralmente associam aos usuários de Linux — compilar algo a partir do código-fonte. Compilar drivers, como se descobriu, não é muito diferente de compilar programas:
make
sudo make install
mas, para compilar módulos do kernel, precisamos dos arquivos de cabeçalho do kernel para a nossa versão específica.
No repositório padrão, há um pacote raspberrypi-kernel-headers, mas ele contém a versão dos arquivos para o kernel 4.19.66-v7l+, e isso não nos serve. Mas, para obter os cabeçalhos da versão necessária, descobri que existe uma ferramenta conveniente rpi-source (link no final para o GitHub), com a qual podemos baixar os cabeçalhos necessários. Clonamos o repositório, tornamos o script executável e o executamos. A primeira execução falha com um erro — falta a utilidade bc. Felizmente, ela está no repositório e a instalamos facilmente.
sudo apt-get install bc
Depois disso, uma nova execução e download dos cabeçalhos (e depois configurar algo, agora já não me lembro) leva algum tempo, e posso reclinar na cadeira, pois o Windows melhorou em todos os seus aspectos.
Após todos os cabeçalhos serem baixados, verificamos se o diretório foi criado /lib/modules/4.19.73-v7+ e nele um symlink indica o local onde os arquivos baixados estão (para mim, é /home/pi/linux):
pi@raspberrypi:/home/pi/rtl8188eu# ls -l /lib/modules/4.19.73-v7+
lrwxrwxrwx 1 root root 14 24 de set 22:44 build -> /home/pi/linux
A fase de preparação foi concluída, agora podemos iniciar a montagem. A montagem dos módulos leva tempo, o Raspberry Pi não é muito rápido (seu processador é um ARM Cortex v7 de 32 bits a 900 MHz).
Assim, tudo foi compilado. Vamos instalar o driver no segundo passo (make install), enquanto isso outros arquivos de firmware, necessários para o funcionamento do driver, são copiados:
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. Ultimato de Bourne
Conecto o dongle à porta e... nada acontece. Será que tudo isso foi em vão?
Começo a examinar os arquivos dentro do projeto e em um deles encontro o que estava causando o problema: o driver lista todos os identificadores VID/PID que ele pode suportar. Para que nosso dispositivo funcione com este driver, eu simplesmente adicionei meu id no arquivo 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 */
};
Recompilei o driver e o reinstalei no sistema.
E desta vez tudo funcionou. A luz do adaptador acendeu e um novo dispositivo apareceu na lista de interfaces de rede.
A visualização das interfaces sem fio mostra o seguinte:
pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0 sem extensões sem fio.
lo sem extensões sem fio.
wlan0 não associado ESSID:"" Apelido:""
Modo:Auto Frequência=2.412 GHz Ponto de Acesso: Não Associado
Sensibilidade:0/0
Tentativa:desligada RTS thr:desligado Fragment thr:desligado
Chave de criptografia:desligada
Gerenciamento de energia:desligado
Qualidade do link=0/100 Nível de sinal=0 dBm Nível de ruído=0 dBm
Rx nwid inválido:0 Rx criptografia inválida:0 Rx fragmentação inválida:0
Tx tentativas excessivas:0 Inválido misc:0 Beacon perdido:0
Bônus para aqueles que leram até o fim
Lembre-se de como eu disse que não importa qual seja a velocidade máxima declarada no seu adaptador?
Assim, no Raspberry Pi (antes do lançamento do modelo 4), todos os dispositivos (incluindo o adaptador ethernet) estão conectados em um único barramento USB. Legal, não é? E por isso a largura de banda do barramento USB é compartilhada entre todos os dispositivos nele. Ao medir a velocidade, tanto pelo ethernet quanto pelo wi-fi USB (conectados a um único roteador), tanto via ar quanto por cabo, os resultados giravam em torno de 20Mbit/s.
P.S. Na verdade, este guia para compilar o driver para este adaptador específico é válido não apenas para o RPI. Eu o repeti no meu desktop com Linux Mint — lá também funcionou perfeitamente. Apenas você precisa baixar os arquivos de cabeçalho adequados para a versão do kernel que você está usando.
ATUALIZAÇÃO. Pessoas bem informadas sugeriram: para não depender da versão do kernel, você deve compilar e instalar os drivers com o dkms. Essa opção também está no README do 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
ATUALIZAÇÃO 2. O ID do dispositivo proposto foi aceito na ramificação principal do repositório lwfinger/rtl8188eu. Adaptadores Wi-Fi USB para RPi
Links
—
—
—
—
Fonte: habr.com
