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

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

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

Введение

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

Возможности

  • 1 WAN Ethernet порт
  • 4 LAN Ethernet порта
  • Встроенный коммутатор Fast Ethernet
  • Общий доступ с помощью NAT/NAPT
  • Межсетевой экран SPI (Stateful Packet Inspection) с защитой от DoS-атак
  • Поддержка виртуальных серверов и DMZ
  • Поддержка DDNS (DynDNS/TZO)
  • Поддержка специальных приложений (conntrack)
  • Свободное прохождение туннелей VPN (IPSec/PPTP/L2TP)
  • Получение WAN IP через PPPoE/Static IP/PPTP/DHCP/L2TP
  • Сервер DHCP
  • Поддержка UPNP
  • Возможность работы в режиме моста
  • Конфигурирование через web-интерфейс
  • Возможность получения информации о подключении к портам и работы DHCP.
  • Журнал событий
  • Возможность обновления программного обеспечения

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

На Тайване десятки фирм изготавливают OEM устройства на процессоре ADM5120, отличающиеся только корпусом. Например, точно такое же устройство изготавливает компания Sweex (Sweex LB000021). Еще одно аналогичное устройство - Planet XRT-401D. Платы Edimax, Sweex, Planet и других производителей отличить друг от друга невозможно. Существуют лишь подмодификации плат, отмеченные в левом верхнем углу как «Rev A» и «Rev B» и использующие разные чипы памяти. Прошивки отличаются только логотипами и оформлением (CSS).

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

  • BR-6104K - Маршрутизатор 1 WAN порт, 4 LAN порта (~$35)
  • BR-6104KP - Маршрутизатор 1 WAN порт, 4 LAN порта, 2 порта USB (~$45)
  • BR-6524K - Маршрутизатор 2 WAN порта, 4 LAN порта (подключение к 2 провайдерам)
  • BR-6541K - Маршрутизатор 4 WAN порта, 1 LAN порт (подключение к 4 провайдерам)

Отличие между моделями Edimax BR-6104K и BR-6104KP состоит только в наличии двух портов USB и в поддержке принтера в firmware. Причем печатные платы у обоих устройств совершенно одинаковые, только на BR-6104K не распаяны элементы USB, осциллятор на 48MHz и стабилизатор питания +5V для USB. При некоторой сноровке можно дополнить недостающие элементы и получить модель BR-6104KP. Подробная нструкция здесь. Хотя разница в цене составляет всего 10$…

Более дорогие устройства поддерживают беспроводную сеть WiFi 802.11g :

Модификации с WiFi

  • BR-6104Wg - самая первая модель с 802.11g. 1 WAN порт, 4 LAN порта, USB нет.
  • BR-6524WP - Маршрутизатор Wireless 802.11g, 2 WAN порта, 4 LAN порта, 2 порта USB (подключение к 2 провайдерам) ($158.00)
  • BR-6541WP - Маршрутизатор Wireless 802.11g 4 WAN порта, 1 LAN порт, 2 USB порта (подключение к 4 провайдерам)
  • EW-7207APg - Точка доступа, 5 портов LAN, 802.11g

Принт-серверы

Еще один класс устройств на процессоре ADM5120 - это сервера печати. Они имеют только один порт Ethernet и не имеют выходов коммутатора. Однако у них есть порт USB и LPT. Кроме того эти устройства имеют меньшие габариты, вес и цену и также весьма интересны.

  • PS-3205U - Сервер печати 1Eth,2USB,2LPT
  • PS-3205UWg - Сервер печати 1Eth,2USB,2LPT, 802.11g

Фото

Внешний вид 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 до 55 МБит/сек. Поэтому он может быть установлен как в офисе, в квартире, так и на крыше дома.
Но! Имея USB Flash (USB-HDD) мы запросто можем превратить маршрутизатор в полноценный сервер

Возможности, которые сразу приходят в голову:

  • Маршрутизатор
  • iptables (firewall, dnat, snat, policy routing, etc)
  • shaper (cbq, htb, etc)
  • VPN шлюз
  • dhcp сервер
  • ssh/telnet доступ (dropbear/busybox)
  • snmpd (большой размер для ramdisk'а)
  • ftp/tftp update
  • не вижу препятствий для того, чтобы подключить dial-up модем или другое коммуникационное оборудование
  • + широкая гамма USB устройств
  • и все остальное в рамках Вашей фантазии, аппаратных и программных ограничений
Лирической отступление

у меня есть друг HAM (радиолюбитель), который без ума от всевозможных интеллектуальных микроустройств, а тем более от устройств в которых стоит Linux. А тем более от устройств с Linux'ом и поддержкой AX.25. Для него скорость в 2400 по радио на расстоянии 50км верх блаженства. Собрав систему с поддержкой AX.25, я ему доставил несказанное удовольствие. Планирует устанавливать он такие маршрутизаторы в горах и труднодоступных местах, где порой питание только от ветровой электростанции

На досуге хочу
  • Из BR-6104KP сделать файловый сервер для USB flash/hdd
  • подключить USB звук/web-камеру

Ограничения/Огорчения

Так как процессор довольно специфический, то Linux ядро изменено именно под него и оно относительно старое - 2.4.18. ( Обновление: Существуют патчи для 2.4.31 - см ссылки) Совсем недавно компания 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 шлюза.

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

Структурная схема Фотография
adm5120-photo.jpeg

Существуют две разновидности процессора ADM5120 в BGA корпусе и ADM5120P в пластиковом PQFP корпусе, которые отличаются только набором периферии. Версия в BGA корпусе позволяет подключить до трех устройств PCI. Именно BGA версия используется во всех роутерах с WiFi. В данном случае в качестве устройства PCI выступает обычная MiniPCI карточка WiFi 802.11g. (PCI и MiniPCI электрически совместимы).

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

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

  • IEEE 802.3 Fast Ethernet
  • 5 auto-MDIX (auto-crossover) twisted paired LAN interfaces, embedded 10/100M PHY
  • 1 GMII1)/MII interface
  • Flexible WAN port selection

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

  • Embedded Data-buffer/Address-look-up table
  • Look-up table read/write-able
  • MAC layer security
  • MAC clone solution
  • Multicast grouping (IGMP)
  • MAC filtering, Bandwidth control
  • Class of Services (CoS) with two priority levels
  • Shared dynamic data buffer management, embedded SSRAM
  • Port grouping VLAN (overlap-able)
  • TCP/IP accelerator

Memory interface

SDRAM

  • Поддержка до двух банков (2 вывода Chip Select)
  • Каждый банк может поддерживать от 1Mx32 (4Mb) до 32Mx32bit (128Mb)
  • Управление по скорости выборки из банков.

FLASH

  • NAND Flash boot (только в BGA корпусе)
  • NOR Flash boot: Поддержка до двух банков (2 Chip Select pins)
  • NOR Flash boot: Каждый банк может поддерживать от 1Mx8-bit до 1Mx32-bit (4Mb)

System

  • Два UART интерфейса (с полным модемным управлением) совместимых с AMBA UART PrimeCell (PL010)
  • AMBA-PCI bridge который поддерживает до 3 PCI устройств (только в BGA корпусе)
  • GPIO (версия в PQFP корпусе - 4 GPIO pins, BGA версия - 8 pins)
  • USB 1.1 host на шине AMBA
  • Источники синхронизации :
    • 25MHz crystal for 10/100
    • 48MHz crystal for USB
  • 0.18u CMOS process
  • 1.8V/3.3V dual power

и все это удовольствие за ~$35

Консольный порт

Консольного порта в его привычном виде нет. Для него предусмотрен разъем на плате обозначенный JP2. И для того, чтобы иметь доступ к консоли и возможность прошивать маршрутизатор через кабель, Вам необходимо будет собрать переходник (level shifter) с ~12V (RS232) на 3.3V. Для этого потребуется микросхема MAX232 или ей подобная.
Схема программатора
IMHO проще всего взять шнурок к мобильному телефону, обычно они все используют напряжение 3.3V. Например, идеально подходят шнуры от телефонов Siemens как от старых S/25/С25/C35 так и от более современных С55/CF62. Стоят они как правило 5..10$. Подходят как Serial так и USB шнуры. Первый - это собранный и залитый пластиком переходник, а во втором случае вы просто получите дополнительный преобразователь USB-to-Serial.

На плате маршрутизатора имеется разъем подписанный как 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 порт

Процессор ADM5120 поддерживает JTAG (IEEE 1149.1) и MIPS EJTAG стандарты, которые предназначены для отладки и тестирования устройства. EJTAG - это расширение обычного JTAG, добавляет возможности пошаговой отладки процессоров MIPS и т.д.

Выводы процессора для JTAG (корпус PQFP):

134 /TRST
135 TDI
136 TDO
137 TMS
139 TCK

Разъем на плате BR-6104 обозначен как JP1. Разводка соответствует так называемому EJTAG 2.5 стандарту. В прочих устройствах может использоваться другая разводка например 20-pin EJTAG 2.0 .

n_TRST  1  2 GND
TDI     3  4 GND
TDO     5  6 GND
TMS     7  8 GND
TCK     9 10 GND
n_SRST 11 12
DINT   13 14 VCC

Вывод DINT в ADM5120 не используются. Сигнал n_TRST (TAP Reset) служит для сброса TAP-контроллера независимо от схем остального процессора. Активный уровень - низкий (n_ указывает на негативную логику). Вобщем-то для функционирования JTAG он не нужен, но практически во всех устройствах пин n_TRST соединен с земляной шиной через резистор 1Ком и следовательно JTAG отключен (постоянно находится в состоянии сброса). Поэтому в простых JTAG пробниках нужно подать лог.»1» или соединить его с VCC через резистор примерно 300Ом. Более совершенные пробники управляют этим сигналом непосредственно. Вывод n_SRST дублирует обычный аппаратный сброс, но компоненты (R22) не припаяны на плате. Питание +3.3V можно снять с 14-го контакта разъема.

Самый простой и надежный JTAG интерфес - Macraigor Wiggler, который подключается к LPT порту. Состоит из одной микросхемы 74HC244(1564АП5), набора резисторов и одного транзистора. Есть и более простые схемы на LPT, состоящие просто из резисторов, но по отзывам они работают менее надежно. Микросхема серии 74HC (Highspeed CMOS) применяется, постольку поскольку она может работать на любом напряжении от +2 до +6 V, а напряжение процессора +3.3V .

Схема программатора WIGGLER

Утилиты JTAG/EJTAG

Существуют несколько версий протокола MIPS EJTAG (1.0, 2.0, 2.5 и т.д.). Для доступа к памяти могут применяться два метода: EJTAG DMА и PrAcc. Первый метод гораздно быстрее и проще в реализации, но есть далеко не во всех процессорах. Версии EJTAG 2.5 и 2.6 более ориенированы на отладку и опция EJTAG DMA в них чаще всего отсутствует. ADM5120 реализует EJTAG 2.6 и к сожалению в ADM5120 поддержки EJTAG DMA нет. Чтобы получить доступ к памяти по методу PrAcc, необходимо загружать небольшие кусочки кода в процессор и читать результаты.

Фирма Macraigor бесплатно предоставляет утилиту OCD Debugger. Он может работать совместно с Wiggler, схема которого приведена выше (под Windows). OCD Debugger позволяет выполнять команды JTAG и содержит небольшой простой пошаговый отладчик MIPS. Также Macraigor предлагает Demo-версию утилиты OCD Flash Programmer (полная версия платная).

Другая популярная утилита - Openwince JTAG Tools. Она также поддерживает Macraigor Wiggler. К сожалению, сайт программы давно не обновлялся, однако в CVS новые версии появлются довольно активно. Можно использовать версию, в которую Marek Michalkiewicz добавил поддержку EJTAG PrAсс:jtag-0.6-cvs-20051228.

К сожалению, ADM5120 не позволяет определить тип процессора через регистр IDCODE:

jtag> cable ppdev /dev/parport0 WIGGLER
Initializing Macraigor Wiggler JTAG Cable on ppdev port /dev/parport0
jtag> detect
IR length: 5
Chain length: 1
Device Id: 00000000000000000000000000000001
  Unknown manufacturer!
chain.c(110) Part 0 without active instruction
chain.c(133) Part 0 without active instruction
chain.c(110) Part 0 without active instruction

Однако определение EJTAG флагов работает и возвращает вполне осмысленные значения:

jtag> instruction length 5
jtag> register IMP 32
jtag> instruction IMPCODE 00011 IMP
jtag> instruction IMPCODE
jtag> shift ir
jtag> shift dr
jtag> dr
01000001010000000100000000000000

Расшифровка:

31:29 EJTAGver 010 Version 2.6
   28 R4k/R3k    0 R4k
   24 DINTsup    1 supported
22:21 ASIDsize  10 8-bit ASID
   16 MIPS16e    0 not supported
   14 NoDMA      1 No EJTAG DMA support
    0 MIPS32/64  0 MIPS32

Через порт JTAG в принципе возможно чтение/запись flash/sdram памяти напрямую.

Приветствуется дальнейшая информация по JTAG.

Заметки по родной прошивке

В основном вся логика представлена набором shell скриптов, все относительно просто.
HTTP сервером является пропатченный GoAhead WebServer, в котором находится логика работы с пользователем.

Программа /bin/flash реализует функциональность сохранения/восстановления параметров (NVRAM). Она может читать/записывать области памяти FLASH, упомянутые ниже как HS, DS и CS. Параметры предопределены и привязаны (внутри программы) к определенным областям FLASH памяти.

К сожалению при загрузке на консоле запускается программа требующая ввести username/password, которые известны только производителю. Поэтому, чтобы получить shell доступ, нужно как минимум прошить модифицированную прошивку
Обновлено: Есть также способ получить shell доступ на консоли в родной прошивке, для этого в разделе 'Virtual Server' заводим конфигурацию, но в поле коментария вводим `killall setup` (Обязательно с обратными ковычками)
Также запускается демон 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 памяти

FLASH память начинается с физического адреса 0x1fc00000. В соответствии с архитектурой MIPS она также видна по адресам 0x9fc00000 (KSEG0) и 0xbfc00000 (KSEG1).

  0x000000 - 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 секции всегда начинаются на границе 64K блока (0x10000) и содержат в самом начале 12 байтовый заголовок:

char signature[4]; /* "WB4K" or "CSYS" */
uint32_t startAddress;
uint32_t length;

Некоторые роутеры используют сигнатуру WBIP вместо WB4K.

17KB неиспользуемого места + 64KB занимаемые webpages.bin, так что потенциально выигрываем 81KB.

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

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

       V2.65                            Block name                   V2.75
+--------------------+ 0x00                 +             0x00+--------------------+
| WB4K Header        |                      |                 | WB4K 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            |
|                    |                      |                 |                    |
|                    |                      |                 |                    |
+--------------------+                      +                 +--------------------+
''WB4K header'' и ''CSYS header''

Заголовки «WB4K header» и «CSYS header» описаны выше.

''vmlinux.bin''

После заголовка CSYS идет запакованный образ ядра Linux с присоединенным (embedded) образом RAM-диска. Полностью данный образ ядра vmlinux.bin имеет следующий формат :

       V2.65                                                         V2.75
+--------------------+ 0x00                 +             0x00+--------------------+
|                    |                      |                 |                    |
| Kernel             |                  kernel.bin            | Kernel             |
|                    |                      |                 |                    |
+--------------------+ 0x16d000             +         0x172000+--------------------+
| ramdrive.img       |                      |                 | ramdrive.img       |
| gzipped            | --> ram image  tmpimg.img.gz (bz2)     | bzip2              |
| +padding           |                      |                 | +padding           |
+--------------------+ 0x28f000             +         0x27c000+--------------------+

После удаления заголовка CSYS и распаковки vmlinux.bin.gz :

$ perl -e 'print 0x10000+0xC'
65548
$ dd if=EdiEngBR6104K_2.75.bin of=vmlinux.bin.gz bs=1 skip=65548
$ gunzip vmlinux.bin.gz

мы имеем 2 дополнительных блока:

Offset      Length
0x000000    0x172000    kernel
0x172000    0x27с000    RAM image block (ramdrive.img)

Tip1: Отмечу, что ramdisk может быть сжат не gzip, а и bzip2.

Таким образом, образ файловой системы ramdisk (ramdrive.img) получается сжат дважды :).

Загрузчик BootLoader ищет заголовок CSYS во FLASH и расжимет ядро в память DRAM. В загрузчике встроен декомпрессор gzip (zlib) поэтому метод компрессии может быть только такой. Например, для прошивки 2.75 BootLoader декомпрессирует блок с адреса 0xbfc1000c. Реультаты декомпрессии размещаются в DRAM по адресу 0x80002000 и управление передается на 0x800026d8. Эти адреса жестко фиксированы и их следует учитывать при изготовлении собственных прошивок.

Tip2: На самом деле, загрузчик ищет заголовок CSYS header в памяти по адресам 0x10000 + n*0x10000 (где n 0,1,2). Т.е можно располагать ядро и без webpages-6104k.bin (я так и не понял зачем он нужен), и без главного заголовка.

Когда ядро Linux получает управление, оно само находит embedded образ файловой системы ramdrive.img и монтирует его как /dev/ram0 .

Если выбрать пункт BootLoader-a «b» то у нас есть возможность загрузить собственное ядро в память DRAM и запустить на исполнение, не загружая его во FLASH. Загрузка происходит по протоколу X-Modem, данные размещаются по адресу 0x80810000. После загрузки BootLoader декомпрессирует данные в область 0x80020000 и передает управление как обычно. Таким образом, для загрузки из пункта «b» образ ядра vmlinux.bin.gz должен быть без заголовка «CSYS header».

Файловая система

Файловая система присоединена (embedded) к ядру Linux. Данная технологи называется Embedded Init RAM Disk (initrd). Из себя она представляет образ корневой (root) файловой системы EXT2FS, запакованный gzip или bzip2.

$ perl -e 'print 0x172000'
1515520
$ dd if=vmlinux.bin of=ramdrive.img.gz bs=1 skip=1515520
$ unzip ramdrive.img.gz 

Полученный образ можно смонтировать:

$ mount -o loop ramdrive.img /mnt/edimax_ramdisk

На диске мы увидим обычные файлы ELF для процессора MIPS и стартовые скрипты системы. После изменения и отмонтирования umount можно использовать новый ramdisk.img . Данный образ диска автоматически гененрируется утилитами buildroot которые описаны ниже.

BootLoader

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

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

Загружаем полученный файл в FLASH через 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 архитектуру, Вам необходим кросс-компилятор и собранная uclibc2) для этой архитектуры. Есть 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:

  • загрузить и скомпилировать пакеты необходимые для построения (gcc, binutils, ccache, etc)
  • загрузить и скомпилировать пакеты которые войдут в состав ramdisk'а (uclibc, busybox, etc)
  • построить ramdisk требуемого формата (ext2, cramfs, jffs)

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

  • bash, busybox
  • bzip2, gzip
  • coreutils, diffutils, findutils
  • dropbear_sshd
  • autoconf/automake, gcc, flex, gdb, gdbserver, ltrace, strace
  • iproute2, iptables, mrouted, netsnmp, netkitbase, netkittelnet, openssh, openssl, vtun, links, ltp


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

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

  • в Makefile определяем архитектуру: ARCH:=mipsel
  • далее по вкусу включаем определения TARGETS


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

  • build_mipsel/package-name/ лежат исходные тексты пакетов
  • build_mipsel/root/ - готовая файловая система, которая превратится в ramdisk
  • build_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

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

В составе архива находящегося на сайте производителя (Linux-SC.zip) входят утилиты для построения образа для Flash и генерации заголовков CSYS.

USB root

Для того, чтобы иметь возможность распологать корневую файловую систему на USB носителе, требуется наложить патч смысл которого сводится в некоторой задержке монтирования, чтобы USB подсистема увидела и проинициализировала носитель.

Ссылки

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

Crosscompile

Kernel & firmware sources

Документы

MIPS

Купить

Благодарности

Компании 'Агатис' http://www.agatis.biz , которая является официальным дистрибутором фирм SWEEX и EDIMAX в Украине. А особенно Шафаренко Дмитрию - менеджеру по сбыту
Большое спасибо Андрею Ищенко и Адилю Изидинову за наводку, Воропай Александру, а также Игорю Залатову другу и «HAM'у».

(с)

Vladislav Moskovets (Владислав Московец)
mail: adm5120 {at} vlad . org . ua
icq: 3703834
Буду рад любым замечаниям, конструктивной критике, предложениям, дополнительной информации.

1) только в BGA корпусе
2) uClibc - библиотека языка C, оптимизированная для микроконтроллеров и embedded систем.
3) настраивается
/var/lib/dokuwiki/data/pages/midge/ru_article.txt · Последние изменения: 2014/02/17 23:05 (внешнее изменение)
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Run by Debian Driven by DokuWiki