Свързване на RaspberryPi с TP-Link TL-WN727N

Здравейте, Хабр!

Замислих се как да свържа моя Raspberry Pi с интернет безжично.

Казано-сторено, за целта закупих в nearest store USB Wi-Fi адаптер на известната марка TP-Link. Трябва да кажа, че това не е просто нано USB модул, а доста габаритно устройство с размери приблизително като обикновен флаш памет (или за по-подходящо, с указателния пръст на възрастен мъж). Преди покупката проучих малко списъка с поддържани производители на адаптери за RPI и TP-Link бе в списъка (въпреки че по-късно разбрах, че не взех предвид някои детайли, защото дяволът, както се казва, е в детайлите). И така, хладния разказ за моите злоключения започва, Вашето внимание е предложено на детективна история в 3 части. Заинтересованите, моля, под кат.

Статия Свързваме WiFi адаптер WN727N към Ubuntu/Mint ми помогна частично, но всичко по реда си.

Условия на задачата

Дадено:

  1. едноплатен компютър Raspberry Pi 2 B v1.1 — 1 бройка
  2. USB Wi-Fi адаптер WN727N — 1 бройка
  3. пара не съвсем криви ръце — 2 броя
  4. като ОС е инсталиран последния Raspbian (на базата на Debian 10 Buster)
  5. ядро версия 4.19.73-v7+

Намери: осъществи връзка с интернет (Wi-Fi идва от домашния рутер)

След разопаковането на адаптера прочетох инструкциите вътре:

Системна съвместимост: Windows 10/8/7/XP (даже XP) и MacOS 10.9-10.13

Ех, за Linux както обикновено нищо не е казано. Беше 2019 година, а драйверът все още трябваше да се компилира ръчно...

С нас бяха 2 компилатора, 75 хиляди библиотеки, пет бинарни блоба, половингас от голи жени с лого и цяло море от хедери на всички езици и формати. Не, че това беше необходим комплект за работа. Но ако започнеш да компилираш система за себе си, е трудно да спреш. Единственото, което ме притесняваше - бяха драйверите за Wi-Fi. Няма нищо по-непомощно, безотговорно и повредено от компилирането на драйвери от изходен код. Но знаех, че рано или късно ще преминем и към това зло.

Както е известно, борбата с USB Wi-Fi на Linux е болезнена и малко неприятна (като руски суши).

В кутията се намира и CD-диск с драйвери. Без много надежда погледнах какво има на него — разбира се, не бяха се погрижили. Търсене в интернет ме отведе до сайта на производителя, но там имаше Linux драйвер само за ревизията на устройството v4, а аз имах на ръка v5.21. И освен това за много стари версии на ядрото 2.6-3.16. Обезкуражен от провала още в самото начало, помислих, че трябваше да взема TL-WN727N (той е малко по-скъп и успява да достигне 300Mbps в сравнение с 150Mbps на моя, но за малинката това не е било важно, за което ще пиша по-късно). Но най-важното е, че драйверите вече съществуват и се инсталират просто с пакет. firmware-ralink. Обикновено ревизията на устройството може да се намери на корпуса на устройството на етикета до серийния номер.

По-нататъшното гуглене и посещение на различни форуми особено нищо добро не донесе. Явно никой преди мен не е опитвал да свърже точно този адаптер с линукс. Да, да, късметлия съм като удавник.

Въпреки това, лъжа, посещението на форумите (в основния английски) също даде резултати, в някои теми имаше споменаване на господина 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. Превъзходството на Борна

Изтеглям изходния код на драйвера от Git.

Дойде времето да преинсталирам Windows и да се занимавам с това, с което обикновено свързват линукс потребителите — компилиране на нещо от източници. Компилирането на драйвери, както се оказа, малко се различава от компилацията на програми:

make
sudo make install

но за компилацията на модулите на ядрото ни трябват заглавни файлове на ядрото за нашата конкретна версия.

В стандартното хранилище има пакет raspberrypi-kernel-headers, но той съдържа версия на файловете за ядрото 4.19.66-v7l+, и това не ни подхожда. Но за получаване на заглавките на нужната версия, както се оказа, има удобен инструмент rpi-source (линк в края към GitHub), с който може да се свалят нужните заглавки. Клонираме хранилището, правим скрипта изпълняем, стартираме. Първият старт завършва с грешка — липсва утилита 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).
И така, всичко е скомпилирано. Инсталираме драйвера с втора стъпка (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 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 */
};

Пре-компилирах драйвера и го инсталирах отново в системата.

И за този път всичко заработи. Лампичката на адаптера светна и в списъка с мрежови интерфейси се появи новото устройство.

Прегледът на безжичните интерфейси показва следното:

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

Бонус за тези, които прочетоха до края

Помните ли как казах, че не е важно каква е максималната скорост, заявена на вашия адаптер?
И така, на малинката (преди излизането на модел 4) всички устройства (включително и ethernet адаптера) са свързани на една USB шина. Страхотно, нали? Затова пропускната способност на USB шината се разделя между всички устройства на нея. При измерването на скоростта, както през ethernet, така и през USB Wi-Fi (свързани към един рутер), и по въздуха, и по кабел, показваше около 20 Мбит/с.

P.S. Всъщност, този гид по компилацията на драйвера за този конкретен адаптер е валиден не само за RPI. Аз след това го повторих и на моя десктоп с 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.

Връзки
RPi USB Wi-Fi адаптери
Gitbub lwfinger/rtl8188eu
usb.ids
rpi-source

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster