Автор не несет никакой ответсвенности, за Ваши действия или бездействия, за физический, финансовый, моральный или любой другой ущерб. Помните, вскрывая рассмотренный в этой статье маршрутизатор, Вы лишаетесь гарантии.
Статья не является пошаговым руководством: Вы должны понимать, что Вы делаете.
Недавно ко мне в руки попало устройство Edimax BR-6104K (а позже и Edimax BR-6104KP)
Данное устройство представляет собой маршрутизатор, размером с маленький 8-ми портовый switch
Маршрутизатор имеет flash память объемом 2М и SDRAM память объемом 16М
Но самое интересное, что операционной системой устройства является Linux.
Эта мысль у меня возникла при ознакомлении с его возможностями, и подтвердилась после внимательного изучения его прошивки.
Точно такое же устройство изготавливает компания Sweex
(Sweex LB000021),
и говорят, что платы Edimax и Sweex отличить друг от друга невозможно (прошивки отличаются только логотипами).
Функция NAT/NATP позволит организовать общий доступ к одному широкополосному подключению (через кабельный или ADSL-модем). Возможна одновременная работа до 253 пользователей. Маршрутизатор обеспечивает функцию DMZ для осуществления доступа из интернет к серверам, расположенным во внутренней сети.
Маршрутизатор позволяет использовать специальные приложения (H.323, IRC, MSN, MMS, PPTP, Quake3, starcraft, tftp и другие).
Межсетевой экран SPI (Stateful Packet Inspection) защитит вашу внутреннюю сеть от несанкционированного доступа и различного рода DoS-атак (атаки типа “Отказ в обслуживании”), а также сразу оповестит вас об этом по электронной почте. С его помощью вы также можете контролировать доступ к интернет из внутренней сети.
Функция поддержки виртуальных серверов и DMZ обеспечит доступ из интернет к ресурсам ваших серверов, расположенных во внутренней сети.
Функция UPnP поможет быстро настроить маршрутизатор.
Встроенный сервер DHCP даст возможность клиентам из внутренней сети получать сетевые параметры автоматически.
Вы можете легко настроить маршрутизатор через обычный веб-браузер.
Конечно на 2 мегабайтах flash и 16 мегабайтах RAM памяти в модели без USB порта сильно не разгуляешься, но в умелых руках со своими технико-экономическими показателями, данное устройство может занять свою нишу. Навряд ли получится его использовать как почтовый или Web сервер, да он для этого и не предназначен.
Это маршрутизатор: без вращающихся механических элементов, с малыми габаритами, питанием 12V, пропускной способностью WAN-LAN около 25 МБит/сек. Поэтому он может быть установлен как в офисе, в квартире, так и на крыше дома.
Но! Имея USB Flash (USB-HDD) мы запросто можем превратить маршрутизатор в полноценный сервер
у меня есть друг HAM (радиолюбитель), который без ума от всевозможных интеллектуальных микроустройств, а тем более от устройств в которых стоит Linux. А тем более от устройств с Linux’ом и поддержкой AX.25. Для него скорость в 2400 по радио на расстоянии 50км верх блаженства. Ну так вот собрав ему дистрибутивчик с поддержкой AX.25, я ему доставил несказанное удовольствие.
Так как процессор довольно специфический, то Linux ядро изменено именно под него и оно относительно старое - 2.4.18.
Совсем недавно компания Edimax предоставила исходные тексты ядра для скачивания, до этого момента приходилось пользоваться или уже скомпилированным ядром из ‘родной’ прошивки, или собирать ядро предоставленное компанией OvisLink (с некоторыми ограничениями - неработает: mtd и switch).
Также есть ограничение связанное с размерами flash памяти - ее нельзя использовать как полноценную файловую систему, так как ядро с ramdisk’ом почти не оставляет свободного места (на досуге надо будет поэкперементировать с JFFS).
Чтобы обойти это ограничение, мною был написан простой скрипт, который после загрузки загружает другой скрипт, который в свою очередь обновляет систему (содержимое ramdisk’а). Также можно через определенные промежутки времени выгружать изменившиеся файлы на tftp/ftp
сервер.
Второе и более красивое решение состоит в приобретении устройства с USB портом и USB-Flash к нему. По моему опыту это наиболее безхлопотное решение, позволяющее настроить полноценный linux сервер.
Есть отличная страница http://www.norocketscience.com/router/upgrade.htm и форум, где владельцы маршрутизаторов исправляют ошибки допущенные производителем.
Теперь, если Вы заинтересовались этим устройством, то Вы можете:
root
система которой находится на первом разделе USB Flash диска.
Поделюсь заметками и рекомендациями:
Данный маршрутизатор построен на чипе ADM5120 фирмы AdmTek (Infineon)
который представляет собой высокопроизводительную и очень гибкий систему System On Chip (SOC)
которая может использоваться для SOHO Gateway, NAT роутер, принт сервер, точки доступа WLAN, VPN шлюза, ядром VoIP шлюза
Внутри себя этот чип содержит высокопроизводительный процессор 175 MHz/227 MIPS,
сетевую подсистему, switch engine, поддержку PCI, USB, UART
Структурная схема | Фотография |
---|---|
Содержит 6 портов и обладает следующими возможностями:
SDRAM
Flash
и все это удовольствие за ~$35
Консольного порта в его привычном виде нет. Для него предусмотрен разъем на плате обозначенный JP2
.
И для того, чтобы иметь доступ к консоли и возможность прошивать маршрутизатор через кабель,
Вам необходимо будет собрать переходник с ~12V (RS232) на 3.3V. Для этого потребуется микросхема MAX232
или ей подобная.
IMHO проще всего взять шнурок к мобильному телефону, обычно они все на 3.3V, но Вы это должны проверить самостоятельно.
На плате маршрутизатора имеется разъем подписанный как JP2. К нему необходимо подключать кабель согласно разводки:
JP2
2-o o o o-8
1-o o o o-7
1 - Rx
7 - Tx
8 - Gnd
Внимание: подключение COM порта напрямую к маршратизатору непременно выведет последний из строя.
Подключайтесь любой терминальной программой на скорости 115200 бит/сек, 8 бит, No parity, 1 stopbit
Tip: Консольный вход очень чувствительный к различным шумам и наводкам, поэтому, если они у
Вас появляются - проверьте кабеля, не приближайте их к источникам помех. Как вариант можно установить конденсатор 0.1 мкф между 1 и 8 контактами.
Jeroen Domburg написал прекрасное HOWTO по установке компонентов для поддержки USB.
JTAG порт предназначен для отладки, тестирования устройства. На плате он обозначен как JP1. Через него возможна чтение/запись flash/sdram памяти напрямую, но информации по этому поводу у меня нет.
1 /TRST 2 gnd
3 TDI 4 gnd
5 TDO 6 gnd
7 TMS 8 gnd
9 TCK 10 gnd
11 ??? 12 not connected
13 ??? 14 +3.3 volt
приветствуется информация по JTAG
В основном вся логика представлена набором shell
скриптов, все относительно просто.
HTTP сервером является пропатченный GoAhead WebServer, в котором находится логика работы с пользователем.
Программа /bin/flash
реализует функциональность сохранения/восстановления параметров.
Параметры предопределены и привязаны (внутри программы) к определенным областям flash памяти.
К сожалению при загрузке на консоле запускается программа требующая ввести username/password, которые известны только производителю. Поэтому, чтобы получить shell доступ, нужно как минимум прошить модифицированную прошивку
Также запускается демон diagd
слушающий TCP порт 31727, который позволяет локально устанавливать MAC адреса и количество интерфейсов, а также удаленно: получать информацию о устройстве, менять MAC адреса, устанавливать частотный диапазон WLAN, и другие функции, которые скорей всего будут включены в слудующих версиях.
Разработчиками написан модуль для ядра реализующий URL blocking, имеются файлы /proc/url_blocking_list
и /proc/trigger_port_list
Блочное устройство, предоставляющее доступ к flash памяти. Крайне не советую что-либо записывать в диапазон 0x000000 - 0x008000, иначе велика вероятность превратить маршрутизатор в кирпич.
Кнопка reset
. В цикле опрашивается скриптом monitor.sh
, в случае нажатия делает reboot
Светодиод питания.
echo "led off" > /dev/led0 # turn on
echo "led on" > /dev/led0 # turn off
echo "led blink 100" >/dev/led0 # blink with freq 0.1
неизвестно, возможно светодиод WLAN
консоль
0x000000 - 0x0004ff preamble, partition info, etc. ???
0x000500?- 0x007fff boot loader
0x008000 - 0x0083ff 'HS' section = hardware setting (ethernet MAC addresses, etc.)
0x008400 - 0x009fff 'DS' section = default config
0x00a000 - 0x00bbff 'CS' section = current config
0x00bc00 - 0x00ffff empty
0x010000 - 0x01ffff WB4K web image (webpages-6104k.bin.gz)
0x020000 - 0x1fffff CSYS system image (vmlinux.bin.bz2)
HS, DS и CS секции начинаются с 6-ти байтного заголовка:
char tag[2]; /* "HS", "DS" or "CS" */
char version[2]; /* currently HS = "01", DS = CS = "08" */
uint16_t length;
''WB4K'' и ''CSYS'' секции начинаются с 12 байтного заголовка:
char signature[4];
uint32_t startAddress;
uint32_t length;
17KB неиспользуемого места + 64KB занимаемые webpages.bin
, так что потенциально выигрываем 81KB.
V2.65 Block name V2.75
+--------------------+ 0x00 + 0x00+--------------------+
| Header | | | Header |
+--------------------+ 0x0c | 0x0c+--------------------+
| | | | |
| | | | |
| webpages-6104k.bin | webpages.bin | webpages-6104k.bin |
| gzipped | | | gzipped |
| | | | |
+--------------------+ | +--------------------+
| padding | | | padding |
+--------------------+ 0x20000 + 0x10000+--------------------+
| CSYS header | csys.bin | CSYS header |
+--------------------+ 0x2000c + 0x1000c+--------------------+
| | | | |
| | | | |
| vmlinux.bin | vmlinux.bin.gz | vmlinux.bin |
| gzipped | | | gzipped |
| | | | |
| | | | |
+--------------------+ + +--------------------+
Это заголовок длиной 12 байт: ‘C’ ‘S’ ‘Y’ ‘S’ 0x00 0x00 0x50 0x80 0x1a 0x3f 0x1b 0x00
Последние 4 байта содержат длину файла vmlinux.bin.gz
, в нашем случае это 0x1b3f1a (1785626) байт.
(unzipped) имеет следующий формат
V2.65 V2.75
+--------------------+ 0x00 + 0x00+--------------------+
| | | | |
| Kernel | kernel.bin | Kernel |
| | | | |
+--------------------+ 0x16d000 + 0x172000+--------------------+
| tmpimg.img | | | tmpimg.img |
| gzipped | --> ram image tmpimg.img.gz (bz2) | bzip2 |
| +padding | | | +padding |
+--------------------+ 0x28f000 + 0x27c000+--------------------+
Offset Length
0x00 0x20000 web pages block containing webpages-6104k.bin (gzipped)
0x20000 0x0c CSYS header
0x2000c eof kernel block containing vmlinux.bin (gzipped)
После распаковки vmlinux.bin
мы имеем 2 дополнительных блока:
Offset Length
0x00 0x16d000 kernel
0x16d000 0x122000 RAM image block containing tmpimg.img (gzipped) (RAMDISK)
Tip1: Отмечу, что ramdisk может быть сжат не gzip, а и bzip2.
Tip2: На самом деле, загрузчик ищет заголовок CSYS header
в памяти по адресам
0x10000 + n*0x10000 (где n 0,1,2).
Т.е можно располагать ядро и без webpages-6104k.bin
(я так и не понял зачем он нужен), и без
главного заголовка.
При загрузке, на консоле появляется следующее сообщение:
ADM5120 Boot:
Если нажать 3 раза пробел в течении около 1 сек, то появится загрузочное меню:
ADM5120 Boot: <--- press space 3x times
Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key :
a
предназначен для загрузки firmware
в flash. Требуется прошивка с CSYS
заголовком b
для загрузки в RAM. Передавать нужно vmlinux.bin.gz
(запакованные ядро+ramdisk)
Протокол передачи - XMODEM
Например загружаем прошивку в flash:
Создаем firmware.bin
../bin/mksyshdr csys.bin vmlinux.bin.gz
cat csys.bin vmlinux.bin.gz >firmware.bin
Upload with XMODEM
Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key : a
Downloading...........PASS
Eraseing nor flash.......PASS
Programming nor flash...PASS
Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit
Please enter your key : c
jump to linux code!!
LINUX started...
Tip: передавать следует не сразу после выбора меню, а через 5-7 сек.
Для того, чтобы иметь возможность собирать программы под MIPS архитектуру, Вам необходим кросс-компилятор и собранная uclibc4) для этой архитектуры. Есть 4 способа использовать MIPS toolchain:
gcc
и uclibc
для платформы MIPSMIPS toolchain
из собранного buildroot
toolchain-source
( см Ссылки )
Я использую третий способ, так как все равно использую buildroot.
При использовании USB накопителей можно использовать и более тяжеловесный (но стандартный) вариант библиотеки C - glibc
Buildroot - замечательный пакет, являющийся частью проекта uClibc специально предназначенный для сборки ramdisk’ов для встроенных и микро систем. Именно то, что нам необходимо!
Задачи buildroot
:
gcc
, binutils
, ccache
, etc)uclibc
, busybox
, etc)ext2
, cramfs
, jffs
)
При первом построении buildroot
загрузит с сети необходимые компоненты для построения (gcc, binutils, etc
), а далее те пакеты которые Вы выбрали в TARGETS
. Отмечу, что список пакетов, которые buildroot
собирает простым добавлением в достаточно велик, перечислю некоторые:
Написать Makefile для другого пакета большой сложности не составляет.
Настройка и сборка buildroot крайне проста:
Makefile
определяем архитектуру: ARCH:=mipsel
TARGETS
Небольшое описание структуры каталогов buildroot
:
build_mipsel/package-name/
лежат исходные тексты пакетовbuild_mipsel/root/
- готовая файловая система, которая превратится в ramdiskbuild_mipsel/staging_dir/
- скомпилированные утилиты для построенияmake/
содержит Makefile’s
для загрузки, распаковки, конфигурации, компиляции, установки. sources/
содержит патчи и конфиги.sources/dl/
содержит загруженные с сети пакеты.sources/target_skeleton/
скелет файловой системыsources/device_table.txt
файл с описанием какие каталоги, файлы, устройства, сокеты нужно создать в готовой файловой системеroot_fs_mipsel
- готовый образ файловой системы ramdisk’а
Для конфигурации busybox
:
cd build_mipsel/busybox/
make menuconfig
cp .config ../../sources/busybox.config
cd -
Аналогичная процедура для uClibc.config
Процесс компиляции ядра мало чем отличается от компиляции для платформы x86, конечно это должен быть MIPS
кросс-компилятор и ядро специально для этого чипсета.
Перед компиляцией я устанавливаю переменные окружения:
export ARCH=mips
export CC=mipsel-linux-gcc
export CPP=mipsel-linux-cpp
export CXX=mipsel-linux-g++
export AR=mipsel-linux-ar
export CXXCPP=mipsel-linux-cpp
export RANLIB=mipsel-linux-ranlib
Если использовать компиляторы из buildroot:
export PATH=/path/to/buildroot/build_mipsel/staging_dir/bin/:$PATH
Замечу, что в этом случае нет смысла вручную ‘собирать’ образ ядра с initrd
- пусть за Вас это сделает make vmlinux
. Для этого готовый ramdisk
требуется положить в arch/mips/ramdisk/ramdisk_el.gz
5) и установить [*] Embed root filesystem ramdisk into the kernel
в меню конфигурации ядра.
Подробности см. в arch/mips/ramdisk/Makefile
Infineon
Canyon CN-WF512
OvisLink компания производящяя Linux устройство MU-9000VPN - Multimedia Server + VPN Router на чипсете ADM5120
Home Media Server (64M RAM, 32M Flash, 40-80G HDD), HMS300 Datasheet
http://www.dns120-linux.org - Linux устройство на чипсете Adm5120
google search D-Link 120
Setting up a Cross Development Environment on Debian GNU/Linux
Crosscompiler HOWTO
Setting up a Cross Development Environment on and for Debian GNU/Linux
MIPS Compiling and Performance Tuning Guide
http://skaya.enix.org/wiki/ToolChain
Toolchain для RPM based дистрибутивов ftp://ftp.realitydiluted.com/linux/MIPS/toolchains/uclibc/RPMS/
http://www.canyon-tech.com/products/show.cfm/Net/Wireless_Products_IEEE_802.11g/CN-WF512/down
http://www.edimax.co.uk/download/Linux-SC.zip
http://www.edimax.nl/download/Linux-SC.zip
http://www.edimax.at/download/Linux-SC.zip
http://www.ovislink.com.tw/routerfaq.htm#5000GPL
Hacking Linux-Powered Devices
ADM5120 Product Brief
ADM5120 Datasheet
MX29LV160T MX29LV320T Flash
http://vlad.org.ua/adm5120/datasheet/
Агатис www.agatis.biz
Компании ‘Агатис’ http://www.agatis.biz , которая является официальным дистрибутором фирм SWEEX и EDIMAX в Украине. А особенно Шафаренко Дмитрию - менеджеру по сбыту
Большое спасибо Андрею Исченко и Адилю Изидинову за наводку, а также Игорю Залатову другу и “ХАМ’у”.
Vladislav Moskovets (Владислав Московец)
mail: adm5120 {at} vlad . org . ua
Буду рад любым замечаниям, конструктивной критике, предложениям, дополнительной информации.