Нека се сприятелим с RaspberryPi с TP-Link TL-WN727N

Хей Хабр!

Веднъж реших да свържа моята малина към интернет по въздуха.

Речено – направено, за тази цел закупих от най-близкия магазин usb wi-fi свирка от известната компания TP-Link. Веднага ще кажа, че това не е някакъв нано usb модул, а доста голямо устройство, с размерите на обикновено флаш устройство (или, ако желаете, с размера на показалеца на възрастен мъж). Преди да закупя, направих малко проучване на списъка с поддържани производители на свирки за RPI и TP-Link беше в списъка (обаче, както се оказа по-късно, не взех предвид тънкостите, защото дяволът, както знаем , е в подробностите). И така, студената приказка за моите премеждия започва, представяме на вашето внимание детективска история в 3 части. За тези, които се интересуват, моля, обърнете се към кат.

статия Свързване на WN727N WiFi адаптер към 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. Беше 2k19, а драйверите все още трябваше да се сглобят ръчно...

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

Като цяло, както знаете, бъркането с usb wi-fi на Linux е болезнено и някак безвкусно (като руско суши).

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

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

Въпреки че, не, лъжа, посещението на форуми (предимно англоезични) също даде плод; в някои теми се споменава някакъв г-н lwfinger, който е известен с това, че е написал редица драйвери за Wi-Fi адаптери . Неговото git хранилище е в края на статията във връзките. И вторият урок, който научих е, че трябва да идентифицирате вашето устройство, за да разберете кой драйвер може да е подходящ за него.

Част 1: Самоличността на Борн

Когато устройството беше включено в порта, разбира се, нито един светодиод не свети. И като цяло по никакъв начин не е ясно дали нещо работи или не.

Първо, за да разбера дали ядрото вижда нашето устройство, гледам в 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

Оказа се, че вижда и дори се вижда, че има 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 и да направите това, с което потребителите на Linux обикновено се свързват - да сглобите нещо от различни видове. Сглобяването на драйвери, както се оказва, се различава малко от компилирането на програми:

make
sudo make install

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

Има пакет в складовото хранилище raspberrypi-kernel-headers, но съдържа версията на ядрото на файловете 4.19.66-v7l+, а това не ни устройва. Но за да получите заглавките на необходимата версия, както се оказа, има удобен инструмент rpi-източник (линк в края на 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

Подготвителният етап е завършен, можете да започнете сглобяването. Сглобяването на модулите отново отнема известно време, Raspberry не е бърз звяр (има 32bit 900Mhz Cortex ARM v7).
Така че всичко е компилирано. Инсталираме драйвера във втората стъпка (make install), като същевременно копираме още файлове на фърмуера, необходими за работата на драйвера:

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 идентификатори, които може да обслужва. И за да може нашето устройство да работи с този драйвер, аз просто добавих моя id към файла 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:"<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

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

Помните ли как казах, че няма значение каква максимална скорост е посочена на вашия адаптер?
И така, на Malinka (преди пускането на модел 4) всички устройства (включително ethernet адаптера) се намират на една и съща usb шина. Страхотно, нали? И следователно честотната лента на usb шината се разделя между всички устройства в нея. При измерване на скоростта и през ethernet и през usb wi-fi (свързан към 1 рутер) и по въздух и по кабел беше около 20Mbit/s.

PS По принцип това ръководство за компилиране на драйвер за този конкретен адаптер е валидно не само за 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. Предложено кръпка за идентификатор на устройство беше приет в основния клон на хранилището lwfinger/rtl8188eu.

Позоваването
- RPi USB Wi-Fi адаптери
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-източник

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