A RaspberryPi barátkozik a TP-Link TL-WN727N-nel

Helló, Habr!

Egyszer csak arra gondoltam, hogy a Raspberry Pi-t úgy csatlakoztatom az internethez, hogy levegőben van.

Meg is tettem, ezért a közeli boltban vásároltam egy TP-Link USB wi-fi adaptert. Azonnal mondom, hogy ez nem valami nano USB modul, hanem egy kifejezetten nagyméretű eszköz, körülbelül akkora, mint egy szokásos pendrive (vagy ha úgy tetszik, egy felnőtt férfi mutatóujja). A vásárlás előtt kicsit átnéztem a RPI-hez támogatott adapterek listáját, és a TP-Link benne volt (bár ahogy később kiderült, nem vettem figyelembe a részleteket, mert a részletekben rejtőzik a ördög). Na, tehát a hűvös mese a kalandjaimról kezdődik, figyelmetekbe ajánlom a három részből álló detektív történetet. Az érdeklődőket várom a folytatásra.

Cikk Csatlakoztassuk a WN727N WiFi adaptert Ubuntu/Mint rendszerhez részben segített, de minden a maga rendje szerint.

A feladat feltételei

Adott:

  1. 1 db Raspberry Pi 2 B v1.1 egylapos számítógép
  2. 1 db WN727N USB wi-fi adapter
  3. 2 db nem teljesen ügyes kéz
  4. az OS a legfrissebb Raspbian (Debian 10 Buster alapú)
  5. a kernel verzió: 4.19.73-v7+

Cél: csatlakozás az internethez (a Wifi a házi routerből érkezik)

Az adapter kibontása után olvasom a belső használati útmutatót:

Rendszerkompatibilitás: Windows 10/8/7/XP (még XP is, és MacOS 10.9-10.13

Hát, a Linuxokról szokás szerint egy szó sem. 2019-et írtunk, és a drivereket még mindig kézzel kellett összeszerelni...

Magunkkal hoztunk 2 fordítót, 75 ezer könyvtárat, öt bináris blobot, egy fél mázsa logóval ellátott meztelen női képet és egy óceánnyi header-t minden nyelven és leírásban. Nem mintha ez lett volna a szükséges munkaeszköz. De ha egyszer belevágtál a rendszer összeszerelésébe, nehéz megállni. Az egyetlen dolog, ami aggasztott, az a wi-fi driverek voltak. Nincs szörnyűbb, felelőtlenebb és megromlottabb dolog, mint az alaprendszerekből drivereket összeállítani. De tudtam, hogy előbb vagy utóbb rátérünk erre a dologra.

Magában véve, mint tudjuk, a USB wi-fi kezelés Linuxon fájdalmas és kissé ízléstelen (mint az orosz sushi).

A dobozban van egy CD-lemez a driverekkel. Különösebb remény nélkül nézem, mi van rajta - persze, nem törődtek vele. Az internetes keresés a gyártó weboldalára vezetett, de ott csak a 4-es verzióhoz volt Linux driver. v4, de nekem a kezemben volt v5.21. És ráadásul nagyon régi 2.6-3.16 kernel verziókra. Az elején a kudarc miatt elkeseredve úgy gondoltam, hogy talán a TL-WN727N-t kellett volna választanom (ez egy kicsit drágább, és 300Mbps sebességre képes, míg az enyém 150Mbps, de mint kiderült, ez a Raspberry Pi számára egyáltalán nem jelentett sokat, erről később írok). Ami a legfontosabb, már vannak driverek hozzá, és az egyszerűen telepíthető csomagként. firmware-ralink. A készülék revízióját általában a készülék burkolatán található címkén lehet megnézni, közvetlenül a sorozatszám mellett.

A további keresés és különböző fórumok látogatása különösebben nem hozott semmi jót. Nyilvánvalóan senki nem próbálta még meg csatlakoztatni ezt a konkrét adaptert Linux alatt. Hát, nem vagyok szerencsés.

De nem, hazudok, a fórumok (többnyire angol nyelvűek) látogatása is hozott bizonyos eredményeket, néhány topicban felbukkant egy bizonyos lwfinger nevű úr, aki arról híres, hogy írt néhány drivert wifi adapterekhez. Az ő git repoja a cikk végén található linkek között. A második tanulság, amit megtanultam - az eszköz azonosítása szükséges ahhoz, hogy megtudjuk, melyik driver lehet megfelelő hozzá.

1. rész. Azonosítás

Amikor csatlakoztatom az eszközt a porthoz, egyetlen LED sem világított meg. És egyáltalán nem világos, hogy működik-e vagy sem.

Első lépésként meg akarom nézni, látja-e a kernel az eszközünket, ezért belenézek a dmesg-be:

[  965.606998] usb 1-1.3: új high-speed USB berendezés, a szám 9, a dwc_otg használatával
[  965.738195] usb 1-1.3: Új USB eszközt találtunk, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Új USB eszköz adatok: Mfr=1, Product=2, SerialNumber=3
[  965.738231] usb 1-1.3: Termék: 802.11n NIC
[  965.738243] usb 1-1.3: Gyártó: Realtek
[  965.738255] usb 1-1.3: Sorozatszám: 00E04C0001

Kiderült, hogy látja, és világos, hogy a chip Realtek, és az USB busz VID/PID is ott van.

Haladjunk tovább, nézzük meg lsusb, és itt újabb kudarc vár ránk

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

A rendszer nem tudja, mi ez az eszköz, és szégyenlősen üres helyet mutat az elnevezés helyett (bár a vendor=2357 biztosan TP-Link).

Ez a pont valószínűleg már felkeltette a kíváncsi olvasó figyelmét, de ezt későbbre halasztjuk.

A üres nevek problémájának vizsgálata egy olyan weboldalra vezetett, amely az azonosítókat gyűjti, ahol a híres VID/PID információkat tárolják. A mi 2357:0111-esünk nem szerepelt ott. Mint később kiderült, az eszköz lsusb fájl használata /usr/share/misc/usb.ids, amely ugyanaz a lista azonosítókról erről a weboldalról. A szebb megjelenés érdekében egyszerűen hozzáadtam a rendszeremben a TP-Link szorongókat.

2357 TP-Link
        0111 TL-WN727N v5.21

Nos, a készülékek listájának megjelenítését javítottuk, de a megfelelő illesztőprogram kiválasztásához nem közelítettük meg a dolgot. Az illesztőprogram kiválasztásához tudni kell, hogy melyik chip készült a dongled. A legújabb, sikertelen kísérletek az interneten való információszerzésre nem vezettek jóra. Felszerelkezve egy vékony lapos csavarhúzóval óvatosan megemelem az adapter burkolatát, és a teljes dicsőségében megjelenik az Alia bácsi áldatlan gyermeke. Nagyítónál kivehető a chip neve — RTL8188EUS. Ez már jó. Néhány fórumon láttam üzeneteket, hogy ehhez a chiphez kifejezetten jól illeszkedik a lwfinger úr illesztőprogramja (még akkor is, ha csak az RTL8188EU-ról ír).

2. rész. Borna fölénye

Letöltöm az illesztőprogram forrásait a gitből.

Ideje újratelepíteni a Windows-t és foglalkozni azzal, amivel általában a Linux felhasználókat társítják — valami forrásból való összeállítással. Az illesztőprogramok összeállítása kiderült, hogy alig különbözik a programok fordításától:

make
sudo make install

de a kernel modulok fordításához szükségünk van a kernel címsor fájlokra, a mi konkrét verziónkhoz.

A gyári tárolóban van egy csomag raspberrypi-kernel-headers, de ez a fájlok verzióját tartalmazza a kernelhez 4.19.66-v7l+, ami nekünk nem megfelelő. De kiderült, hogy van egy kényelmes eszköz a szükséges verziójú fejlécek megszerzésére rpi-source (a GitHub linkje a végén), amellyel letölthetjük a szükséges címkéket. Klónozzuk a tárolót, a szkriptet végrehajthatóvá tesszük, majd elindítjuk. Az első indítás során hiba merül fel — hiányzik a segédeszköz bc. Szerencsére ez megtalálható a tárolóban, így egyszerűen telepítjük.

sudo apt-get install bc

Ezután a második indítás és a címkék letöltése (meg valami beállítása, most már nem emlékszem) eltart egy ideig, és lehet hátradőlni a székre, mert a Windows jobb lett minden vonatkozásában.

Miután az összes fejléces fájl letöltődött, ellenőrizzük, hogy megjelent egy könyvtár /lib/modules/4.19.73-v7+ és abban a szimbolikus hivatkozás arra a helyre mutat, ahol a letöltött fájlok találhatók (nálam ez /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

A felkészülési fázis véget ért, indulhat a szerelés. A modulok összeszerelése megint csak időt vesz igénybe, a Raspberry Pi teljesítménye nem a leggyorsabb (a processzor 32bit 900Mhz Cortex ARM v7).
Nos, minden lefordult. Telepítjük a drivert 2. lépésként (make install), eközben a szükséges firmware fájlok is másolódnak:

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. rész. Born ultimátuma

Bedugom a donglet a portba és... semmi sem történik. Ez mind hiábavaló volt?

Kezdek beleásni a projekt fájljaiba, és az egyikben megtalálom, mi volt a probléma: a driver egy teljes VID/PID azonosítók listáját tartalmazza, amelyeket képes kezelni. Ahhoz, hogy az eszközöm működjön ezzel a driverrel, egyszerűen hozzáadtam az én azonosítómat a fájlhoz. 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 */
        /*=== Custom 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 */
};

Újraformáztam a drivert és újra telepítettem a rendszerbe.

Ezúttal minden működött. Az adapter lámpája felgyulladt, és az interfészek listájában megjelent egy új eszköz.

A vezeték nélküli interfészek áttekintése a következőt mutatja:

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

Bónusz azoknak, akik végig olvasták.

Emlékeztek, hogy azt mondtam, hogy nem számít, mekkora a maximális sebesség, amit az adapteretek beígér?
Szóval a Raspberry Pi (a 4-es modell megjelenése előtt) minden eszköze (beleértve az ethernet adaptert is) ugyanazon a USB buszon működik. Elképesztő, igaz? Ezért az USB busz sávszélessége megoszlik az összes rajta lévő eszköz között. A sebességmérés során, akár ethernet, akár USB Wi-Fi (1 routerhez csatlakoztatva), légvonalban és kábelen, körülbelül 20 Mbit/s sebességet mutatott.

P.S. Valójában ez a drivereknek az adott adapterhez való fordítására vonatkozó útmutató nemcsak RPI-n érvényes. Később megismételtem a saját Linux Mint asztali gépemen is — ott is minden működött. Csak ugyanúgy le kell töltened a szükséges fejléceket a használt kernel verzióhoz.

UPD. A szakértők azt javasolták: hogy ne függj a kernel verziótól, a drivereket a dkms segítségével kell összegyűjteni és telepíteni. A driver readme fájljában ez a lehetőség is megtalálható.

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. Javasolt kódra fordít. a device ID-t a lwfinger/rtl8188eu tároló fő ága elfogadta.

Hivatkozások
— RPi USB Wi-Fi Adapterek
— GitHub lwfinger/rtl8188eu
— usb.ids
— rpi-source

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster