Łączymy RaspberryPi z TP-Link TL-WN727N

Cześć, Habr!

Pewnego dnia postanowiłem podłączyć swoją malinkę do internetu bezprzewodowo.

Zrobione, w tym celu kupiłem w najbliższym sklepie usb wi-fi dongla znanej firmy TP-Link. Od razu powiem, że to nie jest jakiś tam nano usb moduł, a całkiem spory sprzęt wielkości zwykłego pendrive'a (lub, jeśli wolisz, wielkości palca wskazującego dorosłego mężczyzny). Przed zakupem trochę przejrzałem listę producentów wspierających dongle dla RPI i TP-Link znajdował się na liście (jak się później okazało, nie uwzględniłem pewnych szczegółów, ponieważ diabeł tkwi w szczegółach). Tak więc, pierwsza część mojej historii zaczyna się, a waszej uwadze oferuję detektywistyczną opowieść w 3 częściach. Zainteresowanych zapraszam dalej.

Artykuł Łączymy adapter WiFi WN727N z Ubuntu/Mint częściowo mi pomogła, ale wszystko po kolei.

Warunki zadania

Dane:

  1. jednopłytowy komputer Raspberry Pi 2 B v1.1 — 1 sztuka
  2. usb wi-fi dongle WN727N — 1 sztuka
  3. para niezbyt krzywych rąk — 2 sztuki
  4. jako system operacyjny zainstalowano najnowszego Raspbiana (opartego na debianie 10 Buster)
  5. jądro w wersji 4.19.73-v7+

Znaleźć: nawiązać połączenie z internetem (WiFi rozdzielane przez domowy router)

Po rozpakowaniu adaptera przeczytałem instrukcję w środku:

System Compatibility: Windows 10/8/7/XP (nawet niebo, nawet XP) i MacOS 10.9-10.13

No cóż, o linuxach jak zwykle ani słowa. Rok 2019 a sterowniki wciąż trzeba było zbierać ręcznie...

Mieliśmy ze sobą 2 kompilatory, 75 tysięcy bibliotek, pięć binarnych blobów, półtora zestawu pustych bab z logotypem i całe morze nagłówków we wszystkich językach i formatach. Nie było to co prawda niezbędne do pracy, ale gdy zaczynasz budować system dla siebie, trudno jest się zatrzymać. Jedyne, co mnie niepokoiło, to sterowniki do wi-fi. Nie ma nic bardziej bezradnego, nieodpowiedzialnego i zniszczonego niż budowa sterowników ze źródeł. Ale wiedziałem, że prędzej czy później do tego przejdziemy.

Jak wiadomo, zabawa z usb wi-fi na linuxie to bolesne i trochę niesmaczne (jak rosyjskie sushi).

W pudełku znajdował się także CD z sterownikami. Bez większej nadziei sprawdzam, co jest na nim — dokładnie, nie zadbali o to. Poszukiwanie w internecie doprowadziło mnie na stronę producenta, ale tam był tylko linuksowy sterownik dla wersji urządzenia v4, a w moich rękach miałem v5.21. A ponadto pod bardzo starymi wersjami jądra 2.6-3.16. Zniechęcony niepowodzeniem już na początku pomyślałem, że powinienem był wziąć TL-WN727N (jest trochę droższy i obsługuje 300Mbps w porównaniu do 150 u mojego, ale jak się okazało dla maliny w ogóle to nie ma znaczenia, o tym napiszę później). Ale co najważniejsze, sterowniki do niego już są i instaluje się je po prostu pakietem. firmware-ralink. Zazwyczaj rewizję urządzenia można znaleźć na obudowie na naklejce obok numeru seryjnego.

Dalsze googlowanie i odwiedzanie różnych forów w zasadzie nic dobrego nie przyniosło. Wygląda na to, że nikt przede mną nie próbował podłączać tego konkretnego adaptera do Linuksa. Cóż, mam pecha jak utopieniec.

Chociaż nie, kłamię, odwiedziny forów (głównie anglojęzycznych) także przyniosły jakieś rezultaty, w niektórych wątkach pojawiło się wspomnienie o pewnym panu lwfinger, który słynie z tego, że napisał kilka sterowników dla adapterów Wi-Fi. Jego repozytorium na GitHubie znajduje się na końcu artykułu w linkach. A druga lekcja, którą przyswoiłem - trzeba zidentyfikować swoje urządzenie, aby zrozumieć, który sterownik może do niego pasować.

Część 1. Identyfikacja urządzenia

Po podłączeniu urządzenia do portu żaden diodowy wskaźnik oczywiście się nie zapalił. I w ogóle nie było jasne, czy coś działa, czy nie.

Najpierw, aby ustalić, czy jądro widzi nasze urządzenie, zaglądam do dmesg:

[  965.606998] usb 1-1.3: nowe urządzenie USB o wysokiej szybkości numer 9 używające dwc_otg
[  965.738195] usb 1-1.3: Nowe urządzenie USB znalezione, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Nowe napisy urządzenia USB: Mfr=1, Product=2, SerialNumber=3
[  965.738231] usb 1-1.3: Produkt: 802.11n NIC
[  965.738243] usb 1-1.3: Producent: Realtek
[  965.738255] usb 1-1.3: Numer seryjny: 00E04C0001

Okazało się, że widzi i można zrozumieć, że tam jest chip Realtek oraz sam VID/PID urządzenia na magistrali USB.

Idziemy dalej, patrzymy lsusb, i tutaj czeka na nas kolejna porażka

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

System nie wie, co to za urządzenie, i skromnie pokazuje puste miejsce zamiast nazwy (choć vendor=2357 to na pewno TP-Link).

Na tym etapie ciekawy czytelnik zapewne już zauważył coś interesującego, ale odłożymy to na później.

Badanie problemu pustych nazw doprowadziło mnie na stronę z identyfikatorami, gdzie wpisywane są informacje o znanych VID/PID. Naszego 2357:0111 tam nie znalazłem. Jak się później okazało, narzędzie lsusb używa pliku /usr/share/misc/usb.ids, który jest tym samym zestawem identyfikatorów z tej strony. Aby ładniej to wyświetlić, po prostu dodałem do swojej systemu w nim wiersze dla dostawcy TP-Link.

2357  TP-Link
        0111  TL-WN727N v5.21

Więc poprawiliśmy wyświetlanie w liście urządzeń, ale nie przybliżyliśmy się do wyboru sterownika ani na krok. Aby wybrać sterownik, trzeba wiedzieć, na jakim chipie zrobiono twój adapter. Kolejne bezskuteczne próby, aby dowiedzieć się tego w internecie, nie przyniosły nic dobrego. Uzbrojony w cienką śrubokręt, delikatnie podważam pokrywkę adaptera i moim oczom ukazuje się w całej swojej pierwotnej nagiej postaci grzeszne dziecko wujka Liao. Pod lupą można dostrzec nazwę chipa — RTL8188EUS. To już dobrze. Na jakichś forach widziałem posty, że pod ten chip świetnie nadaje się właśnie sterownik tego pana lwfinger (nawet mimo że jest napisane tylko o RTL8188EU).

Część 2. Doskonałość Borna

Pobieram źródła sterownika z gita.

Nadeszła pora na reinstalację systemu Windows i zajęcie się tym, co zwykle kojarzy się z użytkownikami Linuksa — kompilacją czegoś ze źródeł. Kompilacja sterowników, jak się okazuje, niewiele różni się od kompilacji programów:

make
sudo make install

ale do kompilacji modułów jądra potrzebujemy nagłówków jądra dla naszej konkretnej wersji.

W standardowym repozytorium jest pakiet raspberrypi-kernel-headers, ale zawiera on wersję plików dla jądra 4.19.66-v7l+, a to nam nie odpowiada. Ale aby uzyskać nagłówki potrzebnej wersji, jak się okazało, istnieje wygodne narzędzie rpi-source (link na końcu w GitHubie), za pomocą którego można pobrać potrzebne nagłówki. Klonujemy repozytorium, czynimy skrypt wykonywalny, uruchamiamy. Pierwsze uruchomienie kończy się błędem — brakuje narzędzia bc. Na szczęście jest w repozytorium i po prostu je instalujemy.

sudo apt-get install bc

Po tym ponowne uruchomienie i pobranie nagłówków (i potem konfiguracja czegoś, już nie pamiętam) zajmuje trochę czasu i można zrelaksować się na oparciu krzesła, Windows stał się lepszy w każdym swoim przejawie.

Po tym, jak wszystkie nagłówki zostały pobrane, sprawdzamy, że pojawił się katalog /lib/modules/4.19.73-v7+ i w nim link symboliczny wskazuje na to miejsce, gdzie leżą pobrane pliki (u mnie to /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

Etap przygotowawczy został zakończony, można przystąpić do montażu. Montaż modułów zajmuje pewien czas, malina nie jest zbyt szybka (ma procesor 32bit 900Mhz Cortex ARM v7).
Tak więc, wszystko się skompilowało. Instalujemy sterownik 2. krokiem (make install), jednocześnie odbywa się kopiowanie innych plików firmware, potrzebnych do działania sterownika:

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/.

Część 3. Ultimatum Borna

Wkładam adapter w port i… nic się nie dzieje. Czy to wszystko było na darmo?

Zaczynam badać pliki w projekcie i w jednym z nich znajduję problem: sterownik ma wskazany pełny wykaz identyfikatorów VID/PID, które może obsłużyć. Aby nasze urządzenie działało z tym sterownikiem, po prostu dodałem swój identyfikator do pliku 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 */
};

Przekompilowałem sterownik i ponownie zainstalowałem go w systemie.

A w tym przypadku wszystko działa. Lampka na adapterze zapaliła się, a na liście interfejsów sieciowych pojawiło się nowe urządzenie.

Przeglądanie interfejsów bezprzewodowych daje następujący wynik:

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     unassociated  ESSID:""  Nickname:""
          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

Bonus dla tych, którzy czytali do końca.

Pamiętacie, jak mówiłem, że nie ma znaczenia, jaka maksymalna prędkość jest podana na waszym adapterze?
Cóż, w modelu Raspberry Pi (przed wydaniem modelu 4) wszystkie urządzenia (w tym adapter ethernet) są podłączone do jednej magistrali USB. Niesamowite, prawda? Dlatego przepustowość magistrali USB dzieli się pomiędzy wszystkie urządzenia. Podczas pomiaru prędkości zarówno przez ethernet, jak i przez USB Wi-Fi (podłączone do 1 routera), oraz przez powietrze i kabel, dawało to około 20 Mbit/s.

P.S. Ten poradnik dotyczący kompilacji sterownika dla tego konkretnego adaptera jest aktualny nie tylko na RPI. Powtórzyłem go później na swoim desktopie z Linux Mint — tam również wszystko zadziałało. Po prostu musicie tak samo pobrać potrzebne pliki nagłówkowe do waszej używanej wersji jądra.

UPD. Ludzie znający się na rzeczy podpowiedzieli: aby nie zależeć od wersji jądra, trzeba budować i instalować sterowniki za pomocą dkms. W readme do sterownika ta opcja też się znajduje.

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. Proponowany łatkę dla identyfikatora urządzenia został przyjęty do głównej gałęzi repozytorium lwfinger/rtl8188eu.

Linki
Adaptery USB Wi-Fi do RPi
GitHub lwfinger/rtl8188eu
usb.ids
rpi-source

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster