Настройка китайского usb-wifi для beaglebone
В данной статье рассмотрим способ подключения вайфай модуля к линукс устройству на базе биглбон.
Статья рассчитана на продвинутых линукс-пользователей и людей, привыкших к красноглазию :) Целью является создание устройства, автономного от стационарного ПК и имеющего выход в интернет, веб-сервер, консоль через интернет и прочее
Вайфай адаптер был заказан из китая с за 150 рублей. В комплекте с адаптером шел диск с драйверами под Windows, и папкой с исходными кодами для самостоятельной сборки. Заглядывая вперед, отмечу, что драйвер адаптирован под адаптер китайскими (тайваньскими) инженерами с разной степенью колхозности и, с одной стороны, имеет неплохую кросс-платформенную поддержку, с другой стороны, довольно много адаптации сделано "на коленке", и многое приходится делать самому. Самые проблемные места на мой взгляд, это отличие conifg файла по названию с модулем ядра и не такое простое отключение крайне неудобной дебаг информации.
Далее будет считать, что пользователь скачал кросс-компиятор, ядро и прочее необходимое для сборки ядра и модулей для биглбон (все можно найти на сайте производителя, версию linux взял не angstrom, а arago, как с завода).
Копируем папку с исходными текстами в рабочую папку, запоминаем путь.
В файле README_STA_usb в папке с исходными кодами неплохая инструкция по сборке модуля ядра для поддержки usb wi-fi. Рекомендую собрать сначала под х86 платформу и проверить работу модуля на сборочном компьютере, только потом приступать к кросс-компиляции.
В разделе ридми файла находим строчку Build Instructions, знакомимся с правилами сборки модуля.
Далее рекомендуется модернизировать мейкфайл в корне директории под свою архитектуру и кросс-компилятор.
Мне больше всего понравилось PLATFORM = MSTARTV, потому как использует простой знакомый кросс-комиплятор от CodeSourcery. Все же модернизируем под нашу систему. Находим строчки и прописываем свои пути (к кросс-компилятору и ядру):
было
ifeq ($(PLATFORM),MSTARTV)
LINUX_SRC = /WIDI-SDK/WIDI_MSTAR/RedLion/2.6.35.11
CROSS_COMPILE = /WIDI-SDK/WIDI_MSTAR/arm-2010.09/bin/arm-none-linux-gnueabi-
endif
стало
ifeq ($(PLATFORM),MSTARTV)
LINUX_SRC = /home/grabelu/ti-sdk-am335x-evm-05.03.00.00/board-support/linux-3.0+3.1-rc8-psp04.06.00.02.sdk-psp04.06.00.02.sdk
CROSS_COMPILE = /home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi-
endif
Разумеется вместо моей рабочей папки надо прописать свою.
Для сборки модуля usb wifi необходимо либо иметь исходные коды ярда, либо собрать ядро из исходных кодов. В моем случае пришлось собирать ядро. Заходим в /board-support/linux-.... и собираем ядро в нужной или дефолтной конфигурации. Архитектура ARCH=arm
~/ti-sdk-am335x-evm-05.03.00.00/board-support/linux-3.0+3.1-rc8-psp04.06.00.02.sdk-psp04.06.00.02.sdk
make ARCH=arm CROSS_COMPILE=/home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi- tisdk_am335x-evm_defconfig
~/ti-sdk-am335x-evm-05.03.00.00/board-support/linux-3.0+3.1-rc8-psp04.06.00.02.sdk-psp04.06.00.02.sdk
make ARCH=arm CROSS_COMPILE=/home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi- menuconfig
Далее в настройках менюконфига надо поставить галочку
device drivers->network device support->wireless lan-> IEEE 802.01 enable
собрать ядро
make ARCH=arm CROSS_COMPILE=/home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi-
Залить новое ядро на sd карту в boot раздел
/home/grabelu/ti-sdk-am335x-evm-05.03.00.00/board-support/linux-3.0+3.1-rc8-psp04.06.00.02.sdk-psp04.06.00.02.sdk/arch/arm/boot
Далее в папке исходников usb-wifi собираем
make ARCH=arm
скопировать на sd карту и записать в /etc/Wireless/RT2870STA/RT2870STA.dat из папки с исходным кодом wifi адаптера:
mkdir /etc/Wireless/
mkdir /etc/Wireless/RT2870STA
cp /media/mmcblk0p3/RT2870STA.data /etc/Wireless/RT2870STA
Записать на sd карту модуль mt7601Usta.ko, сделать
insmode /media/mmcblk0p3/mt7601Usta.ko
Попробовать
ifconfig ra0 up
Мы собрали драйвер для поддержки вайфай модуля. Теперь надо запустить средства настройки вайфай сетей на биглбоне, т.е. wireless-tools.
Вариантов два, либо даем на бигл проводное сетевое соединение, настраиваем opkg и устанавливаем из репозиториев, либо собираем из исходников. Красноглазие до конца! Да и тот редкий случай, когда быстрее собрать из исходников. Скачиваем например тут http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz или еще где.
Открываем readme, читаем, потом открываем makefile и правим пути компилятора:
было
## Compiler to use (modify this for cross compile).
CC = gcc
## Other tools you need to modify for cross compile (static lib only).
AR = ar
RANLIB = ranlib
стало:
## Compiler to use (modify this for cross compile).
CC = /home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi-gcc
## Other tools you need to modify for cross compile (static lib only).
AR = /home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi-ar
RANLIB = /home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi-ranlib
Также правим на Y статическую сборку для встраиваемых систем
## Uncomment this to build tools using static version of the library.
## Mostly useful for embedded platforms without ldd, or to create
## a local version (non-root).
BUILD_STATIC = y
И путь куда компилировать утилиты
## Installation directory. By default, go in /usr/local.
## Distributions should probably use /, but they probably know better...
ifndef PREFIX
PREFIX = /home/grabelu/wireless_tools.29/beagle
endif
далее make и make install
перекинуть папку beagle на sd карту
cp -r /media/mmcblk0p3/beagle/sbin/ /
cp -r /media/mmcblk0p3/beagle/lib/ /
cp -r /media/mmcblk0p3/beagle/include/ /usr/
Проверяем iwconfig на бигле
Далее настраиваем вайфай соединение
insmode /media/mmcblk0p3/mt7601Usta.ko
wpa_passphrase [YOUR NETWORK NAME] [YOUR PASS] > /etc/wpa_supplicant.conf
wpa_supplicant -B -D wext -i ra0 -c /etc/wpa_supplicant.conf
udhcpc -i ra0
Должно работать!
Если вы добрались до этого пункта, то наверное заметили, что драйвер прямо сыпет сообщениями ядра, причем так, что консолью пользоваться невозможно. Китайцы в модулях поставили по дефолту дебаг режим, что нам не всегда удобно. Как избавиться от надоедливого сообщения RtmpUSBNullFrameKickout и прочих. После сборки модуля wifi очень много ненужного рядовому юзеру инфы дает DBGPRINT. Чтобы убрать дебаг режим, необходимо пересобрать модуль ядра для поддержки работы с вайфаем (по сути заново первый пункт с другими опциями). Заходим в папку с исходными текстами модуля ядра для usb wifi и модернизируем исходные коды
В os/linux/conifg.mk
убираем ключ -DDBG
# config for STA mode
ifeq ($(RT28xx_MODE),STA)
WFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT #-DDBG
и
ifeq ($(HAS_BGFP_SUPPORT),y)
#WFLAGS += -DBG_FT_SUPPORT
endif
ifeq ($(HAS_BGFP_OPEN_SUPPORT),y)
#WFLAGS += -DBG_FT_OPEN_SUPPORT
endif
Убрать дебаг функции, иначе функция RTMP_STA_IoctlHandle будет их вызывать в качестве команд (кто-то забыл поставить условную компиляцию). Простейший способ сделать так: в файле sta/sta_cfg.c
#include "rt_config.h"
#ifndef DBG
VOID RTMPIoctlMAC(IN RTMP_ADAPTER *pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq){}
VOID RTMPIoctlE2PROM (IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq) {}
VOID RTMPIoctlRF(IN PRTMP_ADAPTER pAdapter, IN RTMP_IOCTL_INPUT_STRUCT *wrq) {}
#endif // DBG
Далее можно включить автозагрузку модуля усб-вайфай при старте и сделать автоконнект к роутеру при включении платы. чтобы далее работать исключительно по ssh и кинуть биглбон в какой-нибудь дальний угол :) Также можно поднять сервер на биглбоне (например lighttpd уже установлен в араго и закидывая в папку /var/www/index.html можно поднять сайт на биглбоне). Чтобы сайт был виден во всем интернете с любого устройства, необходимо пробросить порты на роутере к биглбону, получить на роутере статический ip (обычно стоит денег), либо включить динамический ip (необходимо активировать у провайдера) и подтянуть к роутеру сервис типо noip.com, но это уже отдельная тема.
Чтобы сделать скрипт автозагрузки и автоконнекта wifi надо создать скрипт wifi_start.sh и прописать его в загрузки
Отдельно стоит сказать про питание. Пару дней мучалася с разными сборками ядра, бил в бубен, ну и занимался прочими вещами, и как полагается забыл о главном, о питании. Очевидно, что usb-wifi сам по себе потребялет прилично, как и биглбон, поэтому будет недостаточно питания от USB, необходимо еще внешнее питание 5 вольт через разъем от сетевого источника.
Без питания ядро при включении вайфай и dhcp сваливалось в ошибку, причем не регулярно, что значительно осложняло поиск проблемы :)
Оффтоп про сборку ядра (необходимо, чтобы сгенерировать исходные коды ядра для сборки usb-wfi модуля ядра)
Сборка ядра
make ARCH=arm tisdk_am335x-evm_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=/home/grabelu/ti-sdk-am335x-evm-05.03.00.00/linux-devkit/bin/arm-arago-linux-gnueabi- uImage
Если ядро при установке модуля сваливается в ошибку или kernel panic, то вероятнее всего не включена поддержка стандарта 802.11g (для сборки без debug сообщений). Если дебаг включен, то будет просто куча мусора и ошибка, но система продолжит жить на биглбоне.
----------
Команды на включение wifi
insmode /media/mmcblk0p3/mt7601Usta.ko
wpa_passphrase [YOUR NETWORK NAME] [YOUR PASS] > /etc/wpa_supplicant.conf
wpa_supplicant -B -D wext -i ra0 -c /etc/wpa_supplicant.conf
udhcpc -i ra0
Добавление скрипта автозагрузки wifi
Делаем скрипт rc4
#!/bin/sh
insmod /home/root/mt7601Usta.ko
wpa_supplicant -B -D wext -i ra0 -c /etc/wpa_supplicant.comf
udhcpc -i ra0
копируем его в директорию /etc/init.d/
chmod a+x /etc/init.d/rc4
update-rc.d rc4 defaults
Пробуем
/etc/init.d/rc4 restart
reboot
Если необходимо удалить скрипт
update-rc.d -f remove