Amizade entre RaspberryPi e TP-Link TL-WN727N

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 Conectando o adaptador Wi-Fi WN727N ao Ubuntu/Mint isso me ajudou parcialmente, mas vamos por partes.

Condições da tarefa

Dado:

  1. um computador de placa única Raspberry Pi 2 B v1.1 — 1 unidade
  2. adaptador USB Wi-Fi WN727N — 1 unidade
  3. um par de mãos não tão desajeitadas — 2 unidades
  4. o sistema operacional instalado é o último Raspbian (baseado no Debian 10 Buster)
  5. 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. patch Adaptadores Wi-Fi USB para RPi

Links
— GitHub lwfinger/rtl8188eu
— usb.ids
— Olá, Habr! Um dia eu decidi conectar meu Raspberry Pi à internet sem fio. Falado e feito, comprei na loja mais próxima um dongle usb wi-fi da famosa marca TP-Link.
— rpi-source

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster