Barátkozzunk meg a RaspberryPi-vel a TP-Link TL-WN727N-nel

Szia Habr!

Egyszer úgy döntöttem, hogy a málnámat összekötöm az internettel az éteren keresztül.

Alighogy megtörtént, erre a célra vásároltam egy usb wi-fi sípot a jól ismert TP-Link cégtől a legközelebbi üzletből. Mindjárt leszögezem, hogy ez nem valamiféle nano usb modul, hanem elég nagy készülék, nagyjából akkora, mint egy rendes pendrive (vagy ha úgy tetszik, akkora, mint egy felnőtt férfi mutatóujja). Vásárlás előtt kicsit utánanéztem a támogatott sípgyártók listájának az RPI-hez és a TP-Link is ott volt a listán (azonban, mint később kiderült, nem vettem figyelembe a finomságokat, mert az ördög, mint tudjuk , a részletekben található). Kezdődik tehát a kalandjaim hideg meséje, egy 3 részből álló detektívtörténetet mutatunk be. Akit érdekel, nézze meg a kat.

cikk A WN727N WiFi adapter csatlakoztatása az Ubuntu/Minthez Nekem részben segített, de először is.

A probléma körülményei

adott:

  1. egylapos számítógép Raspberry Pi 2 B v1.1 – 1 db
  2. usb wi-fi síp WN727N - 1 db
  3. egy pár nem egészen görbe kéz - 2 db
  4. A legújabb Raspbian operációs rendszerként van telepítve (Debian 10 Buster alapján)
  5. kernel 4.19.73-v7+ verzió

Keresés: csatlakozzon az internethez (a Wi-Fi az otthoni útválasztóról érkezik)

Az adapter kicsomagolása után elolvastam a benne lévő utasításokat:

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

Hmm, mint általában, a Linuxról egy szót sem. 2k19 volt, és a meghajtókat még kézzel kellett összeszerelni...

Velünk volt 2 fordítóprogram, 75 ezer könyvtár, öt bináris blob, fél tömb meztelen nő logóval és egy egész tengernyi fejléc minden nyelven és jelöléssel. Nem mintha ez szükséges készlet a munkához. De ha egyszer elkezdi összeszerelni magának a rendszert, nehéz lesz megállítani. Az egyetlen dolog, ami aggodalomra ad okot, a wi-fi illesztőprogramjai voltak. Nincs tehetetlenebb, felelőtlenebb és korruptabb, mint az illesztőprogramok forrásból történő készítése. De tudtam, hogy előbb-utóbb át fogunk térni erre a szemétre.

Általában, mint tudod, az usb wi-fivel való babrálás Linuxon az fájdalmas és kissé íztelen (mint az orosz sushi).

A dobozban egy CD is található meghajtókkal. Sok remény nélkül megnézem, mi van rajta – biztosan nem foglalkoztak vele. Egy internetes kereséssel eljutottam a gyártó webhelyére, de ott van egy Linux-illesztőprogram csak az eszköz átdolgozásához v4, és a karomban volt v5.21. És emellett a nagyon régi kernelverziókhoz, 2.6-3.16. A kudarctól elbátortalanodva már az elején arra gondoltam, hogy a TL-WN727N-t kellett volna vennem (kicsit drágább és bírja a 300Mbps-t az enyémhez képest 150, de mint kiderült, ez egyáltalán nem számít a málnánál erről később írunk). De a legfontosabb dolog az, hogy az illesztőprogramok már léteznek, és egyszerűen csomagként vannak telepítve firmware-ralink. Az eszköz verzióját általában a készülék törzsén, a sorozatszám melletti matricán tekintheti meg.

A további guglizás és különféle fórumok látogatása nem hozott sok jót. Nyilván előttem senki nem próbált ilyen adaptert Linuxhoz csatlakoztatni. Hmm, olyan szerencsés vagyok, mint egy vízbe fulladt ember.

Bár nem, hazudok, a fórumok látogatása (többnyire angol nyelvű) is meghozta gyümölcsét, néhány topikban szó esett egy bizonyos Mr. lwfingerről, aki arról híres, hogy számos meghajtót ír a Wi-Fi adapterekhez. . Git tárháza a cikk végén található a linkekben. A második tanulság pedig az, hogy azonosítania kell az eszközt, hogy megértse, melyik illesztőprogram alkalmas rá.

1. rész: A Bourne-identitás

Amikor az eszközt bedugták a portba, természetesen nem világított egyetlen LED sem. És általában egyáltalán nem világos, hogy valami működik-e vagy sem.

Először is, hogy megtudjam, hogy a kernel látja-e az eszközünket, megnézem a dmesg-ben:

[  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

Kiderült, hogy lát, sőt az is látszik, hogy az usb buszon van Realtek chip és magának a készüléknek a VID/PID-je.

Menjünk tovább és nézzük 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, hogy milyen eszközről van szó, és szemérmesen üres helyet mutat a név helyett (bár a vendor=2357 egyértelműen TP-Link).

Ebben a szakaszban az érdeklődő olvasó valószínűleg már észrevett valami érdekeset, de ezt hagyjuk korunkra.

Az üres nevek problémájának kutatása elvezetett egy azonosítókkal ellátott oldalra, ahol az ismert VID/PID-ről van információ. A 2357:0111-es számunk nem volt ott. Mint később kiderült, a segédprogram lsusb fájlt használ /usr/share/misc/usb.ids, amely ugyanaz az azonosítók listája erről a webhelyről. A kijelző szépsége érdekében egyszerűen hozzáadtam a rendszeremben sorokat a gyártó TP-Link számára.

2357  TP-Link
        0111  TL-WN727N v5.21

Nos, javítottuk a kijelzőt az eszközök listáján, de ezzel egy lépéssel sem kerültünk közelebb a driver kiválasztásához. A meghajtó kiválasztásához tudnia kell, hogy a síp melyik chipre készült. A következő sikertelen kísérletek ennek kiderítésére az interneten nem vezettek semmi jóra. Egy vékony réscsavarhúzóval felfegyverkezve óvatosan lefeszítem az adapter kupakját, és Liao bácsi gonosz agyszüleménye jelenik meg teljes érintetlen meztelenségében. A nagyító alatt láthatja a chip nevét - RTL8188EUS. Ez már jó. Néhány fórumon láttam olyan hozzászólásokat, hogy ugyanannak az úriembernek, lwfingernek a drivere jól használható ehhez a chiphez (bár csak az RTL8188EU-ról ír).

2. rész: A Bourne-fölény

Az illesztőprogramok forrásait a Gitről töltöm le.

Ideje újratelepíteni a Windows-t, és megtenni azt, amihez a Linux-felhasználók általában társulnak – összeszerelni valamit valamilyen okból. Az illesztőprogramok összeállítása, mint kiderült, alig különbözik a programok fordításától:

make
sudo make install

de a kernelmodulok fordításához szükségünk van a saját verziónkhoz tartozó kernelfejlécekre.

Van egy csomag a készlettárban raspberrypi-kernel-headers, de tartalmazza a fájlok kernel verzióját 4.19.66-v7l+, és ez nem felel meg nekünk. De a szükséges verzió fejléceinek beszerzéséhez, mint kiderült, van egy kényelmes eszköz rpi-forrás (link a végén a Githubon), amivel letöltheti a szükséges fejléceket. Klónozzuk a tárolót, végrehajthatóvá tesszük a szkriptet, és lefuttatjuk. Az első indítás hibával meghiúsul - nincs segédprogram bc. Szerencsére a tárolóban van, és egyszerűen telepítjük.

sudo apt-get install bc

Ezek után az újraindítás és a fejlécek letöltése (majd valami beállítás, most nem emlékszem) eltart egy ideig, és vissza lehet dőlni a székbe, a Windows minden megnyilvánulásában jobb lett.

Az összes fejléc letöltése után ellenőrizze, hogy megjelenik-e a könyvtár /lib/modules/4.19.73-v7+ és benne a symlink arra a helyre mutat, ahol a letöltött fájlok találhatók (nekem ez a /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

Az előkészítő szakasz befejeződött, megkezdheti az összeszerelést. A modulok ismételt összerakása eltart egy ideig, a Raspberry nem egy gyors vadállat (32 bites 900Mhz-es Cortex ARM v7 van benne).
Szóval minden össze van állítva. A 2. lépésben telepítjük az illesztőprogramot (make install), miközben további firmware fájlokat másolunk, amelyek az illesztőprogram működéséhez szükségesek:

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: A Bourne-ultimátum

Bedugom a sípot a portba, és... nem történik semmi. Hiába volt az egész?

Elkezdem tanulmányozni a projekten belüli fájlokat, és az egyikben megtalálom, hogy mi volt a probléma: az illesztőprogram megadja a VID/PID azonosítók teljes listáját, amelyeket kiszolgálhat. És annak érdekében, hogy a készülékünk működjön ezzel az illesztőprogrammal, egyszerűen hozzáadtam az 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 */
        /*=== 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 */
};

Újrafordítottam az illesztőprogramot és újratelepítettem a rendszerre.

És ezúttal minden elkezdődött. Az adapteren kigyulladt a lámpa, és egy új eszköz jelent meg a hálózati interfészek listájában.

A vezeték nélküli interfészek megtekintése a következőket mutatja:

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

Bónusz azoknak, akik a végéig elolvassák

Emlékszel, hogyan mondtam, hogy nem számít, milyen maximális sebesség van feltüntetve az adapteren?
Tehát a Malinkán (a 4-es modell megjelenése előtt) minden eszköz (beleértve az Ethernet-adaptert is) ugyanazon az USB-buszon ül. Remek, igaz? Ezért az usb busz sávszélessége meg van osztva az összes rajta lévő eszköz között. A sebességet etherneten és usb wi-fi-n (1 routerre csatlakozva) egyaránt mérve levegőn és vezetéken is 20Mbit/s körül volt.

PS Általánosságban elmondható, hogy ez az útmutató az adott adapterhez illesztőprogram fordításához nem csak az RPI-re vonatkozik. Aztán megismételtem az asztalomon a Linux Mint segítségével – ott is minden működött. Csak le kell töltenie a szükséges fejléc fájlokat a kernel verziójához ugyanúgy.

UPD. A hozzáértő emberek azt javasolták: annak érdekében, hogy ne függjön a kernel verziójától, dkms segítségével kell összegyűjtenie és telepítenie kell az illesztőprogramokat. Az illesztőprogram readme-je is tartalmazza ezt a lehetőséget.

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 tapasz Az eszközazonosítót elfogadták az lwfinger/rtl8188eu adattár mainstream ágába.

referenciák
- RPi USB Wi-Fi adapterek
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-forrás

Forrás: will.com