Sveiki, Habr!
Es kādu reizi domāju, kā savienot savu Raspberry Pi ar internetu pa gaisu.
Teikts-izdarīts, tam tika iegādāts tuvākajā veikalā USB Wi-Fi adapters no pazīstamā zīmola TP-Link. Jāteic, šis nav kāds tur nano USB modulis, bet gan samērā ietilpīgs aparāts, apmēram parastās flešatmiņas izmērā (nu vai, ja jums tā labāk patiks, tāda pieauguša vīrieša rādītājpirksta izmērā). Pirms iegādes es nedaudz izpētīju atbalstīto adapteru sarakstu RPI un TP-Link bija iekļauts (patiesībā, kā izrādījās, es neizpratu visus nianses, jo velns, kā zināms, slēpjas sīkumos). Tātad, aukstais stāsts par manām nepatikšanām sākas, jūsu uzmanībai tiek piedāvāta detektīva stāsts 3 daļās. Interesentus lūdzu zemāk.
Raksts tas man daļēji palīdzēja, bet par visu pēc kārtas.
Uzdevuma nosacījumi
Doti:
- vienplatīna dators Raspberry Pi 2 B v1.1 — 1 gabals
- USB Wi-Fi adapters WN727N — 1 gabals
- pāris ne gluži kreisas rokas — 2 gabali
- kā operētājsistēma ir instalēts jaunākais Raspbian (balstīts uz Debian 10 Buster)
- kodols versijā 4.19.73-v7+
Atrast: izveidot savienojumu ar internetu (Wi-Fi tiek izsniegts no mājas maršrutētāja)
Pēc adaptera izņemšanas izlasu iekšā instrukciju:
Sistēmas saderība: Windows 10/8/7/XP (pat XP) un MacOS 10.9-10.13
Nu jā, par Linux kā parasti nevārds. Pagāja 2019. gads, bet vadības programmas joprojām bija jāsavāc manuāli…
Mums bija līdzi 2 kompilatori, 75 tūkstoši bibliotēku, pieci binārie blobi, puslīdz neapģērbtas meitenes ar logotipiem un vesels jūklis headeru visās valodās un markējuma. Nē, tas nebija obligāts komplekts darbam. Bet, ja tu sāc veidot sistēmu pēc savas gaumes, paliek grūti apstāties. Vienīgais, kas mani uztrauca — bija Wi-Fi draiveri. Nav nekas vairāk bezpalīdzīgs, bezatbildīgs un sabojāts kā draiveru kompilācija no avota koda. Bet es zināju, ka agrāk vai vēlāk mēs pāriesim arī uz šo afēru.
Kopumā, kā zināms, lietot USB Wi-Fi Linux vidē ir sāpīgi un nedaudz nepatīkami (kā krievu suši).
Kastē vēl ir CD disks ar draiveriem. Arī bez lielas cerības skatos, kas uz tā ir — jā, tieši tā, nav parūpējušies. Meklēšana internetā noveda mani uz ražotāja mājaslapu, bet tur Linux draiveris bija tikai ierīces revīzijai v4, bet man rokās bija v5.21. Un uz ļoti vecām kodola versijām 2.6-3.16. Neveiksmes sākumā mani jau iepriekšēja sajūta, ka vajadzēja ņemt TL-WN727N (tas ir nedaudz dārgāks un atbalsta 300Mbps pret 150Mbps manam, bet izrādījās, ka tam maznozīmīgi ir mājiņas). Bet svarīgākais ir tas, ka draiveri tam jau ir pieejami un instalējas vienkārši ar paketi. firmware-ralink. Ierīces revīziju parasti var apskatīt uz korpusa uz uzlīmes blakus sērijas numuram.
Turpmākā meklēšana un dažādu forumu apmeklēšana īpaši neko labu nenozīmēja. Izskatās, ka neviens pirms manis tādu tieši adapteri nepievienoja Linux. Jā, man ir paveicies kā noslīkušajam.
Tomēr nē, melotu, forumu apmeklējums (galvenokārt angliski runājošos) arī deva savus augļus, dažos tematos parādījās pieminējums kāda kunga lwfinger, kurš ir pazīstams ar to, ka sarakstījis dažus draiverus Wi-Fi adapteriem. Viņa Git repozitorijs rakstā beigās ir saites. Un otra mācība, ko esmu apguvis, ir nepieciešams identificēt savu ierīci, lai saprastu, kurš draiveris tam varētu derēt.
1. daļa. Identifikācijas dzimšanu
Pievienojot ierīci pie porta, nekāda LED gaisma protams neiedegās. Un vispār, nekādā veidā nav saprotams, vai kaut kas strādā vai nē.
Pirmais, ko es darīšu, lai noskaidrotu, vai kodols redz mūsu ierīci, ir paskatīties dmesg:
[ 965.606998] usb 1-1.3: jauns augstas ātruma USB ierīce numurs 9 izmantojot dwc_otg
[ 965.738195] usb 1-1.3: Jauna USB ierīce atrasta, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[ 965.738219] usb 1-1.3: Jauna USB ierīce virsraksti: Mfr=1, Produkts=2, Sērijas numurs=3
[ 965.738231] usb 1-1.3: Produkts: 802.11n NIC
[ 965.738243] usb 1-1.3: Ražotājs: Realtek
[ 965.738255] usb 1-1.3: Sērijas numurs: 00E04C0001
Izrādās redz, un pat ir skaidrs, ka tur ir Realtek čips un pats VID/PID ierīcei USB buss.
Dodamies tālāk, skatāmies lsusb, un te mūs sagaida nākamā neveiksme
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
Sistēma nezina, kas tā par ierīci, un kaunīgi rāda tukšu vietu vietā vārda (lai gan vendor=2357 tas ir noteikti TP-Link).
Šajā posmā ziņkārīgais lasītājs droši vien jau ir pamanījis kaut ko interesantu, bet to atliksim uz savu laiku.
Problēmas ar tukšajiem nosaukumiem izpēte mani noveda pie vietnes ar identifikatoriem, kur tiek ievadīta informācija par zināmiem VID/PID. Mūsu 2357:0111 tur nebija. Kā izrādījās vēlāk, utilīta lsusb izmanto failu /usr/share/misc/usb.ids, kas ir tas pats identifikatoru saraksts no šī vietnes. Lai izvairītos no vizuālām problēmām, es vienkārši pievienoju savai sistēmai rindu TP-Link.
2357 TP-Link
0111 TL-WN727N v5.21
Nu, tomēr mēs labojām ierīču sarakstu, bet tas mūs tuvāk izvēlei par draiveri nepieveda. Lai izvēlētos draiveri, ir jāzina, uz kāda čipa ir izgatavots jūsu adapteris. Vēl viena bezcerīga mēģinājuma noskaidrot to internetā neizraisīja neko labu. Ar plāno slotu skrūvgriezi uzmanīgi pacēlu adaptera vāciņu, un manā priekšā parādās sava pirmatnējā kailumā dēla radījums. Ar palielināmo stiklu var redzēt čipa nosaukumu — RTL8188EUS. Tas jau ir labi. Dažos forumos esmu redzējis ziņas, ka šim čipam labi der tieši tā paša kunga lwfinger draiveris (pat neskatoties uz to, ka tajā tikai rakstīts par RTL8188EU).
Otrā daļa. Borna izcilība
Lejuplādēju draivera avotu no gita.
Ir pienācis laiks atkārtoti instalēt Windows un nodarboties ar to, ko parasti saista ar Linux lietotājiem — kaut ko sastādīt no avotiem. Draiveru montāža, kā izrādījās, ir maz atšķirīga no programmu kompilēšanas:
make
sudo make install
bet, lai kompilētu kodola moduļus, mums ir nepieciešamas kodola galvenes faili mūsu konkrētajai versijai.
Krājumā ir pakotne raspberrypi-kernel-headers, bet tā satur failus kodolam 4.19.66-v7l+, un tas mums neder. Bet, lai iegūtu nepieciešamās versijas galvenes, kā izrādījās, ir ērts rīks rpi-source (saite beigās uz GitHub), ar kuru var lejupielādēt nepieciešamās galvenes. Klonējam repozitoriju, padarām skriptu izpildāmu un palaidam. Pirmajā palaišanā rodas kļūda — nav utilītas. bcPateicoties, tā ir pieejama repozitorijā, un mēs to vienkārši instalējam.
sudo apt-get install bc
Pēc tam atkārtota palaišana un galvene lejupielāde (un pēc tam kaut kas jākonfigurē, tagad jau neatceros) aizņem kādu laiku, un var atlaisties krēslā, Windows ir kļuvusi labāka visos tās izpausmēs.
Pēc tam, kad visas galvenes ir lejupielādētas, pārbaudām, vai ir izveidota katalogs /lib/modules/4.19.73-v7+ un tajā simlinks norāda uz to vietu, kur atrodas lejupielādētie faili (man tas ir /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
Sagatavošanās posms ir pabeigts, varam ķerties pie montāžas. Moduļu montāža aizņem noteiktu laiku, jo Raspberry Pi nav visspēcīgākais (tā procesors ir 32 bitu 900Mhz Cortex ARM v7).
Tātad, viss ir noformēts. Instalēsim draivera 2. soli (make install), kura laikā notiek arī citu failu kopēšana, kas nepieciešami draivera darbībai:
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. daļa. Borne ultimāts
Ievadu USB ierīci portā un… nekas nenotiek. Vai tiešām tas viss bija velti?
Sāku izpētīt failus projektā un vienā no tiem atradu problēmas avotu: draiverī ir norādīts pilns VID/PID identifikatoru saraksts, kurus tas var apkalpot. Lai mūsu ierīce darbotos ar šo draiveri, es vienkārši pievienoju savu id failā 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 */
};
Pārkompilēju draiveri un atkārtoti to instalēju sistēmā.
Un šoreiz viss darbojās. Lampiņa uz adaptera iedegās un sarakstā parādījās jauna ierīce.
Pārskatot bezvadu interfeisus, iegūstam sekojošo:
pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0 nav bezvadu paplašinājumu.
lo nav bezvadu paplašinājumu.
wlan0 neasociēts ESSID:"" Piesaistītais vārds:""
Režīms:Automātisks Frekvence=2.412 GHz Piekļuves punkts: Nepiesaistīts
Sensitivitāte:0/0
Retry:off RTS thr:off Fragment thr:off
Šifrēšanas atslēga:off
Enerģijas pārvaldība:off
Savienojuma kvalitāte=0/100 Signāla līmenis=0 dBm Troksnis=0 dBm
Rx nederīgi nwid:0 Rx nederīgi kript:0 Rx nederīgi fragmenti:0
Tx pārmērīgas atkārtošanās:0 Nederīgi daži:0 Izlaistas beacon:0
Bonuss tiem, kas izlasīja līdz galam
Vai atceraties, kā es teicu, ka nav svarīgi, kāda ir maksimālā ātruma specifikācija jūsu adapterim?
Tātad, uz Raspberry Pi (līdz modeļa 4 iznākšanai) visi ierīces (ieskaitot Ethernet adapteri) ir uz vienas USB bus. Forši, vai ne? Tādēļ USB bus caurlaidība tiek dalīta starp visām ierīcēm uz tās. Mērot ātrumu gan caur Ethernet, gan caur USB Wi-Fi (pievienotas 1 maršrutētājam) un pa gaisu, un ar vadu, tika iegūti rezultāti ap 20 Mbit/s.
P.S. Šis ceļvedis draivera kompilācijai šim konkrētajam adapterim ir spēkā ne tikai RPI. Es to atkārtoju arī uz sava desktopa ar Linux Mint — tur arī viss strādāja. Jums vienkārši ir jānokāpj vajadzīgie virsraksta faili jūsu izmantotajai kodola versijai.
UPD. Zinoši cilvēki ieteica: lai nedependētu no kodola versijas, ir jākompilē un jāinstalē draiveri ar dkms palīdzību. Šis variants ir pieejams arī draivera 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. Iesniegtais device id tika pieņemts galvenajā repozitorija lwfinger/rtl8188eu.
Saites
—
—
—
—
Avots: habr.com
