Настройка китайского usb-wifi для beaglebone

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