Здравей, Хабр!
Реших да свържа малинката си с интернет по въздуха.
Казано-сторено, за това беше закупен в най-близкия магазин usb wi-fi адаптер от известната фирма TP-Link. Веднага ще кажа, че това не е някакъв нано usb модул, а напълно габаритно устройство с размер приблизително като стандартна флашка (или ако предпочитате, размера на показалец на възрастен мъж). Преди покупката малко проучих списъка с поддържани производители на адаптери за RPI и TP-Link беше там (въпреки че след това установих, че не съм взел предвид много подробности, тъй като както е известно, дяволът е в детайлите). И така, хладната приказка за моите премеждия започва, вашето внимание е привлечено към детективска история в 3 части. Заинтересованите моля да продължат.
Статия ми частично помогна, но всичко по реда си.
Условия на задачата
Дадено:
- едноплатен компютър Raspberry Pi 2 B v1.1 — 1 бр.
- usb wi-fi адаптер WN727N — 1 бр.
- две не съвсем криви ръце — 2 бр.
- като ОС е инсталиран последния Raspbian (базиран на debian 10 Buster)
- ядро версия 4.19.73-v7+
Намерете: осъществяване на свързване към интернет (wi-fi от домашния рутер)
След разопаковане на адаптера прочитам инструкциите вътре:
Системна съвместимост: Windows 10/8/7/XP (дори да, дори XP) и MacOS 10.9-10.13
Еех, за линуксите както обикновено нито дума. Вече беше 2019-та, а драйверите все още трябваше да се компилират ръчно...
Имахме с нас 2 компилатора, 75 хил. библиотеки, пет бинарни блоба, половин масив голи жени с логото и море от хедери на всички езици и формати. Не че това беше задължителен набор за работа. Но ако започнеш да компилираш системата си сам, става трудно да спреш. Единственото, което ме тревожеше, бяха драйверите за wi-fi. Няма нищо по-безпомощно, безотговорно и разрушително от сглобяването на драйвери от изходния код. Но знаех, че рано или късно ще преминем и към това.
Всъщност, както е известно, работата с usb wi-fi на линукс е болезнена и малко неприятна (като руски суши).
В кутията имаше и CD с драйвери. Без особена надежда преглеждам какво има на него — точно така, не бяха се погрижили. Търсенето в интернет ме отведе на сайта на производителя, но там имаше линукс драйвер само за ревизия на устройството v4, а на ръка имам v5.21. И в допълнение за много стари версии на ядрото 2.6-3.16. Обезкуражен от провала още в самото начало, вече мислех, че трябваше да взема TL-WN727N (той е малко по-скъп и поддържа 300Mbps в сравнение с 150 на моя, но както се оказа, за Raspberry Pi това изобщо няма значение, за което ще пиша по-долу). Но най-важното е, че драйверите за него вече съществуват и се инсталират лесно с пакет. firmware-ralink. Обикновено ревизията на устройството може да се види на корпуса на устройството на етикета до сериен номер.
По-нататъшното гуглене и посещение на различни форуми не донесе особено добри новини. Явно никой преди мен не е опитвал да свърже точно такъв адаптер на Linux. Уф, късметът ми наистина е нещастен.
Все пак, лъжа, посещението на форуми (главно англоговорящи) също даде своите плодове; в някои теми имаше споменаване на господин lwfinger, който е известен с това, че е написал известен брой драйвери за WiFi адаптери. Неговият Git репозиторий ще бъде включен в линковете в края на статията. И вторият урок, който усвоих — трябва да се идентифицира устройството, за да разберете кой драйвер може да му подхожда.
Част 1. Идентификация на адаптера
При свързването на устройството в порта разбира се, никакъв светодиод не светна. И изобщо не е ясно дали нещо работи или не.
Първо, за да разбера дали ядрото вижда нашето устройство, отивам в dmesg:
[ 965.606998] usb 1-1.3: ново високоскоростно USB устройство номер 9, използващо dwc_otg
[ 965.738195] usb 1-1.3: Ново USB устройство намерено, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[ 965.738219] usb 1-1.3: Нови низове на USB устройство: Mfr=1, Product=2, SerialNumber=3
[ 965.738231] usb 1-1.3: Продукт: 802.11n NIC
[ 965.738243] usb 1-1.3: Производител: Realtek
[ 965.738255] usb 1-1.3: Серийен номер: 00E04C0001
Оказа се, че е видимо, и дори е ясно, че там чипът е Realtek и самият VID/PID на устройството на USB шина.
Виждаме по-нататък, lsusb, и тук ни подрежда поредна неуспех
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
Системата не знае какво е това устройство и скромно показва празно място вместо име (макар че vendor=2357 е определено TP-Link).
На този етап любопитният читател вероятно вече е забелязал нещо интересно, но ще отложим това за по-късно.
Проучването на проблема с празните имена ме отведе на сайт с идентификатори, където се събира информация за известни VID/PID. Нашият 2357:0111 не беше там. Както стана ясно по-късно, утилитата lsusb използва файл /usr/share/misc/usb.ids, който е същия списък с идентификатори от този сайт. За по-добър вид просто добавих към моята система редове за вендора TP-Link.
2357 TP-Link
0111 TL-WN727N v5.21
Е, поправихме визуализацията в списъка с устройства, но нищо не напреднахме по избора на драйвер. За да изберем драйвер, трябва да знаем на какъв чип е направен вашият адаптер. Поредните неуспешни опити да разбера това в интернет не доведоха до нищо добро. Въоръжен с тънка шлицева отвертка, внимателно подкачвам капачката на адаптера и пред мен се разкрива в цялата си прелест порочното творение на чичо Ляо. Под лупата може да се види наименованието на чипа — RTL8188EUS. Това вече е добре. На някои форуми съм виждал постове, че за този чип точно подходящ е драйверът на господин lwfinger (въпреки че там е написано само за RTL8188EU).
Част 2. Превъзходството на Борн
Свалям исходниците на драйвера от гита.
Настъпи време за преинсталация на Windows, за да се занимавам с нещо, което обикновено свързват с линуксоидите — компилиране на нещо от сорс код. Компилирането на драйвери, както се оказа, е малко по-различно от компилирането на програми:
make
sudo make install
но за компилирането на модули в ядрото ни трябват заглавни файлове за нашата конкретна версия.
В стоковия репозиторий има пакет raspberrypi-kernel-headers, но той съдържа версия на файловете за ядрото 4.19.66-v7l+, и това не ни устройва. Но за получаване на заглавията на нужната версия, както се оказа, има удобно средство rpi-source (линк в края на гитхаб), с което можем да свалим нужните заглавия. Клонираме репозитория, правим скрипта изпълним, стартираме. Първият старт падна с грешка — няма утилита bc. За щастие, тя я има в репозитория и просто я инсталираме.
sudo apt-get install bc
След това последва повторен старт и свалянето на заглавията (и после конфигуриране на нещо, сега вече не помня) отнема известно време и можем да се отпуснем назад, Windows стана по-добра във всички свои проявления.
След като всички заглавия са свалени, проверяваме, че е създаден директория /lib/modules/4.19.73-v7+ и в нея симлинкът сочи към мястото, където са свалените файлове (при мен това е /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
Подготовителният етап е завършен, можем да преминем към сглобяването. Сглобяването на модулите отново отнема определено време, малинката не е бърза (камъка ѝ е 32bit 900Mhz Cortex ARM v7).
И така, всичко е скомпилирано. Инсталираме драйвера с 2-ри етап (make install), като в същото време се копират още файлове на firmware, необходими за работата на драйвера:
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/.
Част 3. Ултиматумът на Борн
Включвам устройството в порта и… нищо не се случва. Дали всичко това беше напразно?
Започвам да изучавам файловете в проекта и в един от тях намирам проблема: в драйвера е посочен пълният списък с идентификатори VID/PID, които може да обслужва. За да работи нашето устройство с този драйвер, просто добавих своя идентификатор в файла rtl8188eu/os_dep/usb_intf.c
static struct usb_device_id rtw_usb_id_tbl[] = {
/*=== Realtek демо дъска ===*/
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
/*=== клиентски идентификатори ===*/
/****** 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 */
{} /* Завършваща записа */
};
Прекомпилирах драйвера и го инсталирах отново в системата.
И този път всичко заработи. Лампичката на адаптера светна и в списъка на мрежовите интерфейси се появи ново устройство.
Прегледът на безжичните интерфейси показва следното:
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
Бонус за тези, които прочетоха до края
Помните ли как казах, че не е важно каква е максималната скорост, заявена на вашия адаптер?
Така че, на Raspberry Pi (преди излизането на модела 4) всичките устройства (включително и Ethernet адаптера) са на една и съща USB шина. Страхотно, нали? Затова пропускната способност на USB шината се дели между всички устройства на нея. При измерване на скоростта и през Ethernet, и през USB Wi-Fi (свързани към един рутер), и по въздуха, и по кабел получавате около 20 Мбит/с.
P.S. Всъщност, този наръчник за компилиране на драйвера за този конкретен адаптер е валиден не само за Raspberry Pi. По-късно го повторих и на настолния си компютър с Linux Mint — там също всичко проработи. Просто ще трябва да изтеглите необходимите заглавни файлове за вашата версия на ядрото.
UPD. Хора, които знаят, подсказаха: за да не зависи от версията на ядрото, трябва да компилирате и инсталирате драйверите с помощта на dkms. В readme файла на драйвера има също така и този вариант.
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. Предложен за device id беше приет в основната клонка на репозитория lwfinger/rtl8188eu.
Връзки
—
—
—
—
Източник: habr.com
