Linux маршрутизатор на чипсете ADM5120

Оригинал: vlad.org.ua
Автор: Vladislav Moskovets (Владислав Московец)

Список содержимого

Отказ от ответственности

Автор не несет никакой ответсвенности, за Ваши действия или бездействия, за физический, финансовый, моральный или любой другой ущерб. Помните, вскрывая рассмотренный в этой статье маршрутизатор, Вы лишаетесь гарантии.
Статья не является пошаговым руководством: Вы должны понимать, что Вы делаете.

Введение

Недавно ко мне в руки попало устройство Edimax BR-6104K (а позже и Edimax BR-6104KP)
Данное устройство представляет собой маршрутизатор, размером с маленький 8-ми портовый switch

Возможности

Маршрутизатор имеет flash память объемом 2М и SDRAM память объемом 16М
Но самое интересное, что операционной системой устройства является Linux. Эта мысль у меня возникла при ознакомлении с его возможностями, и подтвердилась после внимательного изучения его прошивки.
Точно такое же устройство изготавливает компания Sweex (Sweex LB000021), и говорят, что платы Edimax и Sweex отличить друг от друга невозможно (прошивки отличаются только логотипами).

Существуют модификации


Фото

Внешний вид BR-6104K Вид внутри BR-6104K
Внешний вид BR-6104K Вид внутри BR-6104K


Web Интерфейс

Основные возможности

Общий доступ

Функция NAT/NATP позволит организовать общий доступ к одному широкополосному подключению (через кабельный или ADSL-модем). Возможна одновременная работа до 253 пользователей. Маршрутизатор обеспечивает функцию DMZ для осуществления доступа из интернет к серверам, расположенным во внутренней сети.

Поддержка специальных приложений

Маршрутизатор позволяет использовать специальные приложения (H.323, IRC, MSN, MMS, PPTP, Quake3, starcraft, tftp и другие).

Межсетевой экран

Межсетевой экран SPI (Stateful Packet Inspection) защитит вашу внутреннюю сеть от несанкционированного доступа и различного рода DoS-атак (атаки типа “Отказ в обслуживании”), а также сразу оповестит вас об этом по электронной почте. С его помощью вы также можете контролировать доступ к интернет из внутренней сети.

Поддержка виртуальных серверов и DMZ

Функция поддержки виртуальных серверов и DMZ обеспечит доступ из интернет к ресурсам ваших серверов, расположенных во внутренней сети.

Поддержка UPnP

Функция UPnP поможет быстро настроить маршрутизатор.

DHCP

Встроенный сервер DHCP даст возможность клиентам из внутренней сети получать сетевые параметры автоматически.

Настройка через web-интерфейс

Вы можете легко настроить маршрутизатор через обычный веб-браузер.

Варианты использования

Конечно на 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 и форум, где владельцы маршрутизаторов исправляют ошибки допущенные производителем.

Теперь, если Вы заинтересовались этим устройством, то Вы можете:

  1. Использовать роутер без изменений
    • Для обычных пользователей подключенных через xDSL модем - то, что доктор прописал.
  2. Использовать ядро и ramdisk от производителя изменяя под свои нужды скрипты/бинари, для этого Вам потребуется:
    • Изучить структуру прошивки, научится разбирать и собирать ramdisk
    • Подключить консольный кабель - получить доступ к консоли
    • Установить MIPS toolchain
  3. Использовать самосборное ядро и самосборный ramdisk, для этого Вам потребуется:
    • Тоже что и в предыдущем пункте
    • Скачать, собрать, установить ядро, buildroot ;)
  4. Полностью пересобрать родную прошивку
  5. Через web интерфейс залить прошивку root система которой находится на первом разделе USB Flash диска.
    • плюс: Это ‘живая’ система, с изменяемой в любой момент конфигуруцией, а не ramdisk.
    • плюс: не требуется вскрывать роутер, чтобы подключиться через RS232 порт
    • плюс: в любой момент можно изменить файловую систему на настольном компьютере

Поделюсь заметками и рекомендациями:

Различная информация

Hardware

Данный маршрутизатор построен на чипе ADM5120 фирмы AdmTek (Infineon) который представляет собой высокопроизводительную и очень гибкий систему System On Chip (SOC) которая может использоваться для SOHO Gateway, NAT роутер, принт сервер, точки доступа WLAN, VPN шлюза, ядром VoIP шлюза

Внутри себя этот чип содержит высокопроизводительный процессор 175 MHz/227 MIPS, сетевую подсистему, switch engine, поддержку PCI, USB, UART

Структурная схема Фотография

Сетевая подсистема

Содержит 6 портов и обладает следующими возможностями:

Встроенный switch engine

Memory interface

SDRAM

Flash

System

и все это удовольствие за ~$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 контактами.

USB порт

Jeroen Domburg написал прекрасное HOWTO по установке компонентов для поддержки USB.

JTAG порт

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

/dev/mtd

Блочное устройство, предоставляющее доступ к flash памяти. Крайне не советую что-либо записывать в диапазон 0x000000 - 0x008000, иначе велика вероятность превратить маршрутизатор в кирпич.

/dev/switch

Кнопка reset. В цикле опрашивается скриптом monitor.sh, в случае нажатия делает reboot

/dev/led0

Светодиод питания.

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
/dev/led_wlan

неизвестно, возможно светодиод WLAN

/dev/ttyS0, /dev/console

консоль

Структура Flash памяти

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.

Структура официальной прошивки

Прошивки от Edimax и Sweex (версий 2.65/2.75) имееют следующий формат

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 | | | | | | | | | | | +--------------------+ + +--------------------+
''CSYS header''

Это заголовок длиной 12 байт: ‘C’ ‘S’ ‘Y’ ‘S’ 0x00 0x00 0x50 0x80 0x1a 0x3f 0x1b 0x00 Последние 4 байта содержат длину файла vmlinux.bin.gz, в нашем случае это 0x1b3f1a (1785626) байт.

''vmlinux.bin''

(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 (я так и не понял зачем он нужен), и без главного заголовка.

boot

При загрузке, на консоле появляется следующее сообщение:

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 :

Протокол передачи - 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 toolchain

Для того, чтобы иметь возможность собирать программы под MIPS архитектуру, Вам необходим кросс-компилятор и собранная uclibc4) для этой архитектуры. Есть 4 способа использовать MIPS toolchain:

  1. Скачать и установить готовый пакет ( см Ссылки )
  2. Скачать и собрать ‘вручную’ gcc и uclibc для платформы MIPS
  3. Использовать собранный MIPS toolchain из собранного buildroot
  4. Если у Вас замечательный дистрибутив Debian, то рекомендую использовать пакет toolchain-source ( см Ссылки )

Я использую третий способ, так как все равно использую buildroot.
При использовании USB накопителей можно использовать и более тяжеловесный (но стандартный) вариант библиотеки C - glibc

buildroot

Buildroot - замечательный пакет, являющийся частью проекта uClibc специально предназначенный для сборки ramdisk’ов для встроенных и микро систем. Именно то, что нам необходимо!
Задачи buildroot:

При первом построении buildroot загрузит с сети необходимые компоненты для построения (gcc, binutils, etc), а далее те пакеты которые Вы выбрали в TARGETS. Отмечу, что список пакетов, которые buildroot собирает простым добавлением в достаточно велик, перечислю некоторые:


Написать Makefile для другого пакета большой сложности не составляет.

Настройка и сборка buildroot крайне проста:


Небольшое описание структуры каталогов buildroot:


Для конфигурации busybox:

cd build_mipsel/busybox/ make menuconfig cp .config ../../sources/busybox.config cd -

Аналогичная процедура для uClibc.config

kernel

Процесс компиляции ядра мало чем отличается от компиляции для платформы 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.gz5) и установить [*] Embed root filesystem ramdisk into the kernel в меню конфигурации ядра.
Подробности см. в arch/mips/ramdisk/Makefile

Ссылки

NoRocketScience Forum
http://vlad.org.ua/adm5120/firmware/

Компании и устройства

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

Crosscompile

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/

Kernel & firmware sources

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
Буду рад любым замечаниям, конструктивной критике, предложениям, дополнительной информации.

1) только в BGA корпусе
2) только в BGA корпусе
3) PQFP has 4 GPIO pins v.s. BGA has 8 pins
4) uClibc - библиотека языка C, оптимизированная для микроконтроллеров и embedded систем.
5) может отличаться