Привет, Хабр! Однажды я решил подключить свою малину к Интернету по воздуху.
Сказано-сделано, для этой цели я приобрел в ближайшем магазине usb wi-fi свисток известной компании TP-Link. Скажу сразу, это не какой-то нано usb модуль, а довольно большое устройство, размером примерно с обычную флешку (или, если хотите, с указательный палец взрослого мужчины).
Перед покупкой я немного изучил список поддерживаемых производителей свистков для RPI и в списке был TP-Link (однако, как выяснилось позже, я не учел тонкостей, ибо черт, как мы знаем , в деталях).
Итак, начинается холодный рассказ о моих злоключениях; представляем вашему вниманию детективную историю в 3-х частях.
Для тех, кто заинтересован, пожалуйста, обратитесь к кат. Статья Подключение Wi-Fi-адаптера WN727N к Ubuntu/Mint Частично мне это помогло, но обо всём по порядку.
Условия задачи
Данный:- одноплатный компьютер Raspberry Pi 2 B v1.1 — 1 шт.
- USB Wi-Fi свисток WN727N - 1 шт.
- пара не совсем кривых рук – 2 шт.
- В качестве ОС установлена последняя версия Raspbian (на базе Debian 10 Buster).
- версия ядра 4.19.73-v7+
Совместимость системы: Windows 10/8/7/XP (хоть небо, хоть XP) и MacOS 10.9-10.13.Хм, как обычно, ни слова о Linux. Это была 2к19, а драйвера всё равно нужно было собирать вручную.
У нас было с собой 2 компилятора, 75 тысяч библиотек, пять бинарных блобов, полмассива голых женщин с логотипом и целое море заголовков всех языков и разметок.В общем, как вы понимаете, возиться с usb wi-fi в линуксе - это больно и несколько безвкусно (как русские суши).Не то чтобы это необходимый набор для работы.
Но как только начинаешь собирать систему для себя, остановиться становится сложно.
Единственное, что вызвало у меня беспокойство, это драйвера на вай-фай.
Нет ничего более беспомощного, безответственного и коррумпированного, чем сборка драйверов из исходного кода.
Но я знал, что рано или поздно мы перейдём на эту дрянь.
В коробке также находится диск с драйверами.
Без особой надежды смотрю, что на нем - точно не позаботились.
Поиск в Интернете привел меня на сайт производителя, но там есть драйвер для Linux только для ревизии устройства.
v4 , и в моих объятиях был v5.21 .
И притом для очень старых версий ядра 2.6-3.16. Обескураженный неудачей в самом начале, я уже подумал, что надо было брать TL-WN727N (он немного дороже и справляется со скоростью 300Мбит/с против 150 у моего, но как оказалось, это совершенно не важно про малину об этом будет написано позже).
Но самое главное, что драйвера для него уже существуют и просто устанавливаются пакетом.
прошивка-ralink .
Обычно версию устройства можно увидеть на корпусе устройства на наклейке рядом с серийным номером.
Дальнейшее гугление и посещение различных форумов особой пользы не принесли.
Видимо никто до меня не пробовал подключить такой адаптер к Linux. Хм, мне повезло, как утопленнику.
Хотя нет, вру, посещение форумов (в основном англоязычных) тоже принесло свои плоды; в некоторых темах было упоминание о неком господине lwfinger, который известен тем, что написал ряд драйверов для Wi-Fi адаптеров.
Его git-репозиторий находится в конце статьи по ссылкам.
И второй урок, который я усвоил, заключается в том, что вам необходимо идентифицировать свое устройство, чтобы понять, какой драйвер может к нему подойти.
Часть 1: Идентичность Борна
При подключении устройства к порту, естественно, ни один светодиод не загорелся.И вообще никак не понятно, работает что-то или нет. Первым делом, чтобы узнать видит ли ядро наше устройство, я смотрю в dmesg:
Оказалось, что видит, и даже видно, что на шине usb стоит чип Realtek и VID/PID самого устройства.[ 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
Пойдем дальше и посмотрим 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
Система не знает, что это за устройство, и стыдливо показывает вместо названия пустое место (хотя вендор=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: Превосходство Борна
Я скачиваю исходники драйверов с Git. Пришло время переустановить Windows и заняться тем, с чем обычно ассоциируются пользователи Linux — сборкой чего-то из каких-то подобий.
Сборка драйверов, как оказалось, мало чем отличается от компиляции программ: make
sudo make install
но для компиляции модулей ядра нам нужны файлы заголовков ядра для нашей конкретной версии.
В стоковом репозитории есть пакет raspberrypi-kernel-заголовки , но он содержит версию ядра файлов 4.19.66-v7l+ , и это нас не устраивает. Но чтобы получить заголовки нужной версии, как оказалось, есть удобный инструмент RPI-источник (ссылка в конце на Github), с помощью которой можно скачать необходимые заголовки.
Клонируем репозиторий, делаем скрипт исполняемым и запускаем его.
Первый запуск завершается с ошибкой - утилиты нет До нашей эры .
К счастью, он есть в репозитории и мы его просто устанавливаем.
sudo apt-get install bc
После этого перезапуск и загрузка шапок (а потом что-то настройка, сейчас уже не помню) занимает какое-то время и можно сидеть поудобнее в кресле, винда стала лучше во всех своих проявлениях.
После того, как все заголовки скачаны, проверьте, появился ли каталог /lib/модули/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-битный 900 МГц Cortex ARM v7).
Итак все собралось.
Устанавливаем драйвер на 2-м шаге (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/.
Часть 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
Бонус для тех, кто дочитал до конца
Помните, я говорил, что не имеет значения, какая максимальная скорость указана на вашем адаптере? Итак, на Малинке (до выхода модели 4) все устройства (включая Ethernet-адаптер) сидят на одной и той же usb-шине.Отлично, правда? И поэтому пропускная способность шины USB делится между всеми устройствами на ней.
При замере скорости как через ethernet, так и через usb wi-fi (подключен к 1 роутеру) как по воздуху, так и по проводу было в районе 20Мбит/с.
P.S. В общем, данное руководство по составлению драйвера именно для этого адаптера справедливо не только для RPI. Я потом повторил это на своем десктопе с Linux Mint — там тоже все заработало.
Вам просто нужно таким же способом скачать необходимые заголовочные файлы для вашей версии ядра.
УПД.
Знающие люди подсказали: чтобы не зависеть от версии ядра, нужно собирать и устанавливать драйвера с помощью 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
УПД2. Предложенный пластырь для идентификатора устройства был принят в основную ветку репозитория lwfinger/rtl8188eu.
Ссылки
— USB-адаптеры Wi-Fi RPi
— Gitbub lwfinger/rtl8188eu
— usb.ids
— RPI-источник
Теги: #*nix #Беспроводные технологии #Разработка Raspberry Pi #Системное администрирование #Настройка Linux #wifi #tp-link #драйвер Linux #wn727n #raspberry pi 2 model b
-
Мусониус Руф, Гай
19 Oct, 24 -
10 Заповедей Великого Покорного
19 Oct, 24 -
Как Сделать Из Мухи Слона
19 Oct, 24