Ајде да се дружиме RaspberryPi со TP-Link TL-WN727N

Еј Хабр!

Еднаш решив да ја поврзам мојата малина на Интернет преку воздух.

Не порано, за оваа цел купив 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. Беше 2k19, а драјверите требаше уште рачно да се склопат...

Имавме со нас 2 компајлери, 75 илјади библиотеки, пет бинарни блузони, половина низа голи жени со лого и цело море од заглавија на сите јазици и ознаки. Не дека ова е неопходен сет за работата. Но, штом ќе почнете да составувате систем за себе, станува тешко да се запре. Единственото нешто што ме загрижи беа драјверите за wi-fi. Нема ништо побеспомошно, неодговорно и покорумпирано од градењето на возачи од изворот. Но, знаев дека порано или подоцна ќе се префрлиме на ова ѓубре.

Во принцип, како што знаете, мачењето со USB wi-fi на Linux е болно и донекаде невкусно (како руско суши).

Кутијата содржи и ЦД со драјвери. Без многу надеж гледам што има на него - тие дефинитивно не се погрижија за тоа. Пребарувањето на Интернет ме донесе на веб-страницата на производителот, но таму има двигател за Linux само за ревизија на уредот v4, а во моите раце беше v5.21. И покрај тоа, за многу стари верзии на кернелот 2.6-3.16. Обесхрабрен од неуспехот на самиот почеток, веќе мислев дека требаше да го земам TL-WN727N (малку е поскап и може да издржи 300Mbps наспроти 150 за мојот, но како што се испостави, ова воопшто не е важно за малината за ова ќе се пишува подоцна). Но, најважно е што драјверите за него веќе постојат и едноставно се инсталирани како пакет фирмвер-ралинк. Обично можете да ја видите ревизијата на уредот на телото на уредот на налепница до серискиот број.

Понатамошното гуглање и посета на разни форуми не донесе многу добро. Очигледно никој пред мене не се обидел да поврзе таков адаптер со Linux. Хм, имам среќа како давеник.

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

Дел 1: Борновиот идентитет

Кога уредот беше приклучен во приклучокот, се разбира, не светеше ниту една LED диода. И воопшто, на кој било начин не е јасно дали нешто функционира или не.

Како прво, за да дознаам дали кернелот го гледа нашиот уред, гледам во 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 на самиот уред на усб магистралата.

Ајде да одиме понатаму и да погледнеме 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

Системот не знае за каков уред се работи и срамно покажува празен простор наместо името (иако продавачот=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

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

Во складиштето има пакет малини-кернел-заглавија, но ја содржи верзијата на јадрото на датотеките 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 не е брз ѕвер (има 32-битен 900Mhz Cortex ARM v7).
Значи сè е составено. Ние го инсталираме драјверот во вториот чекор (направете инсталирање), а исто така копираме повеќе датотеки на фирмверот потребни за да работи драјверот:

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

Бонус за оние кои читаат до крај

Се сеќавате како реков дека не е важно која максимална брзина е наведена на вашиот адаптер?
Значи, на Малинка (пред објавувањето на моделот 4), сите уреди (вклучувајќи го и адаптерот за етернет) седат на истиот USB автобус. Одлично, нели? И затоа, пропусниот опсег на USB автобусот е поделен помеѓу сите уреди на него. При мерење на брзината и преку етернет и преку 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