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ł częściowo mi pomogła, ale wszystko po kolei.
Warunki zadania
Dane:
- jednopłytowy komputer Raspberry Pi 2 B v1.1 — 1 sztuka
- usb wi-fi dongle WN727N — 1 sztuka
- para niezbyt krzywych rąk — 2 sztuki
- jako system operacyjny zainstalowano najnowszego Raspbiana (opartego na debianie 10 Buster)
- 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 dla identyfikatora urządzenia został przyjęty do głównej gałęzi repozytorium lwfinger/rtl8188eu.
Linki
—
—
—
—
Źródło: habr.com
