- Точка доступа на Orange Pi
- DiyTronic
- Получаем проблему
- Альтернативные драйвера
- Анализируем ошибки
- Linux и firmware
- Что не так в нашем случае
- Задаём код региона
- CRDA (central regulatory domain agent)
- cfg80211
- clm_blob
- И что таки делать?
- Всё чудесатее и чудесатее
- Я сдаюсь
- Итого
- Ссылки
- Add a Wi-Fi Connection #
- Method 2: nmcli #
- 1: list wireless networks #
- Connect to network (without password) #
- Connect to network (with password) #
Точка доступа на Orange Pi
Рассмотрим как можно сделать беспроводную точку доступа на Orange Pi. Для такой реализации воспользуемся апельсинкой серии PC, картой памяти Micro SD на 32 Гб (конечно, достаточно будет и четырехгиговой), и USB-ишным Wi-Fi адаптером от производителя TP-Link. Хочу заметить, что не каждый может заработать сразу из коробки. Также понадобится источник питания на 5V 2A.
Подготовив все необходимые элементы, на SD-ешку следует записать операционную систему Armbian (скаченную с официального сайта ), например, с помощью программы Etcher.
Затем в Orange Pi устанавливаем карту памяти, подключаем сетевой кабель приходящего интернета в одноплатник, потом запитываем плату. На компьютере, находящемся в той же локальной сети, что и апельсинка воспользовавшись программой-сканером сети, определяем IP-адрес Orange Pi. В моем случае это 192.168.1.52.
Далее, с помощью программы putty, по протоколу SSH подключаемся к плате, и при авторизации вводим логин root, а пароль 1234. Далее нужно пройти стандартные этапы конфигурации. Далее рекомендую выполнить парочку команд. Сначала apt-get update , которая обновляет информацию по репозиториям о новейших версиях пакетов. Затем с помощью apt-get upgrade установить последние версии таковых.
Завершив подготовительную часть и введя ifconfig можем видеть два сетевых интерфейса, где eth0 встроенный, а данный USB карты.
Для настройки беспроводной точки доступа воспользуемся утилитой armbian-config . В открывшемся псевдографическом режиме перехожу в Network, где выбираю hotspot. После чего идет настройка Wi-Fi адаптера, что занимает некоторое время. Затем в появившемся окне выбираю сетевой интерфейс, по которому приходит интернет на Orange Pi.
По окончании инсталляции и конфигурирования сообщается, что раздача интернета осуществляется по беспроводной сети имя которой Armbian.
Для подключения к ней нужно узнать пароль. Как вариант узнать его можно, воспользовавшись вновь утилитой armbian-config, где перейдя в Network открываем hotspot. Далее нажав edit выбираем интерфейс, (в целом я не заметил разницы между ними), на следующем шаге приводится информация о возможностях базовой и расширенной конфигурации. Выбрав основную можно сменить имя точки доступа, пароль и канал. В данном случае я оставляю все без изменения.
Как вариант, с помощью текстового редактора nano можно открыть файл располагающийся по следующему пути /etc/hostapd.conf Собственно, тут прописан не только пароль, но и такие параметры как имя, режим работ, канал, тип безопасности беспроводной сети и метод шифрования, которые при необходимости можно скорректировать.
Что касается сетевых настроек беспроводной точки доступа, то их можно произвести в файле iptables.ipv4.nat находящемся также в etc. Например, сделать, маскарадинг, мост или ограничения к определенным адресам или портам.
Воспользовавшись ресурсом speedtest проверим скорость доступа в интернет, в целом у меня она составляет порядка 40 Мб/с притом, что предоставляемая провайдером 75 Мб/с.
В заключении хочу добавить, что для реализации беспроводной точки доступа можно использовать одноплатник идущий уже с Wi-Fi, например, Orange Pi Zero.
Также узнать возможность реализации точки доступа беспроводным адаптером можно выполнив команду iw list которая должна вывести в разделе Поддерживаемые режимы интерфейса (Supported interface modes) аббревиатуру AP, т.е. точка доступа.
DiyTronic
В ходе настройки Orange Pi Zero Plus 2 H3 обнаружил, что есть конкретные проблемы с Wi-Fi. В зависимости от используемого дистрибутива Linux имеем либо негрузящайся драйвер, либо работают только первые 11 каналов Wi-Fi, а учитывая, что моих сетей там нет, это проблема, которую пришлось решать. Решение я нашёл и ниже я его вам покажу и расскажу как с этой проблемой бороться.
Итак, хотелось мне запустить эту плату именно в Armbin, но именно этот дистрибутив славился тем, что данная плата в нём Wi-Fi не поддерживала. Но мы не ищем лёгких путей и из-за какого-то там чортова драйвера менять дистрибутив для меня просто унижение. Если драйвер есть и он в принципе работает, то и в Armbian он у меня заработает. Вызов принят!
Получаем проблему
Итак, первым делом накатываем Armbian. На официальной стрaнице образа для данной платы я не нашёл, но зато нашёл где эти сборки выкладываются. В общем качаем отсюда https://fi.mirror.armbian.de/archive/orangepizeroplus2-h3/archive/. Я использовал версию bullseye. Пробовал jammy, но там ровно тоже самое.
Альтернативные драйвера
Они существуют и возможно работают.
Проблема одна — их надо качать, а сети нет. Можно конечно скачать код на другом компьютере, залить на карточку и попытаться собрать на плате, но слишком много возни и вероятно потребуется докачивать зависимости.
Анализируем ошибки
В итоге имеем условно работающий Wi-Fi из каробки с куцым списком доступных сетей и ошибки в логах при загрузке фирмвари данного драйвера.
% dmesg | grep brcm brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin failed with error -2 brcmfmac mmc1:0001:1: Falling back to sysfs fallback for: brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt failed with error -2 brcmfmac mmc1:0001:1: Falling back to sysfs fallback for: brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Mar 30 2016 11:30:56 version 7.45.77.h8.4 FWID 01-ee8a6268
Как видно оно пытается загрузить какую-то фирмварь и не может найти нужных файлов. Придётся таки разбираться, что такое firmware и как оно грузится
Linux и firmware
В общем, как выяснилось, для всяких проприетарных драйверов типа Broadcom-а у нас есть бинарные файлы (та самая firmware), которые и подгружаются родным линуксовым драйвером, чтобы всё работало как надо. Но кроме бинарника у нас есть некий конфиг, который есть ни что иное как набор переменных, которые заливаются в NVRAM драйвера.
Что не так в нашем случае
Для нашего случая всё выглядит вот так.
% ls -la /lib/firmware/brcm/*43430* ... /lib/firmware/brcm/brcmfmac43430-sdio.bin # /lib/firmware/brcm/brcmfmac43430-sdio.txt #
Но как видно из ошибки, драйвер пытается загрузить firmware из файла с суффиксом вендора устройства, то есть /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin вместо /lib/firmware/brcm/brcmfmac43430-sdio.bin . Поэтому я решил просто создать нужные симлинки.
Забегая вперёд должен отметить, что это оказалось необязательно, а эта ошибка это скорее предупреждение. Походу драйвер таки находит фирмварь и по существующим именам. Но что сделано, то сделано и как минимум убираются сообщения об ошибках при загрузке.
После исправления имеем такую картину.
% ls -la /lib/firmware/brcm/*43430* ... /lib/firmware/brcm/brcmfmac43430-sdio.bin # /lib/firmware/brcm/brcmfmac43430-sdio.txt # /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.bin -> /lib/firmware/brcm/brcmfmac43430-sdio.bin /lib/firmware/brcm/brcmfmac43430-sdio.xunlong,orangepi-zero-plus2-h3.txt -> /lib/firmware/brcm/brcmfmac43430-sdio.txt
Теперь при загрузке видим следующее
% dmesg | grep brcm brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 # brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1 # brcmfmac: brcmf_c_process_clm_blob: no clm_blob available (err=-2), device may have limited channels available brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM43430/1 wl0: Mar 30 2016 11:30:56 version 7.45.77.h8.4 FWID 01-ee8a6268
Задаём код региона
Несмотря на успешную загрузку фирмвари, нас осталась ошибка как раз насчёт ограничения каналов и фирмварь ругается на какой-то clm_blob . Это как оказалось ещё один бинарник с региональными настройками для данного драйвера. И с этими самыми настройками полная чехарда. В разное время за это дело отвечали следующие подсистемы.
CRDA (central regulatory domain agent)
С этим связаны рекоммендации поправить регион в /etc/default/crda , но нифига не работает, так как эта тема устарела с версии ядра 4.15
cfg80211
Есть так же рекоммендации передать регион драйверу Linux cfg80211, но это тоже устарело и сегодня каждый драйвер должен сам уметь разбираться с такими делами.
echo "options cfg80211 ieee80211_regdom=US" > /etc/modprobe.d/cfg80211.conf
clm_blob
Это по факту кусок базы данных, типа той, что использовалась в CRDA, но специфичный для данного драйвера. Как оказалось и этот метод устарел и вся информация уже должна содержаться в недрах драйвера. К слову я таки нашёл этот бинарь от Raspberry PI и подсунул для загрузки, но работать лучше не стало.
И что таки делать?
В итоге пришлось лезть в конфиг фирмвари и уже там я обнаружил подозрительную переменную ccode=ALL , поменяв значение которой, после перезагрузки я получил полный список Wi-Fi сетей.
#AP6212_NVRAM_V1.0_20140603 # 2.4 GHz, 20 MHz BW mode # The following parameter values are just placeholders, need to be updated. . xtalfreq=26000 nocrc=1 ag0=255 aa2g=1 ccode=ALL # extpagain2g=0 .
Но тут есть проблема — при обновлении пакета с фирмварями этот файл будет перезаписываться.
Всё чудесатее и чудесатее
Гугля по теме обнаружил ссылки на исходники с такими комментариями
/* In some cases the EFI-var stored nvram contains "ccode=ALL" or * "ccode=XV" to specify "worldwide" compatible settings. ccode=ALL is * not understood by the firmware and some of the firmware files in * linux-firmware support only 2.4 GHz and not 5 GHz when ccode=XV. */
Так, что видимо стоит попробовать вместо RU использовать XV. Возможно даже появится диапазон 5ГГц.
Я сдаюсь
Кроме всего прочего искал способ прописать ccode в драйвер через /proc или /sys.
Декомпилировал devicetree в надежде найти там способ перезаписать значения NVRAM.
Все тщетно. Походу эти фирмвари и драйвера для Broadcom писались через жопу, на скорую руку и всё, что нам остаётся это грязно патчить через подмену значения в этом текстовом конфиге.
Итого
Как оказалось в принципе по минимуму достаточно поменять ccode=ALL на ccode=RU в конфиге фирмвари драйвера.
И видимо в автозагрузку придётся добавить скрипт для замены ccode в нужном файле.
Ссылки
Add a Wi-Fi Connection #
The nmtui tool, or NetworkManager Text User Interface , is a component of NetworkManager, and can be used (in a TUI style) to add and select a Wi-Fi network. Nmtui is, however, also capable of managing other types of networks, and depending on your circumstances may not be the best option. This leads is to…
Method 2: nmcli #
nmcli , like nmtui , is a component of networkmanager, and has the same features.
To connect to a wireless network, follow these instructions:
1: list wireless networks #
To show a list of Wi-Fi networks, at a sudo-enabled terminal, enter:
sudo nmcli device wifi list
The output should look like this:
* SSID MODE CHAN RATE SIGNAL BARS SECURITY * Orange-Pi-wifi Infra 11 54 Mbit/s 100 ▂▄▆█ -- A13-Wifi Infra 6 54 Mbit/s 30 ▂___ WPA1 WPA2 2WIRE533 Infra 10 54 Mbit/s 44 ▂▄__ WPA1 WPA2
Connect to network (without password) #
If your network does not require a password (I.E. is not secure), you can connect to it with the following command:
sudo nmcli device wifi connect 'WiFINetworkName' ifname wlan0
Give it a few seconds to connect, then verify your connectivity with:
ip -br address show dev wlan0
Connect to network (with password) #
However, if your network does require a password (as most should), you may connect to it with the following command, replacing WiFiNetworkName and WiFiNetworkPass with your network name and password, respectively:
sudo nmcli device wifi connect 'WiFiNetworkName' password 'WifiPass' ifname wlan0
Please do keep in mind that you will not receive feedback while typing the password component of the above command, for security reasons.
Once again, verify your connectivity with:
ip -br address show dev wlan0