Ας κάνουμε φίλους το RaspberryPi με το TP-Link TL-WN727N

Γεια σου Χαμπρ!

Κάποτε αποφάσισα να συνδέσω το raspberry μου στο Διαδίκτυο μέσω του αέρα.

Αμέσως μετά, αγόρασα για το σκοπό αυτό ένα wi-fi whistle usb από τη γνωστή εταιρεία TP-Link από το κοντινότερο κατάστημα. Θα πω αμέσως ότι αυτό δεν είναι κάποιο είδος μονάδας nano usb, αλλά μια αρκετά μεγάλη συσκευή, περίπου στο μέγεθος μιας κανονικής μονάδας flash (ή, αν θέλετε, στο μέγεθος του δείκτη ενός ενήλικα άνδρα). Πριν από την αγορά, έκανα μια μικρή έρευνα σχετικά με τη λίστα των υποστηριζόμενων κατασκευαστών σφυρίχτρων για το RPI και το TP-Link ήταν στη λίστα (ωστόσο, όπως αποδείχθηκε αργότερα, δεν έλαβα υπόψη τις λεπτές λεπτομέρειες, επειδή ο διάβολος, όπως ξέρουμε , είναι στις λεπτομέρειες). Ξεκινά, λοιπόν, το κρύο παραμύθι των ατυχιών μου· παρουσιάζουμε στην προσοχή σας μια αστυνομική ιστορία σε 3 μέρη. Για όσους ενδιαφέρονται, ανατρέξτε στο cat.

Άρθρο Σύνδεση του προσαρμογέα 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+

Εύρεση: σύνδεση στο Διαδίκτυο (το Wi-Fi διανέμεται από τον οικιακό σας δρομολογητή)

Μετά την αποσυσκευασία του προσαρμογέα, διάβασα τις οδηγίες στο εσωτερικό:

Συμβατότητα συστήματος: Windows 10/8/7/XP (ακόμη και στον ουρανό, ακόμα και XP) και MacOS 10.9-10.13

Χμ, ως συνήθως, ούτε λέξη για το Linux. Ήταν 2k19, και τα προγράμματα οδήγησης έπρεπε να συναρμολογηθούν χειροκίνητα...

Είχαμε μαζί μας 2 μεταγλωττιστές, 75 χιλιάδες βιβλιοθήκες, πέντε δυαδικά blobs, μισή σειρά από γυμνές γυναίκες με λογότυπο και μια ολόκληρη θάλασσα από κεφαλίδες όλων των γλωσσών και σημαδιών. Όχι ότι αυτό είναι απαραίτητο σετ για τη δουλειά. Αλλά μόλις αρχίσετε να συναρμολογείτε ένα σύστημα για τον εαυτό σας, γίνεται δύσκολο να σταματήσετε. Το μόνο που με ανησυχούσε ήταν τα προγράμματα οδήγησης για wi-fi. Δεν υπάρχει τίποτα πιο ανήμπορο, ανεύθυνο και διεφθαρμένο από το να χτίζεις οδηγούς από την πηγή. Αλλά ήξερα ότι αργά ή γρήγορα θα περάσαμε σε αυτά τα σκουπίδια.

Σε γενικές γραμμές, όπως ξέρετε, το να ασχολείσαι με το usb wi-fi στο Linux είναι επώδυνο και κάπως άγευστο (όπως το ρωσικό σούσι).

Το κουτί περιέχει επίσης ένα CD με προγράμματα οδήγησης. Χωρίς πολλές ελπίδες, κοιτάζω τι υπάρχει σε αυτό - σίγουρα δεν το έχουν φροντίσει. Μια αναζήτηση στο Διαδίκτυο με έφερε στον ιστότοπο του κατασκευαστή, αλλά υπάρχει ένα πρόγραμμα οδήγησης Linux εκεί μόνο για αναθεώρηση συσκευής v4, και στην αγκαλιά μου ήταν v5.21. Και επιπλέον, για πολύ παλιές εκδόσεις πυρήνα 2.6-3.16. Απογοητευμένος από την αποτυχία στην αρχή, σκέφτηκα ήδη ότι έπρεπε να είχα πάρει το TL-WN727N (είναι λίγο πιο ακριβό και μπορεί να χειριστεί 300Mbps έναντι 150 για το δικό μου, αλλά όπως αποδείχθηκε, αυτό δεν έχει καθόλου σημασία για το βατόμουρο, αυτό θα γραφτεί αργότερα). Αλλά το πιο σημαντικό είναι ότι τα προγράμματα οδήγησης για αυτό υπάρχουν ήδη και είναι απλά εγκατεστημένα ως πακέτο firmware-ralink. Μπορείτε συνήθως να προβάλετε την αναθεώρηση της συσκευής στο σώμα της συσκευής σε ένα αυτοκόλλητο δίπλα στον σειριακό αριθμό.

Το περαιτέρω γκουγκλάρισμα και η επίσκεψη σε διάφορα φόρουμ δεν έφεραν πολλά καλά. Προφανώς κανείς πριν από εμένα δεν έχει προσπαθήσει να συνδέσει έναν τέτοιο προσαρμογέα στο Linux. Χμ, είμαι τόσο τυχερός όσο ένας πνιγμένος.

Αν και, όχι, λέω ψέματα, η επίσκεψη σε φόρουμ (κυρίως αγγλόφωνα) απέδωσε επίσης καρπούς· σε ορισμένα θέματα αναφέρθηκε κάποιος κύριος lwfinger, ο οποίος είναι διάσημος για τη σύνταξη πολλών προγραμμάτων οδήγησης για προσαρμογείς Wi-Fi . Το git repository του βρίσκεται στο τέλος του άρθρου στους συνδέσμους. Και το δεύτερο μάθημα που έμαθα είναι ότι πρέπει να αναγνωρίσετε τη συσκευή σας για να καταλάβετε ποιο πρόγραμμα οδήγησης μπορεί να είναι κατάλληλο για αυτήν.

Μέρος 1: Η ταυτότητα Bourne

Όταν η συσκευή ήταν συνδεδεμένη στη θύρα, φυσικά, δεν άναβε κανένα LED. Και γενικά δεν είναι ξεκάθαρο με κανέναν τρόπο αν κάτι λειτουργεί ή όχι.

Πρώτα απ 'όλα, για να μάθω αν ο πυρήνας βλέπει τη συσκευή μας, κοιτάζω στο 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: Η υπεροχή του Μπορν

Κατεβάζω τις πηγές προγραμμάτων οδήγησης από το Git.

Ήρθε η ώρα να επανεγκαταστήσετε τα Windows και να κάνετε αυτό με το οποίο συνδέονται συνήθως οι χρήστες Linux - συναρμολογώντας κάτι από κάποιο είδος. Η συναρμολόγηση προγραμμάτων οδήγησης, όπως αποδεικνύεται, διαφέρει ελάχιστα από τη μεταγλώττιση προγραμμάτων:

make
sudo make install

αλλά για τη μεταγλώττιση λειτουργικών μονάδων πυρήνα χρειαζόμαστε τα αρχεία κεφαλίδας του πυρήνα για τη συγκεκριμένη έκδοσή μας.

Υπάρχει ένα πακέτο στο αποθετήριο αποθεμάτων raspberrypi-kernel-headers, αλλά περιέχει την έκδοση πυρήνα των αρχείων 4.19.66-v7l+, και αυτό δεν μας ταιριάζει. Αλλά για να λάβετε τις κεφαλίδες της απαιτούμενης έκδοσης, όπως αποδείχθηκε, υπάρχει ένα βολικό εργαλείο rpi-πηγή (σύνδεσμος στο τέλος στο Github), με το οποίο μπορείτε να κατεβάσετε τις απαραίτητες κεφαλίδες. Κλωνοποιούμε το αποθετήριο, κάνουμε το σενάριο εκτελέσιμο και το τρέχουμε. Η πρώτη εκκίνηση αποτυγχάνει με σφάλμα - δεν υπάρχει χρησιμότητα bc. Ευτυχώς, βρίσκεται στο αποθετήριο και απλά το εγκαθιστούμε.

sudo apt-get install bc

Μετά από αυτό, η επανεκκίνηση και η λήψη των κεφαλίδων (και στη συνέχεια η ρύθμιση κάτι, δεν θυμάμαι τώρα) διαρκεί λίγο και μπορείτε να καθίσετε στην καρέκλα σας, τα Windows έχουν γίνει καλύτερα σε όλες τους τις εκδηλώσεις.

Αφού ολοκληρωθεί η λήψη όλων των κεφαλίδων, ελέγξτε ότι εμφανίζεται ο κατάλογος /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

Το προπαρασκευαστικό στάδιο έχει ολοκληρωθεί, μπορείτε να ξεκινήσετε τη συναρμολόγηση. Η συναρμολόγηση των μονάδων και πάλι χρειάζεται λίγο χρόνο, το Raspberry δεν είναι γρήγορο θηρίο (έχει 32bit 900Mhz Cortex ARM v7).
Όλα λοιπόν συγκεντρωμένα. Εγκαθιστούμε το πρόγραμμα οδήγησης στο 2ο βήμα (κάνουμε εγκατάσταση), ενώ αντιγράφουμε και περισσότερα αρχεία υλικολογισμικού που είναι απαραίτητα για τη λειτουργία του προγράμματος οδήγησης:

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. Το τελεσίγραφο του Bourne

Βάζω το σφύριγμα στη θύρα και... δεν γίνεται τίποτα. Ήταν όλα για το τίποτα;

Αρχίζω να μελετώ τα αρχεία μέσα στο έργο και σε ένα από αυτά βρίσκω ποιο ήταν το πρόβλημα: το πρόγραμμα οδήγησης καθορίζει μια πλήρη λίστα αναγνωριστικών VID/PID που μπορεί να εξυπηρετήσει. Και για να λειτουργεί η συσκευή μας με αυτό το πρόγραμμα οδήγησης, απλά πρόσθεσα το αναγνωριστικό μου στο αρχείο 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

Μπόνους για όσους διαβάζουν μέχρι το τέλος

Θυμάστε πώς είπα ότι δεν έχει σημασία ποια μέγιστη ταχύτητα αναφέρεται στον προσαρμογέα σας;
Έτσι, στο Malinka (πριν από την κυκλοφορία του μοντέλου 4), όλες οι συσκευές (συμπεριλαμβανομένου του προσαρμογέα ethernet) βρίσκονται στον ίδιο δίαυλο usb. Τέλεια, σωστά; Και επομένως το εύρος ζώνης του διαύλου usb κατανέμεται μεταξύ όλων των συσκευών σε αυτόν. Κατά τη μέτρηση της ταχύτητας τόσο μέσω ethernet όσο και μέσω usb wi-fi (συνδεδεμένο με 1 router) τόσο αεροπορικώς όσο και ενσύρματα, ήταν γύρω στα 20Mbit/s.

Υ.Γ. Γενικά, αυτός ο οδηγός για τη μεταγλώττιση ενός προγράμματος οδήγησης για τον συγκεκριμένο προσαρμογέα δεν ισχύει μόνο για το 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. Προτάθηκε patch για το αναγνωριστικό συσκευής έγινε αποδεκτό στον κύριο κλάδο του αποθετηρίου lwfinger/rtl8188eu.

παραπομπές
- Προσαρμογείς RPi USB Wi-Fi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- rpi-πηγή

Πηγή: www.habr.com