بیایید RaspberryPi با TP-Link TL-WN727N دوست شویم

هی هابر!

یک بار تصمیم گرفتم تمشک خود را از طریق هوا به اینترنت وصل کنم.

خیلی زود، برای این منظور یک سوت usb wi-fi را از شرکت معروف TP-Link از نزدیکترین فروشگاه خریداری کردم. من فوراً می گویم که این نوعی ماژول نانو usb نیست، بلکه یک دستگاه کاملاً بزرگ است که به اندازه یک فلش مموری معمولی است (یا اگر دوست دارید به اندازه انگشت اشاره یک مرد بالغ). قبل از خرید، من کمی در مورد لیست تولید کنندگان سوت پشتیبانی شده برای RPI تحقیق کردم و TP-Link در لیست بود (اما همانطور که بعدا مشخص شد، من ظرافت ها را در نظر نگرفتم، زیرا شیطان، همانطور که می دانیم ، در جزئیات است). بنابراین، داستان سرد ماجراهای ناگوار من آغاز می شود؛ داستانی پلیسی در 3 قسمت را به شما تقدیم می کنیم. علاقه مندان به گربه مراجعه کنند.

ماده اتصال آداپتور 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

هوم، طبق معمول، هیچ کلمه ای در مورد لینوکس نیست. 2k19 بود و هنوز درایورها باید به صورت دستی مونتاژ می شدند...

ما با خود 2 کامپایلر، 75 هزار کتابخانه، پنج حباب باینری، نیم آرایه از زنان برهنه با یک آرم و دریایی کامل از سرصفحه های همه زبان ها و نشانه ها داشتیم. نه اینکه این یک مجموعه ضروری برای کار باشد. اما هنگامی که شروع به مونتاژ یک سیستم برای خود می کنید، متوقف کردن آن دشوار می شود. تنها چیزی که باعث نگرانی من شد درایورهای وای فای بود. هیچ چیز درمانده، غیرمسئولانه و فاسدتر از ساختن رانندگان از منبع نیست. اما می دانستم که دیر یا زود به این آشغال ها روی خواهیم آورد.

به طور کلی، همانطور که می دانید، دست و پا زدن با wi-fi usb در لینوکس است دردناک و تا حدودی بی مزه (مانند سوشی روسی).

جعبه همچنین حاوی یک سی دی با درایورها است. بدون امید زیاد به آنچه روی آن است نگاه می کنم - آنها قطعاً به آن توجه نکرده اند. یک جستجوی اینترنتی مرا به وب سایت سازنده آورد، اما یک درایور لینوکس در آنجا فقط برای بازبینی دستگاه وجود دارد v4، و در آغوشم بود v5.21. و علاوه بر این، برای نسخه های هسته بسیار قدیمی 2.6-3.16. در همان ابتدا که از شکست ناامید شده بودم، قبلاً فکر می کردم که باید TL-WN727N را می گرفتم (کمی گران تر است و می تواند 300 مگابیت در ثانیه در مقابل 150 برای من تحمل کند، اما همانطور که معلوم شد این اصلاً مهم نیست. برای تمشک، بعداً در مورد آن نوشته خواهد شد). اما مهمترین چیز این است که درایورهای آن از قبل وجود دارند و به سادگی به عنوان یک بسته نصب می شوند سیستم عامل-ralink. معمولاً می‌توانید ویرایش دستگاه را روی بدنه دستگاه روی برچسبی در کنار شماره سریال مشاهده کنید.

جستجوی بیشتر و بازدید از تالارهای گفتگوی مختلف، سود چندانی به همراه نداشت. ظاهراً هیچ کس قبل از من سعی نکرده است چنین آداپتوری را به لینوکس وصل کند. هوم، من به اندازه یک مرد غرق شده خوش شانس هستم.

اگرچه، نه، دروغ می گویم، بازدید از انجمن ها (عمدتاً انگلیسی زبان) نیز به ثمر نشست؛ در برخی از تاپیک ها به آقای lwfinger اشاره شده بود که به نوشتن تعدادی درایور برای آداپتورهای وای فای معروف است. . مخزن git او در انتهای مقاله در لینک ها قرار دارد. و دومین درسی که آموختم این است که باید دستگاه خود را شناسایی کنید تا بفهمید کدام درایور ممکن است برای آن مناسب باشد.

بخش 1: هویت بورن

وقتی دستگاه به پورت وصل شد، البته هیچ 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: برتری بورن

من سورس های درایور را از گیت دانلود می کنم.

زمان آن رسیده است که ویندوز را مجدداً نصب کنید و کاری را انجام دهید که کاربران لینوکس معمولاً با آن مرتبط هستند - مونتاژ کردن چیزی از انواع مختلف. همانطور که مشخص است، مونتاژ درایورها با کامپایل کردن برنامه ها تفاوت کمی دارد:

make
sudo make install

اما برای کامپایل ماژول های هسته به فایل های هدر هسته برای نسخه خاص خود نیاز داریم.

یک بسته در مخزن سهام وجود دارد raspberrypi-kernel-headers، اما حاوی نسخه هسته فایل ها است 4.19.66-v7l+و این برای ما مناسب نیست. اما برای به دست آوردن سرصفحه های نسخه مورد نیاز، همانطور که معلوم شد، یک ابزار مناسب وجود دارد منبع rpi (لینک در انتها در Github) که با آن می توانید سربرگ های لازم را دانلود کنید. ما مخزن را کلون می کنیم، اسکریپت را قابل اجرا می کنیم و آن را اجرا می کنیم. اولین راه اندازی با یک خطا شکست می خورد - هیچ ابزاری وجود ندارد bc. خوشبختانه در مخزن است و ما فقط آن را نصب می کنیم.

sudo apt-get install bc

پس از این، راه اندازی مجدد و دانلود هدرها (و سپس راه اندازی چیزی، الان یادم نیست) کمی طول می کشد و می توانید روی صندلی خود بنشینید، ویندوز در تمام جلوه هایش بهتر شده است.

پس از دانلود همه هدرها، بررسی کنید که دایرکتوری ظاهر شود /lib/modules/4.19.73-v7+ و در آن Symlink به مکانی که فایل های دانلود شده در آن قرار دارند اشاره می کند (برای من /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 جانور سریعی نیست (دارای Cortex ARM v32 900 بیتی 7 مگاهرتز است).
بنابراین همه چیز جمع آوری شد. ما درایور را در مرحله 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. اولتیماتوم بورن

سوت را به پورت وصل می کنم و ... هیچ اتفاقی نمی افتد. آیا همه چیز بیهوده بود؟

من شروع به مطالعه فایل های داخل پروژه می کنم و در یکی از آنها متوجه می شوم که مشکل چیست: درایور لیست کاملی از شناسه های VID/PID را مشخص می کند که می تواند ارائه دهد. و برای اینکه دستگاه ما با این درایور کار کند، من فقط id خود را به فایل اضافه کردم 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)، همه دستگاه ها (از جمله آداپتور اترنت) روی یک گذرگاه USB قرار می گیرند. عالیه، درسته؟ و بنابراین پهنای باند باس usb بین تمام دستگاه های موجود در آن تقسیم می شود. هنگام اندازه گیری سرعت هم از طریق اترنت و هم از طریق وای فای usb (متصل به 1 روتر) هم از طریق هوا و هم از طریق سیم، حدود 20 مگابیت بر ثانیه بود.

PS به طور کلی، این راهنمای برای کامپایل یک درایور برای این آداپتور خاص نه تنها برای RPI معتبر است. سپس آن را روی دسکتاپ خود با لینوکس مینت تکرار کردم - همه چیز در آنجا نیز کار کرد. فقط باید فایل های هدر لازم برای نسخه هسته خود را به همین روش دانلود کنید.

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. پیشنهاد شده وصله برای شناسه دستگاه در شاخه اصلی مخزن lwfinger/rtl8188eu پذیرفته شد.

مراجع
- آداپتورهای RPi USB Wi-Fi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- منبع rpi

منبع: www.habr.com