Hagamos amigos RaspberryPi con TP-Link TL-WN727N

¡Hola, Habr!

Una vez decidí conectar mi frambuesa a Internet por aire.

Dicho y hecho, para ello compré en la tienda más cercana un silbato wifi usb de la conocida empresa TP-Link. Diré de inmediato que este no es un módulo nano USB, sino un dispositivo bastante grande, aproximadamente del tamaño de una unidad flash normal (o, si lo desea, del tamaño del dedo índice de un hombre adulto). Antes de comprar, investigué un poco la lista de fabricantes de silbidos compatibles con RPI y TP-Link estaba en la lista (sin embargo, como resultó más tarde, no tomé en cuenta las sutilezas, porque el diablo, como sabemos , está en los detalles). Así comienza la fría historia de mis desventuras, presentamos a su atención una historia de detectives en 3 partes. Para aquellos interesados, consulte el cat.

Статья Conexión del adaptador WiFi WN727N a Ubuntu/Mint Me ayudó parcialmente, pero lo primero es lo primero.

Condiciones del problema

mayo:

  1. Computadora de placa única Raspberry Pi 2 B v1.1 – 1 pieza
  2. silbato wifi usb WN727N - 1 pieza
  3. un par de manos no del todo torcidas - 2 piezas
  4. Se instala el último Raspbian como sistema operativo (basado en Debian 10 Buster)
  5. versión del núcleo 4.19.73-v7+

Buscar: conectarse a Internet (Wi-Fi se distribuye desde el enrutador de su hogar)

Después de desembalar el adaptador, leí las instrucciones que contiene:

Compatibilidad del sistema: Windows 10/8/7/XP (incluso el cielo, incluso XP) y MacOS 10.9-10.13

Hmm, como siempre, ni una palabra sobre Linux. Era 2k19 y todavía era necesario ensamblar los controladores manualmente...

Teníamos con nosotros 2 compiladores, 75 mil bibliotecas, cinco blobs binarios, media serie de mujeres desnudas con un logo y todo un mar de encabezados de todos los idiomas y marcas. No es que este sea un conjunto necesario para el trabajo. Pero una vez que empiezas a montar un sistema por ti mismo, resulta difícil detenerlo. Lo único que me preocupó fueron los controladores de wifi. No hay nada más impotente, irresponsable y corrupto que crear controladores a partir de la fuente. Pero sabía que tarde o temprano cambiaríamos a esta basura.

En general, como sabes, jugar con Wi-Fi USB en Linux es doloroso y algo insípido (como el sushi ruso).

La caja también contiene un CD con drivers. Sin muchas esperanzas miro lo que hay en él: definitivamente no se han ocupado de ello. Una búsqueda en Internet me llevó al sitio web del fabricante, pero allí hay un controlador de Linux solo para la revisión del dispositivo. v4y en mis brazos estaba v5.21. Y además, para versiones de kernel muy antiguas 2.6-3.16. Desanimado por el fallo desde el principio, ya pensé que debería haber elegido el TL-WN727N (es un poco más caro y puede manejar 300 Mbps frente a 150 del mío, pero resultó que esto no importa en absoluto para la frambuesa, de esto hablaremos más adelante). Pero lo más importante es que los controladores ya existen y simplemente se instalan como un paquete. firmware-ralink. Por lo general, puede ver la revisión del dispositivo en el cuerpo del dispositivo en una etiqueta al lado del número de serie.

Seguir buscando en Google y visitar varios foros no sirvió de mucho. Al parecer, nadie antes que yo había intentado conectar un adaptador de este tipo a Linux. Mmmm, tengo tanta suerte como un ahogado.

Aunque no, miento, las visitas a foros (principalmente en inglés) también dieron sus frutos, en algunos temas se mencionó a un tal Sr. Lwfinger, famoso por escribir varios controladores para adaptadores Wi-Fi. . Su repositorio de git se encuentra al final del artículo en los enlaces. Y la segunda lección que aprendí es que necesitas identificar tu dispositivo para entender qué controlador puede ser adecuado para él.

Parte 1: La identidad Bourne

Cuando el dispositivo estaba conectado al puerto, por supuesto, no se encendía ningún LED. Y, en general, no está claro si algo funciona o no.

En primer lugar, para saber si el kernel ve nuestro dispositivo, busco 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

Resultó que se ve, e incluso está claro que hay un chip Realtek y el VID/PID del propio dispositivo en el bus USB.

Vayamos más lejos y miremos. lsusb, y aquí nos espera otro 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

El sistema no sabe qué tipo de dispositivo es y tímidamente muestra un espacio vacío en lugar del nombre (aunque proveedor=2357 es definitivamente TP-Link).

A estas alturas, el lector curioso probablemente ya haya notado algo interesante, pero lo dejaremos para nuestro momento.

Investigar el problema de los nombres vacíos me llevó a un sitio con identificadores, donde se ingresa información sobre VID/PID conocidos. Nuestro 2357:0111 no estaba. Como resultó más tarde, la utilidad lsusb usa archivo /usr/share/misc/usb.ids, que es la misma lista de ID de este sitio. Para la belleza de la pantalla, simplemente agregué líneas para el proveedor TP-Link en mi sistema.

2357  TP-Link
        0111  TL-WN727N v5.21

Bueno, corregimos la visualización en la lista de dispositivos, pero eso no nos acercó ni un paso más a la elección de un controlador. Para seleccionar un conductor, necesita saber en qué chip está hecho su silbato. Los siguientes intentos fallidos de averiguarlo en Internet no condujeron a nada bueno. Armado con un fino destornillador plano, quito con cuidado la tapa del adaptador y la cruel creación del tío Liao aparece en toda su prístina desnudez. Debajo de una lupa puedes ver el nombre del chip: RTL8188EUS. Esto ya es bueno. En algunos foros vi publicaciones que decían que el controlador del mismo caballero lwfinger es muy adecuado para este chip (aunque solo escribe sobre RTL8188EU).

Parte 2: La supremacía de Bourne

Descargué las fuentes del controlador de Git.

Es hora de reinstalar Windows y hacer lo que normalmente se asocia a los usuarios de Linux: ensamblar algo de algún tipo. Resulta que ensamblar controladores difiere poco de compilar programas:

make
sudo make install

pero para compilar los módulos del kernel necesitamos los archivos de encabezado del kernel para nuestra versión específica.

Hay un paquete en el repositorio de stock. encabezados-del-kernel-raspberrypi, pero contiene la versión del kernel de los archivos. 4.19.66-v7l+, y eso no nos conviene. Pero resultó que para obtener los encabezados de la versión requerida, existe una herramienta conveniente. fuente rpi (enlace al final en Github), con el que podrás descargar los encabezados necesarios. Clonamos el repositorio, hacemos ejecutable el script y lo ejecutamos. El primer lanzamiento falla con un error: no hay utilidad bc. Afortunadamente está en el repositorio y simplemente lo instalamos.

sudo apt-get install bc

Después de eso, reiniciar y descargar los encabezados (y luego configurar algo, no lo recuerdo ahora) lleva algo de tiempo y puedes sentarte en tu silla, Windows ha mejorado en todas sus manifestaciones.

Después de descargar todos los encabezados, verifique que aparezca el directorio. /lib/modules/4.19.73-v7+ y en él el enlace simbólico apunta al lugar donde se encuentran los archivos descargados (para mí es /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

La etapa preparatoria ha finalizado, puede comenzar el montaje. Volver a montar los módulos lleva algo de tiempo, la Raspberry no es una bestia rápida (tiene un Cortex ARM v32 de 900 bits y 7 Mhz).
Entonces todo compilado. Instalamos el controlador en el segundo paso (realizar la instalación), al mismo tiempo que copiamos más archivos de firmware necesarios para que el 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. El ultimátum de Bourne

Conecto el silbato al puerto y... no pasa nada. ¿Fue todo en vano?

Empiezo a estudiar los archivos dentro del proyecto y en uno de ellos encuentro cuál era el problema: el controlador especifica una lista completa de identificadores VID/PID que puede servir. Y para que nuestro dispositivo funcione con este controlador, simplemente agregué mi identificación al archivo 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 */
};

Recompilé el controlador y lo reinstalé en el sistema.

Y esta vez todo empezó. La luz del adaptador se encendió y apareció un nuevo dispositivo en la lista de interfaces de red.

La visualización de interfaces inalámbricas muestra lo siguiente:

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

Bono para quienes lean hasta el final.

¿Recuerdas que dije que no importa la velocidad máxima indicada en tu adaptador?
Entonces, en Malinka (antes del lanzamiento del modelo 4), todos los dispositivos (incluido el adaptador Ethernet) se encuentran en el mismo bus USB. Genial, ¿verdad? Y, por lo tanto, el ancho de banda del bus USB se divide entre todos los dispositivos que contiene. Al medir la velocidad tanto a través de Ethernet como a través de Wi-Fi USB (conectado a 1 enrutador), tanto por aire como por cable, fue de alrededor de 20 Mbit/s.

PD: En general, esta guía para compilar un controlador para este adaptador en particular es válida no solo para RPI. Luego lo repetí en mi escritorio con Linux Mint; todo funcionó allí también. Sólo necesita descargar los archivos de encabezado necesarios para su versión del kernel de la misma manera.

UPD. Personas con conocimientos sugirieron: para no depender de la versión del kernel, es necesario recopilar e instalar controladores utilizando dkms. El archivo Léame del controlador también contiene 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. Propuesto parche para la identificación del dispositivo fue aceptado en la rama principal del repositorio lwfinger/rtl8188eu.

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

Fuente: habr.com