让我们用 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,但事实证明,这根本不重要)对于树莓派,这个稍后会写)。 但最重要的是它的驱动程序已经存在并且只需作为软件包安装即可 固件-ralink。 您通常可以在设备机身上序列号旁边的标签上查看设备版本。

进一步谷歌搜索和访问各种论坛并没有带来太多好处。 显然在我之前没有人尝试过将这样的适配器连接到 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-源

来源: habr.com