Zaprzyjaźnijmy się z RaspberryPi za pomocą TP-Link TL-WN727N

Hej Habra!

Kiedyś zdecydowałem się połączyć moją malinkę z Internetem drogą bezprzewodową.

Prędzej powiedziane, niż zrobione, w tym celu kupiłem gwizdek USB Wi-Fi znanej firmy TP-Link z najbliższego sklepu. Od razu powiem, że to nie jest jakiś moduł nano USB, ale całkiem spore urządzenie, wielkości zwykłego pendrive'a (lub jak kto woli, wielkości palca wskazującego dorosłego mężczyzny). Przed zakupem zrobiłem mały research na liście obsługiwanych producentów gwizdków dla RPI i TP-Link znalazł się na tej liście (jednak jak się później okazało, nie wziąłem pod uwagę niuansów, bo diabeł jak wiadomo , tkwi w szczegółach). Tak zaczyna się zimna opowieść o moich nieszczęściach, przedstawiamy Państwu kryminał w 3 częściach. Dla zainteresowanych odsyłam do kat.

Artykuł Podłączanie adaptera WiFi WN727N do Ubuntu/Mint Częściowo mi pomogło, ale przede wszystkim.

Warunki problemu

Biorąc pod uwagę:

  1. komputer jednopłytkowy Raspberry Pi 2 B v1.1 – 1 szt
  2. Gwizdek USB Wi-Fi WN727N - 1 szt
  3. para niezbyt krzywych rąk - 2 sztuki
  4. Jako system operacyjny zainstalowany jest najnowszy Raspbian (oparty na Debianie 10 Buster)
  5. wersja jądra 4.19.73-v7+

Znajdź: połącz się z Internetem (Wi-Fi jest dystrybuowane z domowego routera)

Po rozpakowaniu adaptera zapoznałem się z instrukcją znajdującą się w środku:

Zgodność systemu: Windows 10/8/7/XP (nawet niebo, nawet XP) i MacOS 10.9-10.13

Hmm, jak zwykle ani słowa o Linuksie. Był rok 2, a sterowniki nadal trzeba było montować ręcznie...

Mieliśmy ze sobą 2 kompilatory, 75 tysięcy bibliotek, pięć binarnych blobów, połowę tablicy nagich kobiet z logo i całe morze nagłówków wszystkich języków i znaczników. Nie żeby był to zestaw niezbędny do tego zadania. Kiedy jednak zaczniesz montować system dla siebie, trudno będzie przestać. Jedyne co mnie zaniepokoiło to sterowniki do Wi-Fi. Nie ma nic bardziej bezradnego, nieodpowiedzialnego i skorumpowanego niż budowanie sterowników ze źródła. Wiedziałem jednak, że prędzej czy później przejdziemy na te śmiecie.

Ogólnie rzecz biorąc, jak wiadomo, manipulowanie przy USB Wi-Fi w systemie Linux jest bolesne i nieco pozbawione smaku (jak rosyjskie sushi).

W pudełku znajduje się także płyta CD ze sterownikami. Bez większej nadziei patrzę na to, co na nim jest – zdecydowanie o to nie zadbali. Wyszukiwarka internetowa zaprowadziła mnie na stronę producenta, ale jest tam sterownik dla Linuksa, przeznaczony tylko do rewizji urządzenia v4i był w moich ramionach v5.21. A poza tym dla bardzo starych wersji jądra 2.6-3.16. Zniechęcony porażką już na początku pomyślałem, że powinienem wziąć TL-WN727N (jest trochę droższy i u mnie radzi sobie z 300Mbps w porównaniu do 150, ale jak się okazało, dla mnie to nie ma żadnego znaczenia) malina, o tym napiszemy później). Ale najważniejsze jest to, że sterowniki już istnieją i można je po prostu zainstalować jako pakiet oprogramowanie-ralink. Zwykle wersję urządzenia można zobaczyć na korpusie urządzenia, na naklejce obok numeru seryjnego.

Dalsze googlowanie i odwiedzanie różnych forów nie przyniosło wiele dobrego. Najwyraźniej nikt przede mną nie próbował podłączyć takiego adaptera do Linuksa. Hmm, mam szczęście jak tonący człowiek.

Choć nie, kłamię, odwiedzanie forów (głównie anglojęzycznych) też przyniosło efekty, w niektórych tematach pojawiała się wzmianka o niejakim panu Lwfingerze, który słynie z pisania szeregu sterowników do kart Wi-Fi . Jego repozytorium git znajduje się na końcu artykułu w linkach. Druga lekcja, jaką wyciągnąłem, jest taka, że ​​musisz zidentyfikować swoje urządzenie, aby zrozumieć, który sterownik może być dla niego odpowiedni.

Część 1: Tożsamość Bourne’a

Po podłączeniu urządzenia do portu oczywiście nie świeciła się żadna dioda. I ogólnie nie jest jasne, czy coś działa, czy nie.

Przede wszystkim, aby dowiedzieć się, czy jądro widzi nasze urządzenie, zaglądam do 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

Okazało się, że widzi, a nawet widać, że na magistrali USB znajduje się układ Realtek i VID/PID samego urządzenia.

Pójdźmy dalej i spójrzmy lsusb, i tu czeka 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 nieśmiało pokazuje zamiast nazwy pustą spację (choć sprzedawca=2357 to na pewno TP-Link).

Na tym etapie dociekliwy czytelnik zapewne zauważył już coś interesującego, ale zostawmy to do czasu.

Zgłębianie problemu pustych nazw doprowadziło mnie do strony z identyfikatorami, gdzie wpisuje się informacje o znanym VID/PID. Nie było naszego numeru 2357:0111. Jak się później okazało, narzędzie lsusb używa pliku /usr/share/misc/usb.ids, czyli ta sama lista identyfikatorów z tej witryny. Aby zachować piękno wyświetlacza, po prostu dodałem w moim systemie linie dla dostawcy TP-Link.

2357  TP-Link
        0111  TL-WN727N v5.21

Cóż, poprawiliśmy wyświetlanie na liście urządzeń, ale nie przybliżyło nas to ani o krok do wyboru sterownika. Aby wybrać sterownik, musisz wiedzieć, na jakim chipie wykonany jest Twój gwizdek. Kolejne nieudane próby dowiedzenia się o tym w Internecie nie przyniosły niczego dobrego. Uzbrojony w cienki śrubokręt płaski, ostrożnie podważam zatyczkę adaptera i pojawia się okrutny pomysł wujka Liao w całej swojej nieskazitelnej nagości. Pod lupą widać nazwę chipa - RTL8188EUS. To już jest dobre. Na niektórych forach widziałem posty, że sterownik od tego samego pana lwfingera dobrze pasuje do tego chipa (mimo że pisze tylko o RTL8188EU).

Część 2: Supremacja Bourne’a

Pobieram źródła sterowników z Git.

Nadszedł czas na ponowną instalację systemu Windows i zrobienie tego, z czym zwykle kojarzą się użytkownicy Linuksa – złożenie czegoś w tym stylu. Jak się okazuje, składanie sterowników niewiele różni się od kompilacji programów:

make
sudo make install

ale do skompilowania modułów jądra potrzebujemy plików nagłówkowych jądra dla naszej konkretnej wersji.

W repozytorium stockowym znajduje się pakiet nagłówki jądra raspberrypi, ale zawiera wersję jądra plików 4.19.66-v7l+i to nam nie odpowiada. Ale jak się okazało, aby uzyskać nagłówki wymaganej wersji, istnieje wygodne narzędzie źródło rpi (link na końcu na Githubie), za pomocą którego możesz pobrać niezbędne nagłówki. Klonujemy repozytorium, sprawiamy, że skrypt staje się wykonywalny i uruchamiamy go. Pierwsze uruchomienie kończy się niepowodzeniem z powodu błędu - nie ma narzędzia bc. Na szczęście znajduje się on w repozytorium i po prostu go instalujemy.

sudo apt-get install bc

Następnie ponowne uruchomienie i pobranie nagłówków (a następnie skonfigurowanie czegoś, teraz nie pamiętam) zajmuje trochę czasu i możesz usiąść na krześle, system Windows stał się lepszy we wszystkich swoich przejawach.

Po pobraniu wszystkich nagłówków sprawdź, czy katalog się pojawił /lib/modules/4.19.73-v7+ a w nim dowiązanie symboliczne wskazuje miejsce, w którym znajdują się pobrane pliki (u mnie jest 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żesz rozpocząć montaż. Ponowne złożenie modułów zajmuje trochę czasu, Raspberry nie jest szybką bestią (posiada 32-bitowy 900Mhz Cortex ARM v7).
Więc wszystko skompilowane. W drugim kroku (make install) instalujemy sterownik, jednocześnie kopiując więcej plików oprogramowania sprzętowego niezbędnych 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 Bourne'a

Podłączam gwizdek do portu i... nic się nie dzieje. Czy to wszystko było na nic?

Zaczynam przeglądać pliki wewnątrz projektu i w jednym z nich znajduję, na czym polegał problem: sterownik podaje pełną listę identyfikatorów VID/PID, które może obsługiwać. A żeby nasze urządzenie współpracowało z tym sterownikiem po prostu dodałem do pliku mój identyfikator 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 */
};

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

I tym razem wszystko się zaczęło. Zaświeciła się lampka na adapterze, a na liście interfejsów sieciowych pojawiło się nowe urządzenie.

Przeglądanie interfejsów bezprzewodowych pokazuje następujące informacje:

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

Bonus dla tych, którzy przeczytali do końca

Pamiętasz, jak mówiłem, że nie ma znaczenia, jaka maksymalna prędkość jest podana na karcie?
Tak więc w Malince (przed wypuszczeniem modelu 4) wszystkie urządzenia (w tym adapter Ethernet) znajdują się na tej samej magistrali USB. Świetnie, prawda? Dlatego przepustowość magistrali USB jest dzielona pomiędzy wszystkie urządzenia na niej. Podczas pomiaru prędkości zarówno przez Ethernet, jak i przez USB Wi-Fi (podłączony do 1 routera), zarówno drogą powietrzną, jak i przewodową, wynosiła ona około 20 Mbit/s.

PS Ogólnie rzecz biorąc, ten przewodnik dotyczący kompilacji sterownika dla tej konkretnej karty dotyczy nie tylko RPI. Następnie powtórzyłem to na moim komputerze stacjonarnym z Linux Mint - tam też wszystko działało. Musisz tylko pobrać niezbędne pliki nagłówkowe dla swojej wersji jądra w ten sam sposób.

UPD. Znające się osoby zasugerowały: aby nie polegać na wersji jądra, musisz zebrać i zainstalować sterowniki za pomocą dkms. Plik Readme sterownika również zawiera tę opcję.

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

referencje
- Adaptery Wi-Fi USB RPi
- Gitbuba lwfinger/rtl8188eu
- identyfikatory USB
- źródło rpi

Źródło: www.habr.com