讓我們用 TP-Link TL-WN727N 與 RaspberryPi 交朋友

嘿哈布爾!

我曾經決定透過無線方式將我的樹莓派連接到網路。

為此,我從最近的商店購買了知名公司 TP-Link 的 USB 無線口哨。 我會立即說,這不是某種奈米 USB 模組​​,而是一個相當大的設備,大約是普通閃存驅動器的大小(或者,如果你願意,可以是成年男子食指的大小)。 在購買之前,我對 RPI 支援的口哨製造商清單做了一些研究,TP-Link 就在清單中(但是,後來發現,我沒有考慮到其中的微妙之處,因為眾所周知,魔鬼,在細節中) 。 那麼,我的不幸遭遇的冷酷故事就開始了;我們向您呈現一個分為三個部分的偵探故事。 有興趣的可以參考cat。

文章 將 WN727N WiFi 適配器連接到 Ubuntu/Mint 它對我有部分幫助,但首先是第一件事。

問題的條件

鑑於:

  1. 單板計算機 Raspberry Pi 2 B v1.1 – 1 件
  2. USB 無線口哨 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 個庫、XNUMX 個二進制 blob、半個帶有徽標的裸體女人數組以及所有語言和標記的一大堆標頭。 這並不是說這是這項工作所必需的。 但一旦你開始為自己組裝一個系統,就很難停下來。 唯一讓我擔心的是無線網路的驅動程式。 沒有什麼比從原始碼建立驅動程式更無助、不負責任和腐敗的了。 但我知道我們遲早會轉向這種垃圾。

一般來說,如你所知,在 Linux 上擺弄 USB Wi-Fi 是 痛苦且有些無味 (如俄羅斯壽司)。

包裝盒中還包含一張帶有驅動程式的 CD。 我不抱太大希望地看著上面的東西——他們肯定沒有處理過它。 透過互聯網搜索,我找到了製造商的網站,但那裡有一個 Linux 驅動程序,僅用於設備修訂 v4,而在我懷裡的是 v5.21。 此外,對於非常舊的核心版本 2.6-3.16。 一開始因為失敗而灰心喪氣,我已經認為我應該選擇TL-WN727N(它貴一點,可以處理300Mbps,而我的是150Mbps,但事實證明,這根本不重要)對於樹莓派,這個稍後會寫)。 但最重要的是它的驅動程式已經存在並且只需作為軟體包安裝即可 雷凌固件。 您通常可以在設備機身上序號旁的標籤上查看設備版本。

進一步谷歌搜尋和訪問各種論壇並沒有帶來太多好處。 顯然在我之前沒有人嘗試過將這樣的適配器連接到 Linux。 嗯,我就像溺水者一樣幸運。

雖然,不,我在撒謊,訪問論壇(主要是英語論壇)也取得了成果;在某些主題中提到了某個 lwfinger 先生,他因編寫許多 Wi-Fi 適配器驅動程式而聞名。 他的 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

事實證明它看到了,甚至可以清楚地看到usb總線上有Realtek晶片和設備本身的VID/PID。

我們再進一步看一下 的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,這是來自該網站的相同 ID 清單。 為了顯示的美觀,我只是在我的系統中添加了供應商 TP-Link 的線路。

2357  TP-Link
        0111  TL-WN727N v5.21

好吧,我們更正了設備列表中的顯示,但這並沒有讓我們更接近選擇驅動程式。 要選擇驅動器,您需要知道您的哨子是用什麼晶片製作的。 接下來在網路上尋找這一點的失敗嘗試並沒有帶來任何好處。 我拿著一把細長的一字螺絲刀,小心翼翼地撬開適配器蓋,廖叔叔的惡毒心血就顯露出來了。 在放大鏡下你可以看到晶片的名字— RTL8188EUS。 這已經很好了。 在一些論壇上,我看到帖子說來自同一位 lwfinger 先生的驅動程式非常適合該晶片(儘管他只寫了有關 RTL8188EU 的文章)。

第二部分:諜影重重

我從 Git 下載驅動程式來源。

是時候重新安裝 Windows 並做 Linux 用戶通常會做的事情了——組裝一些東西。 事實證明,彙編驅動程式與編譯程式幾乎沒有什麼不同:

make
sudo make install

但要編譯核心模組,我們需要特定版本的核心頭檔。

庫存存儲庫中有一個包 raspberrypi 核心頭文件,但它包含文件的內核版本 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 的速度並不快(它有 32 位元 900Mhz Cortex ARM v7)。
所以一切都編譯好了。 我們在第二步(make install)中安裝驅動程序,同時也複製驅動程式工作所需的更多韌體檔案:

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

第三部分:諜影重重的最後通牒

我將哨子插入端口,然後……什麼也沒發生。 難道這一切都是徒勞無功的嗎?

我開始研究專案內的文件,在其中一個文件中我發現了問題所在:驅動程式指定了它可以提供服務的 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 Wi-Fi(連接到 1 個路由器)透過空中和有線方式測量速度時,速度約為 20Mbit/s。

PS 一般來說,本指南為該特定適配器編譯驅動程式不僅適用於 RPI。 然後我在我的桌面上用 Linux Mint 重複了它——一切都在那裡工作。 您只需以相同的方式下載適合您的核心版本的必要頭檔即可。

UPD。 知情人士建議:為了不依賴核心版本,需要使用dkms收集並安裝驅動程式。 驅動程式的自述文件也包含此選項。

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。 建議的 修補 for device id 已被 lwfinger/rtl8188eu 儲存庫的主流分支接受。

引用
- RPi USB Wi-Fi 轉接器
- Gitbub lwfinger/rtl8188eu
- USB.ids
- rpi-源

來源: www.habr.com