Vamos fazer amizade com RaspberryPi com TP-Link TL-WN727N

Oi, Habr!

Certa vez, decidi conectar meu Raspberry à Internet pelo ar.

Mal dito e feito, para isso comprei um apito usb wi-fi da conhecida empresa TP-Link na loja mais próxima. Direi imediatamente que este não é algum tipo de módulo nano usb, mas um dispositivo bastante grande, do tamanho de uma unidade flash normal (ou, se preferir, do tamanho do dedo indicador de um homem adulto). Antes de comprar, pesquisei um pouco a lista de fabricantes de apitos suportados para RPI e TP-Link estava na lista (porém, como descobri mais tarde, não levei em consideração as sutilezas, porque o diabo, como sabemos , está nos detalhes). Assim começa a fria história das minhas desventuras, apresentamos à sua atenção uma história de detetive em 3 partes. Para os interessados, consulte o gato.

Artigo Conectando o adaptador WiFi WN727N ao Ubuntu/Mint Isso me ajudou parcialmente, mas primeiro o mais importante.

Condições do problema

Dado:

  1. computador de placa única Raspberry Pi 2 B v1.1 – 1 peça
  2. apito wi-fi usb WN727N - 1 peça
  3. um par de mãos não muito tortas - 2 peças
  4. O Raspbian mais recente é instalado como sistema operacional (baseado no Debian 10 Buster)
  5. versão do kernel 4.19.73-v7+

Encontrar: conecte-se à Internet (o Wi-Fi é distribuído a partir do seu roteador doméstico)

Depois de desembalar o adaptador, li as instruções contidas:

Compatibilidade do sistema: Windows 10/8/7/XP (até o céu, até XP) e MacOS 10.9-10.13

Hmm, como sempre, nem uma palavra sobre Linux. Era 2k19, e os drivers ainda precisavam ser montados manualmente...

Tínhamos conosco 2 compiladores, 75 mil bibliotecas, cinco blobs binários, meio array de mulheres nuas com logotipo e todo um mar de cabeçalhos de todas as linguagens e marcações. Não que este seja um conjunto necessário para o trabalho. Mas uma vez que você começa a montar um sistema para si mesmo, fica difícil parar. A única coisa que me preocupou foram os drivers do wi-fi. Não há nada mais indefeso, irresponsável e corrupto do que construir drivers a partir da fonte. Mas eu sabia que mais cedo ou mais tarde mudaríamos para esse lixo.

Em geral, como você sabe, mexer com usb wi-fi no Linux é doloroso e um tanto insípido (como sushi russo).

A caixa também contém um CD com drivers. Sem muita esperança, vejo o que há nele - eles definitivamente não cuidaram disso. Uma pesquisa na Internet me levou ao site do fabricante, mas existe um driver Linux apenas para revisão do dispositivo v4, e em meus braços estava v5.21. Além disso, para versões de kernel muito antigas 2.6-3.16. Desanimado com a falha logo no início, já pensei que deveria ter levado o TL-WN727N (é um pouco mais caro e aguenta 300Mbps contra 150 do meu, mas descobri que isso não importa nada para a framboesa, isso será escrito mais tarde). Mas o mais importante é que os drivers para ele já existem e são simplesmente instalados como um pacote firmware-ralink. Geralmente você pode ver a revisão do dispositivo no corpo do dispositivo em um adesivo próximo ao número de série.

Pesquisar mais no Google e visitar vários fóruns não trouxe muito benefício. Aparentemente, ninguém antes de mim tentou conectar esse adaptador ao Linux. Hmm, tenho tanta sorte quanto um homem afogado.

Embora não, estou mentindo, visitar fóruns (principalmente de língua inglesa) também deu frutos: em alguns tópicos houve menção a um certo Sr. lwfinger, famoso por escrever vários drivers para adaptadores Wi-Fi . Seu repositório git está no final do artigo nos links. E a segunda lição que aprendi é que você precisa identificar seu dispositivo para entender qual driver pode ser adequado para ele.

Parte 1: A Identidade Bourne

Quando o dispositivo foi conectado à porta, é claro, nenhum LED acendeu. E, em geral, não está claro se algo funciona ou não.

Primeiro de tudo, para descobrir se o kernel vê nosso dispositivo, procuro no 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

Acontece que ele vê, e fica até claro que existe um chip Realtek e o VID/PID do próprio dispositivo no barramento USB.

Vamos mais longe e olhamos lsusb, e aqui outra falha nos espera

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

O sistema não sabe que tipo de dispositivo é e timidamente mostra um espaço vazio em vez do nome (embora vendor=2357 seja definitivamente TP-Link).

Nesta fase, o leitor curioso provavelmente já percebeu algo interessante, mas deixaremos para o nosso momento.

Pesquisar o problema dos nomes vazios me levou a um site com identificadores, onde são inseridas informações sobre VID/PID conhecidos. Nosso 2357:0111 não estava lá. Como descobrimos mais tarde, o utilitário lsusb usa arquivo /usr/share/misc/usb.ids, que é a mesma lista de IDs deste site. Para a beleza da tela, simplesmente adicionei linhas para o fornecedor TP-Link em 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 passo da escolha de um driver. Para selecionar um driver, você precisa saber em que chip é feito o seu apito. As próximas tentativas malsucedidas de descobrir isso na Internet não levaram a nada de bom. Armado com uma chave de fenda fina, retiro cuidadosamente a tampa do adaptador e a ideia cruel do tio Liao aparece em toda a sua nudez imaculada. Sob uma lupa você pode ver o nome do chip - RTL8188EU. Isso já é bom. Em alguns fóruns vi postagens informando que o driver daquele mesmo senhor lwfinger é adequado para este chip (embora ele escreva apenas sobre RTL8188EU).

Parte 2: A Supremacia Bourne

Eu baixei as fontes do driver do Git.

É hora de reinstalar o Windows e fazer o que os usuários do Linux geralmente fazem - montar algo de algum tipo. A montagem de drivers, ao que parece, difere pouco da compilação de programas:

make
sudo make install

mas para compilar módulos do kernel precisamos dos arquivos de cabeçalho do kernel para nossa versão específica.

Existe um pacote no repositório de estoque cabeçalhos de kernel raspberrypi, mas contém a versão do kernel dos arquivos 4.19.66-v7l+, e isso não nos convém. Mas para obter os cabeçalhos da versão necessária, como se viu, existe uma ferramenta conveniente fonte rpi (link no final no Github), com o qual você pode baixar os cabeçalhos necessários. Clonamos o repositório, tornamos o script executável e o executamos. A primeira inicialização falha com um erro - não há utilitário bc. Felizmente, está no repositório e apenas instalamos.

sudo apt-get install bc

Depois disso, reiniciar e baixar os cabeçalhos (e depois configurar algo, não me lembro agora) leva algum tempo e você pode sentar na cadeira, o Windows ficou melhor em todas as suas manifestações.

Após o download de todos os cabeçalhos, verifique se o diretório aparece /lib/modules/4.19.73-v7+ e nele o link simbólico aponta para o local onde estão localizados os arquivos baixados (para mim é /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

A fase preparatória está concluída, você pode prosseguir com a montagem. Montar os módulos novamente leva algum tempo, o Raspberry não é uma fera rápida (ele tem um Cortex ARM v32 de 900 bits e 7 MHz).
Então tudo compilado. Instalamos o driver na 2ª etapa (make install), ao mesmo tempo que copiamos mais arquivos de firmware necessários para o funcionamento do 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. O Ultimato Bourne

Eu conecto o apito na porta e... nada acontece. Foi tudo em vão?

Começo a estudar os arquivos dentro do projeto e em um deles descubro qual era o problema: o driver especifica uma lista completa de identificadores VID/PID que ele pode servir. E para que nosso dispositivo funcione com este driver, simplesmente adicionei meu id ao 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 reinstalei-o no sistema.

E desta vez tudo começou. A luz do adaptador acendeu e um novo dispositivo apareceu na lista de interfaces de rede.

A visualização de interfaces sem fio mostra o seguinte:

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

Bônus para quem leu até o fim

Lembra como eu disse que não importa a velocidade máxima indicada no seu adaptador?
Portanto, no Malinka (antes do lançamento do modelo 4), todos os dispositivos (incluindo o adaptador Ethernet) ficam no mesmo barramento USB. Ótimo, certo? E, portanto, a largura de banda do barramento USB é dividida entre todos os dispositivos nele. Ao medir a velocidade tanto via ethernet quanto via usb wi-fi (conectado a 1 roteador) tanto por via aérea quanto por fio, ficou em torno de 20Mbit/s.

PS Em geral, este guia para compilar um driver para este adaptador específico não é válido apenas para RPI. Em seguida, repeti no meu desktop com Linux Mint - tudo funcionou lá também. Você só precisa baixar os arquivos de cabeçalho necessários para a sua versão do kernel da mesma maneira.

Atualização. Pessoas experientes sugeriram: para não depender da versão do kernel, você precisa coletar e instalar drivers usando dkms. O leia-me do driver também contém esta opção.

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 remendo para o ID do dispositivo foi aceito no ramo principal do repositório lwfinger/rtl8188eu.

referências
- Adaptadores Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- fonte rpi

Fonte: habr.com