Olá Habr!
De alguma forma, pensei em conectar minha framboesa à Internet pelo ar.
Assim que foi feito, para isso, um apito da conhecida empresa TP-Link foi comprado na loja wi-fi usb mais próxima. Devo dizer imediatamente que este não é um tipo de módulo nano usb, mas um dispositivo dimensional do tamanho de uma unidade flash comum (bem, ou se você preferir com o dedo indicador de um homem adulto). Antes de comprar, estudei a lista de fabricantes de apitos suportados para RPI e TP-Link um pouco na lista (embora, como se viu depois, não levei em consideração as sutilezas, porque é sabido que o diabo está nos detalhes). Assim, começa o conto frio de minhas desventuras, uma história de detetive em 3 partes é oferecida à sua atenção. Interessado por favor, sob o gato.
O artigo
Conectando o adaptador WN727N WiFi ao Ubuntu / Mint parcialmente me ajudou, mas primeiro as primeiras coisas.
Condições da tarefa
Dado:
- Computador de placa única Raspberry Pi 2 B v1.1 - 1 pc
- apito wifi WN727N - 1 peça
- um par de mãos não muito tortas - 2 peças
- o Raspbian mais recente é instalado como sistema operacional (baseado no debian 10 Buster)
- versão do kernel 4.19.73-v7 +
Localizar: conectar-se à Internet (o Wi-Fi é ouvido em um roteador doméstico)
Depois de desembalar o adaptador, li as instruções dentro:
Compatibilidade do sistema: Windows 10/8/7 / XP (mesmo céu, mesmo XP) e MacOS 10.9-10.13
Hmm, sobre o Linux, como sempre, nem uma palavra. Era 2k19, mas os drivers ainda precisavam ser montados manualmente ...
Tínhamos 2 compiladores, 75 mil bibliotecas, cinco bolhas binárias, meia massa de mulheres nuas com um logotipo e um mar inteiro de cabeçalhos de todos os idiomas e marcações. Não que fosse um conjunto necessário para o trabalho. Mas se você começou a montar o sistema para si mesmo, fica difícil parar. A única coisa que me preocupou foram os motoristas com wi-fi. Não há nada mais desamparado, irresponsável e mimado do que a montagem de drivers de origem. Mas eu sabia que, mais cedo ou mais tarde, passaremos a esse lixo.
Em geral, como você sabe, mexer com o wi-fi USB no Linux é
doloroso e um pouco insípido (como o sushi russo).
A caixa também contém um CD de driver. Sem muita esperança, olho para o que está nele - com certeza, eles não se importaram. Uma pesquisa na Internet me levou ao site do fabricante, mas há um driver Linux apenas para revisar o dispositivo
v4 , e eu tinha a
v5.21 disponível. Além disso, em versões muito antigas do kernel 2.6-3.16. Desanimado com a falha no início, eu já achava que era necessário usar o TL-WN727N (é um pouco mais caro e pode fazer 300 Mbps versus 150 para o meu, mas acabou sendo irrelevante para as framboesas, será escrito mais tarde). Mas o mais importante é que os drivers já existem e são
instalados simplesmente pelo
pacote firmware-ralink . Geralmente, você pode ver a revisão do dispositivo no estojo do dispositivo no adesivo ao lado do número de série.
Pesquisando mais e visitando vários fóruns não trouxe nada de bom. Aparentemente, ninguém tentou conectar esse adaptador ao Linux antes de mim. Hmm, eu tenho sorte como um homem afogado.
Embora não, estou mentindo, visitar fóruns (principalmente os ingleses) também valeu a pena, em alguns tópicos houve uma menção a um certo Sr. lwfinger, famoso por escrever vários drivers para adaptadores Wi-Fi. Seu repositório git 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. Identificação Bourne
Quando você liga o dispositivo na porta, é claro que nenhum LED acende. E, em geral, de alguma forma, não está claro se algo funciona ou não.
Primeiro de tudo, para descobrir se o kernel vê o 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
Acabou sendo visto, e é claro que existe um chip Realtek e o dispositivo VID / PID no próprio barramento USB.
Vamos mais longe, olhamos para
lsusb e depois outro fracasso 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 o que é esse dispositivo e mostra timidamente um espaço vazio em vez de um nome (embora vendor = 2357 seja exatamente o TP-Link).
Nesta fase, o leitor curioso provavelmente já notou algo interessante, mas adiaremos até o nosso tempo.
A investigação do problema de nomes vazios me levou a um site com identificadores, onde são inseridas informações sobre VID / PID conhecidas. Nosso 2357: 0111 não estava lá. Como se viu depois,
lsusb usa o arquivo
/usr/share/misc/usb.ids , que é a mesma lista de identificadores deste site. Por uma questão de beleza da tela, acabei de adicionar linhas ao fornecedor da 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 mais da escolha de um driver. Para selecionar um driver, você precisa saber em qual chip seu apito é feito. As próximas tentativas malsucedidas de descobrir na Internet não levaram a nada de bom. Armado com uma chave de fenda fina, levanto gentilmente a tampa do adaptador e vejo a ideia cruel do tio Liao em toda a sua nudez intocada. Sob a lupa, você pode ver o nome do chip -
RTL8188EUS . Isso já é bom. Em alguns fóruns, vi posts de que o driver desse mesmo Sr. lwfinger é adequado para esse chip (mesmo que ele só fale sobre RTL8188EU).
Parte 2. A Supremacia Bourne
Eu baixa fontes de driver de um gita.
Está na hora de
reinstalar os trabalhosos para fazer o que o Linux normalmente está associado - montar algo de
diversas formas . A montagem de drivers acabou sendo um pouco diferente da compilação de programas:
make sudo make install
mas para compilar módulos do kernel, precisamos de arquivos de cabeçalho do kernel para nossa versão específica.
Há um pacote
raspberrypi-kernel-headers no repositório de ações, mas ele contém a versão dos arquivos do kernel
4.19.66-v7l + , e isso não nos convém. Porém, para obter os cabeçalhos da versão desejada, existe uma conveniente
ferramenta rpi
-source (link no final do github), com a 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, ele está no repositório e nós apenas o 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 relaxar e
se tornar melhor em todas as suas manifestações .
Após o download de todos os cabeçalhos, verificamos se o diretório
/lib/modules/4.19.73-v7+ aparece e nele o link simbólico aponta para o local onde os arquivos baixados estão (eu tenho este / 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 começar a montar. A montagem dos módulos novamente leva um certo tempo, a framboesa não é uma fera rápida (possui uma pedra de 32 bits 900Mhz Cortex ARM v7).
Então, tudo compilado. Instalamos o driver na segunda etapa (make install), enquanto copiamos também os 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 apito no porto e ... nada acontece. Foi tudo desperdiçado?
Começo a estudar os arquivos dentro do projeto e em um deles encontro o problema: o driver indica a lista completa de VID / PIDs que ele pode servir. E, para que nosso dispositivo funcione com esse driver, acabei de adicionar meu ID ao
arquivo rtl8188eu / os_dep / usb_intf.c static struct usb_device_id rtw_usb_id_tbl[] = { {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, {USB_DEVICE(0x07B8, 0x8179)}, {USB_DEVICE(0x0DF6, 0x0076)}, {USB_DEVICE(0x2001, 0x330F)}, {USB_DEVICE(0x2001, 0x3310)}, {USB_DEVICE(0x2001, 0x3311)}, {USB_DEVICE(0x2001, 0x331B)}, {USB_DEVICE(0x056E, 0x4008)}, {USB_DEVICE(0x2357, 0x010c)}, {USB_DEVICE(0x2357, 0x0111)}, {} };
Recompilou o driver e o reinstalou 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 fornece 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-se de como eu disse que não importa a velocidade máxima indicada no seu adaptador?
Portanto, no raspberry (antes do lançamento do modelo 4), todos os dispositivos (incluindo o adaptador ethernet) estão no mesmo barramento USB. Ótimo, certo? E assim a largura de banda do barramento USB é compartilhada entre todos os dispositivos nele. Ao medir a velocidade através de Ethernet e via USB Wi-Fi (conectado a 1 roteador), tanto pelo ar quanto pelo fio, ele rendeu na região de 20 Mbps.
PS Em geral, este guia de compilação de drivers para este adaptador específico é válido não apenas para o RPI. Em seguida, repeti-o e no meu desktop com o Linux Mint - tudo também funcionou lá. É só que você só precisa baixar os arquivos de cabeçalho necessários para sua versão do kernel.
UPD Pessoas conhecedoras sugeriram: para não depender da versão do kernel, você precisa criar e instalar drivers usando dkms. No leia-me para o driver, esta opção também está lá
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. O
patch proposto 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