Fagamos amigos RaspberryPi con TP-Link TL-WN727N

Ola Habr!

Unha vez decidín conectar a miña framboesa a Internet polo aire.

Nada máis dicir que feito, para este fin merquei un asubío usb wi-fi da coñecida empresa TP-Link na tenda máis próxima. Direi de inmediato que non se trata dunha especie de módulo nano USB, senón dun dispositivo bastante grande, aproximadamente do tamaño dunha unidade flash normal (ou, se o desexa, do tamaño do dedo índice dun home adulto). Antes de mercar, investiguei un pouco sobre a lista de fabricantes de silbatos compatibles para RPI e TP-Link estaba na lista (sen embargo, como resultou máis tarde, non tiven en conta as sutilezas, porque o diaño, como sabemos, , está nos detalles). Así, comeza a fría historia das miñas desventuras; presentámosvos unha historia policial en 3 partes. Para os interesados, consulte cat.

Artigo Conectando o adaptador WiFi WN727N a Ubuntu/Mint Axudoume parcialmente, pero primeiro o primeiro.

Condicións do problema

Dado:

  1. Ordenador de placa única Raspberry Pi 2 B v1.1 – 1 peza
  2. silbato usb wi-fi WN727N - 1 peza
  3. un par de mans non moi torcidas - 2 pezas
  4. O último Raspbian está instalado como SO (baseado en Debian 10 Buster)
  5. versión do núcleo 4.19.73-v7+

Buscar: conectarse a Internet (a wifi distribúese dende o seu enrutador doméstico)

Despois de desembalar o adaptador, lin as instrucións no interior:

Compatibilidade do sistema: Windows 10/8/7/XP (incluso o ceo, incluso XP) e MacOS 10.9-10.13

Hmm, como de costume, nin unha palabra sobre Linux. Era 2k19, e os controladores aínda debían montarse manualmente...

Tivemos connosco 2 compiladores, 75 mil bibliotecas, cinco blobs binarios, medio conxunto de mulleres espidas cun logotipo e todo un mar de cabeceiras de todos os idiomas e marcas. Non é que este sexa un conxunto necesario para o traballo. Pero unha vez que comezas a montar un sistema por ti mesmo, faise difícil parar. O único que me causou preocupación foron os controladores para wi-fi. Non hai nada máis indefenso, irresponsable e corrupto que construír controladores desde a orixe. Pero sabía que tarde ou cedo cambiaríamos a este lixo.

En xeral, como sabes, xogar co wi-fi USB en Linux é doloroso e algo insípido (como o sushi ruso).

A caixa tamén contén un CD con controladores. Sen moitas esperanzas miro o que hai nel - definitivamente non se ocuparon del. Unha busca en Internet levoume ao sitio web do fabricante, pero hai un controlador de Linux alí só para a revisión do dispositivo v4, e nos meus brazos estaba v5.21. E ademais, para versións do núcleo moi antigas 2.6-3.16. Desanimado polo fallo ao principio, xa pensei que debería ter tomado o TL-WN727N (é un pouco máis caro e pode soportar 300 Mbps fronte aos 150 do meu, pero como resultou, isto non importa nada para a framboesa, sobre isto escribirase máis adiante). Pero o máis importante é que xa existen controladores para iso e simplemente se instalan como un paquete firmware-ralink. Normalmente podes ver a revisión do dispositivo no corpo do dispositivo nun adhesivo xunto ao número de serie.

Seguir en Google e visitar varios foros non trouxo moito bo. Ao parecer, ninguén antes que min intentou conectar un adaptador deste tipo a Linux. Hmm, teño a sorte coma un afogado.

Aínda que, non, mento, visitar foros (sobre todo en inglés) tamén deu os seus froitos, nalgúns temas facíase mención a un tal señor lwfinger, famoso por escribir unha serie de controladores para adaptadores Wi-Fi. . O seu repositorio git está ao final do artigo nas ligazóns. E a segunda lección que aprendín é que debes identificar o teu dispositivo para comprender que controlador pode ser axeitado para el.

Parte 1: A identidade de Bourne

Cando o dispositivo estaba conectado ao porto, por suposto, non se acendeu ningún LED. E en xeral non está claro de ningún xeito se algo funciona ou non.

En primeiro lugar, para saber se o núcleo ve o noso dispositivo, miro en 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

Resultou que ve, e ata está claro que hai un chip Realtek e o VID/PID do propio dispositivo no bus USB.

Imos máis alá e miramos lsusb, e aquí agárdanos outro fracaso

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 non sabe que tipo de dispositivo é, e mostra con timidez un espazo baleiro en lugar do nome (aínda que o vendedor=2357 é definitivamente TP-Link).

Neste momento, o lector curioso probablemente xa notou algo interesante, pero deixarémolo para o noso tempo.

A investigación do problema dos nomes baleiros levoume a un sitio con identificadores, onde se introduce información sobre VID/PID coñecido. O noso 2357:0111 non estaba alí. Como se viu máis tarde, a utilidade lsusb usa ficheiro /usr/share/misc/usb.ids, que é a mesma lista de ID deste sitio. Para a beleza da pantalla, simplemente engadín liñas para o vendedor TP-Link no meu sistema.

2357  TP-Link
        0111  TL-WN727N v5.21

Ben, corriximos a visualización na lista de dispositivos, pero non nos achegou un paso máis á elección dun controlador. Para seleccionar un condutor, debes saber en que chip está feito o teu asubío. Os seguintes intentos infrutuosos de descubrir isto en Internet non levaron a nada bo. Armado cun chave de fenda fina, saco coidadosamente a tapa do adaptador e a idea viciosa do tío Liao aparece en toda a súa prístina nudez. Baixo unha lupa podes ver o nome do chip - RTL8188EUS. Isto xa está ben. Nalgúns foros vin publicacións que indicaban que o controlador dese mesmo señor lwfinger é moi axeitado para este chip (aínda que só escribe sobre RTL8188EU).

Parte 2: A supremacía de Bourne

Descargo as fontes do controlador de Git.

É hora de reinstalar Windows e facer o que os usuarios de Linux adoitan estar asociados: montar algo dalgún tipo. A montaxe de controladores, polo que se ve, difiere pouco da compilación de programas:

make
sudo make install

pero para compilar módulos do núcleo necesitamos os ficheiros de cabeceira do núcleo para a nosa versión específica.

Hai un paquete no repositorio de accións raspberrypi-kernel-headers, pero contén a versión do núcleo dos ficheiros 4.19.66-v7l+, e iso non nos convén. Pero para obter as cabeceiras da versión necesaria, como se viu, hai unha ferramenta conveniente fonte rpi (ligazón ao final en Github), coa que podes descargar as cabeceiras necesarias. Clonamos o repositorio, facemos o script executable e executámolo. O primeiro lanzamento falla cun erro: non hai ningunha utilidade bc. Afortunadamente, está no repositorio e simplemente o instalamos.

sudo apt-get install bc

Despois diso, reiniciar e descargar as cabeceiras (e despois configurar algo, agora non lembro) leva algún tempo e podes sentarte na túa cadeira, Windows mellorou en todas as súas manifestacións.

Despois de descargar todas as cabeceiras, comprobe que aparece o directorio /lib/modules/4.19.73-v7+ e nela a ligazón simbólica apunta ao lugar onde se atopan os ficheiros descargados (para min é /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 preparatoria foi completada, pode comezar a montaxe. Montar de novo os módulos leva algún tempo, o Raspberry non é unha besta rápida (ten un Cortex ARM v32 de 900 bits a 7 Mhz).
Así que todo compilado. Instalamos o controlador no 2º paso (fai a instalación), ao tempo que copiamos máis ficheiros de firmware necesarios para que o controlador funcione:

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 ultimátum de Bourne

Enchufo o pito no porto e... non pasa nada. Foi todo para nada?

Comezo a estudar os ficheiros dentro do proxecto e nun deles atopo cal era o problema: o controlador especifica unha lista completa de identificadores VID/PID que pode servir. E para que o noso dispositivo funcione con este controlador, simplemente engadín o meu ID ao ficheiro 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 */
};

Compilei o controlador e reinstalei no sistema.

E esta vez comezou todo. A luz do adaptador acendeuse e apareceu un novo dispositivo na lista de interfaces de rede.

Ao ver interfaces sen fíos 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

Bonificación para os que len ata o final

Lembras como dixen que non importa a velocidade máxima indicada no teu adaptador?
Así, en Malinka (antes do lanzamento do modelo 4), todos os dispositivos (incluído o adaptador Ethernet) están no mesmo bus USB. Estupendo, non? E polo tanto, o ancho de banda do bus USB divídese entre todos os dispositivos nel. Ao medir a velocidade tanto por ethernet como por usb wi-fi (conectado a 1 enrutador) tanto por vía aérea como por cable, roldaba os 20 Mbit/s.

PS En xeral, esta guía para compilar un controlador para este adaptador en particular é válida non só para RPI. Despois repetín no meu escritorio con Linux Mint; alí tamén funcionaba todo. Só precisa descargar os ficheiros de cabeceira necesarios para a súa versión do núcleo do mesmo xeito.

UPD. Persoas coñecedoras suxeriron: para non depender da versión do núcleo, cómpre recoller e instalar controladores usando dkms. O readme para o controlador tamén contén esta opción.

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 parche para a identificación do dispositivo foi aceptada na rama principal do repositorio lwfinger/rtl8188eu.

referencias
- Adaptadores Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- fonte rpi

Fonte: www.habr.com