Mari berteman dengan RaspberryPi dengan TP-Link TL-WN727N

Hei Habr!

Saya pernah memutuskan untuk menghubungkan raspberry saya ke Internet melalui udara.

Tidak lama kemudian, untuk tujuan ini saya membeli peluit usb wi-fi dari perusahaan terkenal TP-Link dari toko terdekat. Saya harus segera mengatakan bahwa ini bukan semacam modul nano usb, tetapi perangkat yang cukup besar, seukuran flash drive biasa (atau, jika Anda suka, seukuran jari telunjuk pria dewasa). Sebelum membeli, saya melakukan sedikit riset tentang daftar produsen peluit yang didukung untuk RPI dan TP-Link ada di daftar tersebut (namun, ternyata kemudian, saya tidak memperhitungkan seluk-beluknya, karena setan, seperti yang kita tahu , ada di detailnya). Jadi, kisah dingin kesialan saya dimulai, untuk perhatian Anda kami sajikan cerita detektif dalam 3 bagian. Bagi yang berminat, silakan merujuk ke cat.

Artikel Menghubungkan adaptor WiFi WN727N ke Ubuntu/Mint Ini membantu saya sebagian, tetapi hal pertama yang pertama.

Kondisi permasalahan

Diberikan:

  1. komputer papan tunggal Raspberry Pi 2 B v1.1 – 1 buah
  2. peluit usb wi-fi WN727N - 1 buah
  3. sepasang tangan yang tidak terlalu bengkok - 2 buah
  4. Raspbian terbaru diinstal sebagai OS (berdasarkan Debian 10 Buster)
  5. kernel versi 4.19.73-v7+

Temukan: sambungkan ke Internet (Wi-Fi didistribusikan dari router rumah Anda)

Setelah membongkar adaptor, saya membaca instruksi di dalamnya:

Kompatibilitas Sistem: Windows 10/8/7/XP (bahkan sky, bahkan XP) dan MacOS 10.9-10.13

Hmm, seperti biasa, tidak ada sepatah kata pun tentang Linux. Itu 2k19, dan drivernya masih perlu dirakit secara manual...

Kami memiliki 2 kompiler, 75 ribu perpustakaan, lima gumpalan biner, setengah array wanita telanjang dengan logo dan lautan header dari semua bahasa dan markup. Bukan berarti ini merupakan set yang diperlukan untuk pekerjaan itu. Namun begitu Anda mulai merakit sistem untuk diri Anda sendiri, akan sulit untuk berhenti. Satu-satunya hal yang membuat saya khawatir adalah driver wi-fi. Tidak ada yang lebih tidak berdaya, tidak bertanggung jawab, dan korup selain membangun penggerak dari sumbernya. Tapi saya tahu cepat atau lambat kita akan beralih ke sampah ini.

Secara umum, seperti yang Anda ketahui, mengutak-atik usb wi-fi di Linux adalah menyakitkan dan agak hambar (seperti sushi Rusia).

Kotak itu juga berisi CD dengan driver. Tanpa banyak harapan saya melihat apa yang ada di dalamnya - mereka pasti tidak mengurusnya. Pencarian di Internet membawa saya ke situs web produsen, tetapi ada driver Linux di sana hanya untuk revisi perangkat v4, dan di pelukanku ada v5.21. Selain itu, untuk kernel yang sangat lama versi 2.6-3.16. Karena putus asa karena kegagalan di awal, saya sudah berpikir bahwa saya seharusnya menggunakan TL-WN727N (ini sedikit lebih mahal dan dapat menangani 300Mbps dibandingkan 150 untuk milik saya, tetapi ternyata, ini tidak masalah sama sekali untuk raspberry, ini akan ditulis nanti). Namun yang terpenting drivernya sudah ada dan cukup diinstal sebagai satu paket firmware-ralink. Anda biasanya dapat melihat revisi perangkat pada badan perangkat pada stiker di sebelah nomor seri.

Googling lebih lanjut dan mengunjungi berbagai forum tidak membawa banyak manfaat. Rupanya belum ada orang sebelum saya yang mencoba menghubungkan adaptor seperti itu ke Linux. Hmm, aku sama beruntungnya dengan orang yang tenggelam.

Meskipun, tidak, saya berbohong, mengunjungi forum (kebanyakan yang berbahasa Inggris) juga membuahkan hasil; di beberapa topik ada penyebutan Pak lwfinger, yang terkenal karena menulis sejumlah driver untuk adaptor Wi-Fi . Repositori gitnya ada di akhir artikel di tautan. Dan pelajaran kedua yang saya pelajari adalah Anda perlu mengidentifikasi perangkat Anda untuk memahami driver mana yang cocok untuknya.

Bagian 1: Identitas Bourne

Saat perangkat dicolokkan ke port, tentu saja tidak ada LED yang menyala. Dan secara umum tidak jelas apakah sesuatu itu berhasil atau tidak.

Pertama-tama, untuk mengetahui apakah kernel melihat perangkat kita, saya mencari di 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

Ternyata ia melihat, bahkan terlihat jelas ada chip Realtek dan VID/PID perangkat itu sendiri di bus usb.

Mari kita melangkah lebih jauh dan melihat lsusb, dan di sini kegagalan lain menanti kita

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

Sistem tidak mengetahui jenis perangkatnya, dan dengan malu-malu menunjukkan ruang kosong alih-alih namanya (walaupun vendor=2357 jelas merupakan TP-Link).

Pada tahap ini, pembaca yang ingin tahu mungkin telah memperhatikan sesuatu yang menarik, tetapi kita akan membiarkannya sampai pada waktunya.

Meneliti masalah nama kosong membawa saya ke situs dengan pengidentifikasi, di mana informasi tentang VID/PID yang diketahui dimasukkan. 2357:0111 kami tidak ada di sana. Ternyata kemudian, utilitasnya lsusb menggunakan file /usr/share/misc/usb.ids, yang merupakan daftar ID yang sama dari situs ini. Untuk keindahan tampilan, saya cukup menambahkan baris untuk vendor TP-Link di sistem saya.

2357  TP-Link
        0111  TL-WN727N v5.21

Ya, kami telah memperbaiki tampilan di daftar perangkat, tetapi itu tidak membawa kami selangkah lebih dekat dalam memilih driver. Untuk memilih pengemudi, Anda perlu mengetahui chip apa yang digunakan untuk membuat peluit Anda. Upaya gagal berikutnya untuk mengetahui hal ini di Internet tidak menghasilkan sesuatu yang baik. Berbekal obeng tipis, saya dengan hati-hati membuka tutup adaptor dan gagasan kejam Paman Liao muncul dalam segala ketelanjangan aslinya. Di bawah kaca pembesar Anda dapat melihat nama chipnya - RTL8188EUS. Ini sudah bagus. Di beberapa forum saya melihat postingan bahwa driver dari pria yang sama lwfinger sangat cocok untuk chip ini (walaupun dia hanya menulis tentang RTL8188EU).

Bagian 2: Supremasi Bourne

Saya mengunduh sumber driver dari Git.

Saatnya menginstal ulang Windows dan melakukan apa yang biasanya dikaitkan dengan pengguna Linux - merakit sesuatu dari beberapa jenis. Ternyata, merakit driver tidak jauh berbeda dengan mengkompilasi program:

make
sudo make install

tetapi untuk mengkompilasi modul kernel kita memerlukan file header kernel untuk versi spesifik kita.

Ada paket di gudang stok raspberrypi-kernel-header, tetapi berisi file versi kernel 4.19.66-v7l+, dan itu tidak cocok untuk kami. Namun ternyata, untuk mendapatkan header dari versi yang diperlukan, ada alat yang mudah digunakan sumber rpi (tautan di bagian akhir di Github), yang dengannya Anda dapat mengunduh header yang diperlukan. Kami mengkloning repositori, membuat skrip dapat dieksekusi, dan menjalankannya. Peluncuran pertama gagal karena kesalahan - tidak ada utilitas bc. Untungnya ada di repositori dan kita tinggal menginstalnya.

sudo apt-get install bc

Setelah itu, memulai ulang dan mengunduh header (dan kemudian mengatur sesuatu, saya tidak ingat sekarang) membutuhkan waktu dan Anda dapat duduk santai, Windows menjadi lebih baik dalam semua manifestasinya.

Setelah semua header diunduh, periksa apakah direktori tersebut muncul /lib/modules/4.19.73-v7+ dan di dalamnya symlink menunjuk ke tempat di mana file yang diunduh berada (bagi saya itu /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

Tahap persiapan telah selesai, Anda dapat memulai perakitan. Merakit modul lagi membutuhkan waktu, Raspberry bukanlah monster yang cepat (memiliki 32bit 900Mhz Cortex ARM v7).
Jadi semuanya dikompilasi. Kami menginstal driver pada langkah ke-2 (make install), sambil juga menyalin lebih banyak file firmware yang diperlukan agar driver dapat berfungsi:

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

Bagian 3. Ultimatum Bourne

Saya mencolokkan peluit ke port dan... tidak terjadi apa-apa. Apakah semuanya sia-sia?

Saya mulai mempelajari file-file di dalam proyek dan di salah satunya saya menemukan masalahnya: driver menentukan daftar lengkap pengidentifikasi VID/PID yang dapat dilayaninya. Dan agar perangkat kami dapat berfungsi dengan driver ini, saya cukup menambahkan id saya ke 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 */
};

Saya mengkompilasi ulang driver dan menginstalnya kembali pada sistem.

Dan kali ini semuanya dimulai. Lampu pada adaptor menyala dan perangkat baru muncul di daftar antarmuka jaringan.

Melihat antarmuka nirkabel menunjukkan hal berikut:

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 bagi yang membaca sampai akhir

Ingat bagaimana saya mengatakan bahwa tidak masalah berapa kecepatan maksimum yang tertera pada adaptor Anda?
Jadi, di Malinka (sebelum rilis model 4), semua perangkat (termasuk adaptor ethernet) berada di bus usb yang sama. Hebat, bukan? Dan oleh karena itu bandwidth bus usb dibagi antara semua perangkat di dalamnya. Saat mengukur kecepatan baik melalui ethernet dan melalui usb wi-fi (terhubung ke 1 router) baik melalui udara maupun kabel, jumlahnya sekitar 20Mbit/s.

PS Secara umum, panduan untuk mengkompilasi driver untuk adaptor khusus ini tidak hanya berlaku untuk RPI. Saya kemudian mengulanginya di desktop saya dengan Linux Mint - semuanya juga berfungsi di sana. Anda hanya perlu mengunduh file header yang diperlukan untuk versi kernel Anda dengan cara yang sama.

UPD. Orang yang berpengetahuan menyarankan: agar tidak bergantung pada versi kernel, Anda perlu mengumpulkan dan menginstal driver menggunakan dkms. Readme untuk driver juga berisi opsi ini.

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. Diajukan tambalan untuk id perangkat diterima di cabang utama repositori lwfinger/rtl8188eu.

referensi
- Adaptor Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- sumber rpi

Sumber: www.habr.com