- Дружим RaspberryPi с TP-Link TL-WN727N
- Условия задачи
- Часть 1. Идентификация Борна
- Часть 2. Превосходство Борна
- Часть 3. Ультиматум Борна
- Бонус для тех кто дочитал до конца
- How to setup a RTL881cu USB Wifi adapter with the Raspberry Pi 4
- Setting up a RTL881cu USB Wifi adapter with the Raspberry Pi 4
- 1. Update your Raspberry Pi
- 2. Install the required software
- 3. Create a directory
- 4. Access the directory
- 5. Download the repository
- 6. Access the downloaded repository
- 7. Edit the driver before installing
- 8. Install the driver
- 9. Plug in the adapter
Дружим RaspberryPi с TP-Link TL-WN727N
Задумал как-то я подключить свою малинку к интернету по воздуху.
Сказано-сделано, для этого был приобретен в ближайшем магазине usb wi-fi свисток небезызвестной фирмы TP-Link. Сразу скажу, что это не какой-то там нано usb модуль, а вполне себе габаритный девайс размером примерно с обычную флешку(ну или если вам будет угодно с указательный палец взрослого мужчины). Перед покупкой я немного изучил список поддерживаемых производителей свистков для RPI и TP-Link в списке был(правда как потом оказалось я не учел тонкостей, ведь дьявол как известно кроется в деталях). Итак, хладный сказ о моих злоключениях начинается, вашему вниманию предлагается детективная история в 3-х частях. Заинтересованных прошу под кат.
Статья Подключаем WiFi-адаптер WN727N к Ubuntu/Mint мне частично помогла, но обо всем по порядку.
Условия задачи
- одноплатный компьютер Raspberry Pi 2 B v1.1 — 1 штука
- usb wi-fi свисток WN727N — 1 штука
- пара не совсем кривых рук — 2 штуки
- в качестве ос установлен последний Raspbian (на основе debian 10 Buster)
- ядро версии 4.19.73-v7+
После распаковки адаптера читаю инструкцию внутри:
У нас было с собой 2 компилятора, 75 тысяч библиотек, пять бинарных блобов, полмассива голых баб с логотипом и целое море хедеров всех языков и разметок. Не то, чтобы это был необходимый набор для работы. Но если начал собирать систему под себя, становится трудно остановиться. Единственное, что вызывало у меня опасения — это драйвера под wi-fi. Нет ничего более беспомощного, безответственного и испорченного, чем сборка драйверов из исходников. Но я знал, что рано или поздно мы перейдем и на эту дрянь.
Вообще как известно возня с usb wi-fi на линуксе это больно и несколько невкусно (как русские суши).
В коробке лежит еще CD-диск с драйверами. Без особой надежды смотрю что на нем есть — точно, не позаботились. Поиск в интернете вывел меня на сайт производителя, но там есть линукс драйвер только для ревизии устройства v4, а у меня на руках была v5.21. И к тому же под очень старые версии ядра 2.6-3.16. Обескураженый неудачей уже в самом начале я уж подумал, что надо было брать TL-WN727N (он чуток подороже и умеет в 300Mbps против 150 у моего, но это как оказалось для малинки вообще значения не имеет, об этом будет написано далее). Но и самое главное драйвера под него уже есть и ставятся просто пакетом firmware-ralink. Посмотреть ревизию устройства обычно можно на корпусе устройства на наклейке рядом с серийным номером.
Дальнейшее гугление и посещение разных форумов особо ничего хорошего не принесло. Видимо никто до меня такой именно адаптер подключать на линукс не пробовал. Мда, везет мне как утопленнику.
Хотя нет, вру, посещение форумов(в основном англоязычных) тоже дало свои плоды, в некоторых топиках мелькало упоминание некого господина lwfinger, который славится тем, что написал некоторое количество драйверов для вайфай адаптеров. Его гит репозиторий в конце статьи в ссылках. И второй урок какой я усвоил — нужно идентифицировать свое устройство, чтобы понять какой драйвер для него может подойти.
Часть 1. Идентификация Борна
При включении устройства в порт никакой светодиод конечно не загорелся. И вообще никаким образом не понятно работает что-то или нет.
Первым делом для выяснения видит ли ядро наш девайс заглядываю в 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. Превосходство Борна
Качаю исходники драйвера из гита.
Настало время переустановить шиндоус заняться тем, с чем обычно связывают линуксоидов — сборкой чего-то из сорцов. Сборка драйверов как оказалось мало отличается от компиляции программ:
но для компиляции модулей ядра нам нужны заголовочные файлы ядра для нашей конкретной версии.
В стоковом репозитории есть пакет raspberrypi-kernel-headers, но он содержит версию файлов для ядра 4.19.66-v7l+, и это нам не подходит. Но для получения заголовков нужной версии как выяснилось есть удобная тулза rpi-source (ссылка в конце на гитхабе), с помощью которой можно скачать нужные заголовки. Клонируем репозиторий, делаем скрипт исполняемым, запускаем. Первый запуск валится с ошибкой — нет утилиты bc. К счастью она есть в репозитории и мы ее просто устанавливаем.
После этого повторный запуск и скачивание заголовков(и потом настройка чего-то, сейчас уже не помню) занимает некоторое время и можно откинуться на спинку стула виндоус стала лучше во всех ее проявлениях.
После того как все заголовки скачались, проверяем что появился каталог /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
Подготовительный этап пройден, можно приступать к сборке. Сборка модулей занимает опять определенное время, малинка зверь не быстрый(камень у нее 32bit 900Mhz Cortex ARM v7).
Итак, все скомпилировалось. Инсталлируем драйвер 2м шагом (make install), при этом же происходит копирование еще файлов firmware, необходимых для работы драйвера:
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 $ 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 ===*/ , /* 8188EUS */ , /* 8188ETV */ /*=== Customer /****** 8188EUS ********/ , /* Abocom - Abocom */ , /* Sitecom N150 v2 */ , /* DLink DWA-125 REV D1 */ , /* Dlink DWA-123 REV D1 */ , /* DLink GO-USB-N150 REV B1 */ , /* D-Link DWA-121 rev B1 */ , /* Elecom WDC-150SU2M */ , /* TP-Link TL-WN722N v2 */ , /* 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:"" 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
Бонус для тех кто дочитал до конца
Помните как я говорил, что не важно какая максимальная скорость заявлена на вашем адаптере?
Так вот, на малинке(до выхода модели 4) все устройства(в том числе и ethernet адаптер) сидят на одной шине usb. Здорово, правда? И поэтому пропускная способность шины usb делится между всеми устройствами на ней. При замере скорости и через ethernet, и через usb wi-fi (подключенные к 1 роутеру) и по воздуху, и по проводу выдавало в районе 20Мбит/с.
P.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. Предложеный патч для device id был принят в мейнстрим ветку репозитория lwfinger/rtl8188eu.
How to setup a RTL881cu USB Wifi adapter with the Raspberry Pi 4
Despite the Raspberry Pi 4 having built-in dual-band WiFi, many of our customers choose to purchase Dual-band USB WiFi adapters to improve their range or locate the ariel on an enclosure or similar.
Whilst many USB WiFi adapters are supported by drivers already installed within the Raspberry Pi OS, some newer drivers require manual setup.
Both of our dual-band WiFi adapters use the RTL881cu driver, and here’s how you can get them working on a Raspberry Pi 4.
Setting up a RTL881cu USB Wifi adapter with the Raspberry Pi 4
Turn your Raspberry Pi on, connect to WiFi, open a new terminal window and follow the steps below. Don’t plug the USB adapter in yet!
1. Update your Raspberry Pi
Make sure your Raspberry Pi is up to date before beginning, by using the following commands:
sudo apt-get update
sudo apt-get upgrade
2. Install the required software
You may already have the following packages installed, however it’s best to check. Enter the following commands in your terminal window:
sudo apt install git
sudo apt install bc
sudo apt-get install dkms
3. Create a directory
Create a new directory for the driver by using the following command:
mkdir usbwifi
4. Access the directory
Access your new directory using the following command:
5. Download the repository
We’ll be using a github repository for this install, which includes the driver we need. Enter the following command:
git clone https://github.com/whitebatman2/rtl8821CU
6. Access the downloaded repository
Enter the following command to access the downloaded driver repository:
cd rtl8821CU
7. Edit the driver before installing
We need to amend one of the install files to ensure the driver will work for the Raspberry Pi 4 (or 3). This is also described in the GitHub repo.
Enter the following command to open the file for editing:
sudo nano Makefile
If you’re using a Raspberry Pi 4, you need to ensure the following lines are set correctly with y/n as per below:
CONFIG_PLATFORM_I386_PC = n CONFIG_PLATFORM_ARM_RPI = y CONFIG_PLATFORM_ARM_RPI3 = n
Once you’ve made those changes, hit ctrl + X and select ‘y‘ to save the changes
8. Install the driver
Enter the following commands to install the driver. This part can take a few minutes so allow each command run:
(note: if it looks like the install gets stuck here after a few minutes, hit enter and see if the terminal moves on)
sudo make install
sudo modprobe 8821cu
9. Plug in the adapter
Once the install is complete, plug the adapter in to a USB port. If you now click on the WiFi icon, you should see both the internal (wlan0) wifi interface available, and the USB (wlan1) interface next to it.