Сябруем 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+

Знайсці: ажыццявіць падлучэнне да інтэрнэту (вайфай раздаецца ад хатняга роўтара)

Пасля распакавання адаптара чытаю інструкцыю ўсярэдзіне:

System Compatibility: Windows 10/8/7/XP (нават неба, нават ХР) and MacOS 10.9-10.13

Мда, аб лінуксах як звычайна ні слова. Ішоў 2к19, а драйвера трэба было ўсё яшчэ збіраць уручную…

У нас было з сабой 2 кампілятары, 75 тысяч бібліятэк, пяць бінарных блобаў, паўмасіва голых баб з лагатыпам і цэлае мора хедэраў усіх моў і разметак. Ня тое, каб гэта быў неабходны набор для працы. Але калі пачаў збіраць сістэму пад сябе, становіцца цяжка спыніцца. Адзінае, што выклікала ў мяне асцярогі - гэта драйвера пад wi-fi. Няма нічога больш бездапаможнага, безадказнага і сапсаванага, чым зборка драйвераў з зыходнікаў. Але я ведаў, што рана ці позна мы пяройдзем і на гэтую дрэнь.

Наогул як вядома валтузня з usb wi-fi на лінуксе гэта балюча і некалькі нясмачна (як рускія сушы).

У скрынцы ляжыць яшчэ CD-дыск з драйверамі. Без асаблівай надзеі гляджу што на ім ёсць - сапраўды, не паклапаціліся. Пошук у інтэрнэце вывеў мяне на сайт вытворцы, але там ёсць лінукс драйвер толькі для рэвізіі прылады v4, а ў мяне на руках была v5.21. І да таго ж пад вельмі старыя версіі ядра 2.6-3.16. Збянтэжаны няўдачай ужо ў самым пачатку я ўжо падумаў, што трэба было браць TL-WN727N (ён крыху даражэй і ўмее ў 300Mbps супраць 150 у майго, але гэта як аказалася для малінкі наогул значэння не мае, пра гэта будзе напісана далей). Але і самае галоўнае драйвера пад яго ўжо ёсць і ставяцца проста пакетам прашыўка-ralink. Паглядзець рэвізію прылады звычайна можна на корпусе прылады на налепцы побач з серыйным нумарам.

Далейшае гугленне і наведванне розных форумаў асабліва нічога добрага не прынесла. Мабыць ніхто да мяне такі адаптар падлучаць на лінукс не спрабаваў. Мда, вязе мне як тапельцу.

Хоць не, хлушу, наведванне форумаў(у асноўным англамоўных) таксама дало свой плён, у некаторых топіках мільгала згадванне нейкага спадара lwfinger, які славіцца тым, што напісаў некаторую колькасць драйвераў для вайфай адаптараў. Яго гіт рэпазітар у канцы артыкула ў спасылках. І другі ўрок які я засвоіў - трэба ідэнтыфікаваць сваю прыладу, каб зразумець які драйвер для яго можа падысці.

Частка 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. Перавага Борна

Пампую зыходнікі драйвера з гіта.

Надышоў час пераўсталяваць шындус заняцца тым, з чым звычайна звязваюць лінуксоідаў - зборкай чагосьці з сарцоў. Зборка драйвераў аказалася мала адрозніваецца ад кампіляцыі праграм:

make
sudo make install

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

У рэлізторыі ёсць пакет raspberrypi-kernel-headers, але ён змяшчае версію файлаў для ядра 4.19.66-v7l+, і гэта нам не падыходзіць. Але для атрымання загалоўкаў патрэбнай версіі як высветлілася ёсць зручная тулза rpi-source (спасылка ў канцы на гітхабе), з дапамогай якой можна спампаваць патрэбныя загалоўкі. Клануем рэпазітар, які робіцца скрыпт выкананым, запускаем. Першы запуск валіцца з памылкай - няма ўтыліты bc. Да шчасця яна ёсць у рэпазітары і мы яе проста ўсталёўваны.

sudo apt-get install bc

Пасля гэтага паўторны запуск і запампоўка загалоўкаў (і потым настройка чагосьці, цяпер ужо не памятаю) займае некаторы час і можна адкінуцца на спінку крэсла віндоус стала лепш ва ўсіх яе праявах.

Пасля таго як усе загалоўкі спампоўваліся, правяраем што з'явіўся каталог /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, якія ён можа абслужыць. І для таго каб наша прылада з гэтым драйверам працавала я проста дадаў свой 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) усе прылады (у тым ліку і ethernet адаптар) сядзяць на адной шыне usb. Выдатна, праўда? І таму прапускная здольнасць шыны usb дзеліцца паміж усімі прыладамі на ёй. Пры замеры хуткасці і праз ethernet, і праз usb wi-fi (падлучаныя да 1 роўтара) і па паветры, і па провадзе выдавала ў раёне 20Мбіт/з.

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. Прапанаваны патч для device id быў прыняты ў мэйнстрым галінку рэпазітара lwfinger/rtl8188eu.

Спасылкі
- RPi USB Wi-Fi Adapters
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-source

Крыніца: habr.com