Makipagkaibigan tayo sa RaspberryPi gamit ang TP-Link TL-WN727N

Hoy Habr!

Minsan ay nagpasya akong ikonekta ang aking raspberry sa Internet sa pamamagitan ng hangin.

Hindi pa nasabi, para sa layuning ito ay bumili ako ng usb wi-fi whistle mula sa kilalang kumpanya na TP-Link mula sa pinakamalapit na tindahan. Sasabihin ko kaagad na ito ay hindi isang uri ng nano usb module, ngunit isang malaking aparato, tungkol sa laki ng isang regular na flash drive (o, kung gusto mo, ang laki ng hintuturo ng isang may sapat na gulang na lalaki). Bago bumili, gumawa ako ng kaunting pananaliksik sa listahan ng mga sinusuportahang tagagawa ng whistle para sa RPI at TP-Link ay nasa listahan (gayunpaman, sa paglaon, hindi ko isinasaalang-alang ang mga subtleties, dahil ang diyablo, tulad ng alam natin , ay nasa mga detalye). Kaya, ang malamig na kuwento ng aking mga misadventures ay nagsisimula; ipinapakita namin sa iyong pansin ang isang kuwento ng tiktik sa 3 bahagi. Para sa mga interesado, mangyaring sumangguni sa pusa.

Artikulo Pagkonekta sa WN727N WiFi adapter sa Ubuntu/Mint Bahagyang nakatulong ito sa akin, ngunit una sa lahat.

Mga kondisyon ng problema

Ibinigay:

  1. single board computer Raspberry Pi 2 B v1.1 – 1 piraso
  2. usb wi-fi whistle WN727N - 1 piraso
  3. isang pares ng hindi masyadong baluktot na mga kamay - 2 piraso
  4. Ang pinakabagong Raspbian ay naka-install bilang OS (batay sa Debian 10 Buster)
  5. bersyon ng kernel 4.19.73-v7+

Hanapin: kumonekta sa Internet (Ang Wi-Fi ay ipinamamahagi mula sa iyong home router)

Pagkatapos i-unpack ang adapter, binasa ko ang mga tagubilin sa loob:

Pagkakatugma ng System: Windows 10/8/7/XP (kahit ang langit, kahit XP) at MacOS 10.9-10.13

Hmm, gaya ng dati, hindi isang salita tungkol sa Linux. Ito ay 2k19, at ang mga driver ay kailangan pa ring i-assemble nang manu-mano...

Kasama namin ang 2 compiler, 75 libong mga aklatan, limang binary blobs, kalahating hanay ng mga hubad na babae na may logo at isang buong dagat ng mga header ng lahat ng mga wika at markup. Hindi na ito ay isang kinakailangang set para sa trabaho. Ngunit sa sandaling simulan mo ang pag-assemble ng isang sistema para sa iyong sarili, ito ay nagiging mahirap na huminto. Ang tanging bagay na nagdulot sa akin ng pag-aalala ay ang mga driver para sa wi-fi. Wala nang higit na walang magawa, iresponsable at corrupt kaysa sa pagbuo ng mga driver mula sa pinagmulan. Ngunit alam ko na maya-maya ay lilipat tayo sa basurang ito.

Sa pangkalahatan, tulad ng alam mo, ang kalikot sa usb wi-fi sa Linux ay masakit at medyo walang lasa (tulad ng Russian sushi).

Ang kahon ay naglalaman din ng isang CD na may mga driver. Nang walang labis na pag-asa ay tinitingnan ko kung ano ang nasa loob nito - tiyak na hindi nila ito inaalagaan. Isang paghahanap sa Internet ang nagdala sa akin sa website ng gumawa, ngunit mayroong isang driver ng Linux doon para lamang sa rebisyon ng device v4, at sa aking mga bisig ay v5.21. At bukod pa, para sa mga lumang bersyon ng kernel 2.6-3.16. Nasiraan ng loob dahil sa kabiguan sa simula pa lang, naisip ko na na dapat ay kinuha ko ang TL-WN727N (ito ay mas mahal ng kaunti at kayang humawak ng 300Mbps kumpara sa 150 para sa akin, ngunit sa nangyari, ito ay hindi mahalaga sa lahat. para sa raspberry, ito ay isusulat tungkol sa ibang pagkakataon). Ngunit ang pinakamahalagang bagay ay ang mga driver para dito ay umiiral na at naka-install lamang bilang isang pakete firmware-ralink. Karaniwan mong matitingnan ang rebisyon ng device sa katawan ng device sa isang sticker sa tabi ng serial number.

Ang karagdagang pag-googling at pagbisita sa iba't ibang mga forum ay hindi nagdala ng maraming kabutihan. Tila walang sinumang nauna sa akin ang sumubok na ikonekta ang gayong adaptor sa Linux. Hmm, kasing swerte ako ng taong nalunod.

Bagaman, hindi, nagsisinungaling ako, nagbunga rin ang pagbisita sa mga forum (karamihan sa mga English-language), sa ilang mga paksa ay may binanggit na isang Mr. lwfinger, na sikat sa pagsulat ng ilang mga driver para sa mga Wi-Fi adapter. . Ang kanyang git repository ay nasa dulo ng artikulo sa mga link. At ang pangalawang aral na natutunan ko ay kailangan mong tukuyin ang iyong device upang maunawaan kung aling driver ang maaaring angkop para dito.

Bahagi 1: Ang Bourne Identity

Kapag ang aparato ay nakasaksak sa port, siyempre, walang LED na naiilawan. At sa pangkalahatan ay hindi malinaw sa anumang paraan kung gumagana ang isang bagay o hindi.

Una sa lahat, upang malaman kung nakikita ng kernel ang aming device, tumingin ako sa 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

Nakikita pala nito, at malinaw pa na mayroong Realtek chip at ang VID/PID ng device mismo sa usb bus.

Pumunta pa tayo at tingnan lsusb, at narito ang isa pang kabiguan ay naghihintay sa atin

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

Hindi alam ng system kung anong uri ng device ito, at nahihiyang nagpapakita ng walang laman na espasyo sa halip na pangalan (bagaman ang vendor=2357 ay tiyak na TP-Link).

Sa yugtong ito, malamang na napansin na ng matanong na mambabasa ang isang bagay na kawili-wili, ngunit iiwan natin ito hanggang sa ating panahon.

Ang pagsasaliksik sa problema ng mga walang laman na pangalan ay nagdala sa akin sa isang site na may mga identifier, kung saan ipinasok ang impormasyon sa kilalang VID/PID. Ang aming 2357:0111 ay wala doon. Bilang ito naka-out mamaya, ang utility lsusb gumagamit ng file /usr/share/misc/usb.ids, na parehong listahan ng mga ID mula sa site na ito. Para sa kagandahan ng display, nagdagdag lang ako ng mga linya para sa vendor na TP-Link sa aking system.

2357  TP-Link
        0111  TL-WN727N v5.21

Buweno, naitama namin ang display sa listahan ng mga device, ngunit hindi ito nagdala sa amin ng isang hakbang na mas malapit sa pagpili ng driver. Para pumili ng driver, kailangan mong malaman kung saang chip ginawa ang iyong whistle. Ang susunod na hindi matagumpay na mga pagtatangka upang malaman ito sa Internet ay hindi humantong sa anumang mabuti. Gamit ang manipis na slotted screwdriver, maingat kong tinanggal ang takip ng adaptor at ang mabisyo na utak ni Uncle Liao ay lilitaw sa lahat ng malinis nitong kahubaran. Sa ilalim ng magnifying glass makikita mo ang pangalan ng chip - RTL8188EUS. Ito ay mabuti na. Sa ilang mga forum nakita ko ang mga post na ang driver mula sa parehong ginoong lwfinger ay angkop para sa chip na ito (kahit na nagsusulat lamang siya tungkol sa RTL8188EU).

Bahagi 2: Ang Bourne Supremacy

Nagda-download ako ng mga mapagkukunan ng driver mula sa Git.

Oras na para muling i-install ang Windows at gawin kung ano ang karaniwang nauugnay sa mga gumagamit ng Linux - pag-assemble ng isang bagay mula sa ilang uri. Ang pag-assemble ng mga driver, tulad ng lumalabas, ay naiiba nang kaunti sa pag-compile ng mga programa:

make
sudo make install

ngunit para mag-compile ng kernel modules kailangan namin ang kernel header files para sa aming partikular na bersyon.

May isang pakete sa stock repository raspberrypi-kernel-header, ngunit naglalaman ito ng kernel na bersyon ng mga file 4.19.66-v7l+, at hindi iyon angkop sa amin. Ngunit upang makuha ang mga header ng kinakailangang bersyon, tulad ng nangyari, mayroong isang maginhawang tool rpi-source (link sa dulo sa Github), kung saan maaari mong i-download ang mga kinakailangang header. Kino-clone namin ang repository, ginagawang executable ang script, at patakbuhin ito. Nabigo ang unang paglulunsad na may isang error - walang utility bc. Sa kabutihang palad, ito ay nasa imbakan at ini-install lang namin ito.

sudo apt-get install bc

Pagkatapos nito, ang pag-restart at pag-download ng mga header (at pagkatapos ay mag-set up ng isang bagay, hindi ko na maalala ngayon) ay tumatagal ng ilang oras at maaari kang umupo sa iyong upuan, ang Windows ay naging mas mahusay sa lahat ng mga manifestations nito.

Pagkatapos ma-download ang lahat ng mga header, tingnan kung lilitaw ang direktoryo /lib/modules/4.19.73-v7+ at sa loob nito ang symlink ay tumuturo sa lugar kung saan matatagpuan ang mga na-download na file (para sa akin ito ay /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

Ang yugto ng paghahanda ay nakumpleto na, maaari mong simulan ang pagpupulong. Ang pag-assemble muli ng mga module ay tumatagal ng ilang oras, ang Raspberry ay hindi isang mabilis na hayop (ito ay may 32bit 900Mhz Cortex ARM v7).
Kaya pinagsama-sama ang lahat. Ini-install namin ang driver sa ika-2 hakbang (gumawa ng pag-install), habang kinokopya din ang higit pang mga file ng firmware na kinakailangan para gumana ang driver:

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/.

Bahagi 3. Ang Bourne Ultimatum

Sinasaksak ko ang whistle sa port at... walang nangyayari. Para bang wala lang ang lahat?

Sinimulan kong pag-aralan ang mga file sa loob ng proyekto at sa isa sa mga ito ay nakita ko kung ano ang problema: ang driver ay tumutukoy ng kumpletong listahan ng mga VID/PID identifier na maaari nitong ihatid. At para gumana ang aming device sa driver na ito, idinagdag ko lang ang aking id sa file 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 */
};

Ni-recompile ko ang driver at ni-reinstall ito sa system.

At sa pagkakataong ito nagsimula ang lahat. Lumiwanag ang ilaw sa adapter at lumitaw ang isang bagong device sa listahan ng mga interface ng network.

Ang pagtingin sa mga wireless na interface ay nagpapakita ng sumusunod:

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

Bonus para sa mga nagbabasa hanggang dulo

Tandaan kung paano ko sinabi na hindi mahalaga kung anong maximum na bilis ang nakasaad sa iyong adaptor?
Kaya, sa Malinka (bago ang paglabas ng modelo 4), lahat ng mga device (kabilang ang ethernet adapter) ay nakaupo sa parehong usb bus. Mahusay, tama? At samakatuwid ang bandwidth ng usb bus ay nahahati sa lahat ng mga device dito. Kapag sinusukat ang bilis sa pamamagitan ng ethernet at sa pamamagitan ng usb wi-fi (nakakonekta sa 1 router) sa pamamagitan ng hangin at sa pamamagitan ng wire, ito ay nasa paligid ng 20Mbit/s.

PS Sa pangkalahatan, ang gabay na ito para sa pag-compile ng driver para sa partikular na adaptor na ito ay may bisa hindi lamang para sa RPI. Pagkatapos ay inulit ko ito sa aking desktop gamit ang Linux Mint - lahat ay gumana din doon. Kailangan mo lang i-download ang mga kinakailangang file ng header para sa iyong bersyon ng kernel sa parehong paraan.

UPD. Iminungkahi ng mga taong may kaalaman: upang hindi umasa sa bersyon ng kernel, kailangan mong mangolekta at mag-install ng mga driver gamit ang dkms. Ang readme para sa driver ay naglalaman din ng pagpipiliang ito.

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. Iminungkahi tambalan para sa device id ay tinanggap sa pangunahing sangay ng lwfinger/rtl8188eu repository.

sanggunian
- Mga RPi USB Wi-Fi Adapter
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-source

Pinagmulan: www.habr.com