User Tools

Site Tools


midge:ru_article

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

midge:ru_article [2018/04/09 15:36]
midge:ru_article [2018/04/09 15:36] (current)
Line 1: Line 1:
 +====== Linux маршрутизатор на чипсете ADM5120 ======
 +===== Отказ от ответственности =====
 +Автор не несет никакой ответсвенности,​ за Ваши действия или бездействия,​ за физический,​ финансовый,​ моральный или любой другой ущерб. Помните,​ вскрывая рассмотренный в этой статье маршрутизатор,​ Вы лишаетесь гарантии.\\
 +Статья не является пошаговым руководством:​ Вы должны понимать,​ что Вы делаете.
  
 +===== Введение =====
 +Недавно ко мне в руки попало устройство [[http://​www.agatis.biz/​site/​page135.html?​goods=ED29|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 устройства на процессоре [[http://​www.linux-mips.org/​wiki/​Adm5120|ADM5120]],​ отличающиеся только корпусом. Например,​ точно такое же устройство изготавливает компания Sweex ([[http://​www.sweexeurope.com/​product.asp?​pid=302|Sweex LB000021]]). Еще одно аналогичное устройство - Planet XRT-401D. Платы Edimax, Sweex, Planet и других производителей отличить друг от друга невозможно. Существуют лишь подмодификации плат, отмеченные в левом верхнем углу как "Rev A" и "Rev B" и использующие разные чипы памяти. Прошивки отличаются только логотипами и оформлением (CSS).
 +
 +=== Существуют модификации ===
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED29|BR-6104K]] - Маршрутизатор 1 WAN порт, 4 LAN порта (~$35)
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED49|BR-6104KP]] - Маршрутизатор 1 WAN порт, 4 LAN порта, 2 порта USB (~$45)
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED50|BR-6524K]] - Маршрутизатор 2 WAN порта, 4 LAN порта ​ (подключение к 2 провайдерам) ​
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED53|BR-6541K]] - Маршрутизатор 4 WAN порта, 1 LAN порт (подключение к 4 провайдерам)
 +
 +Отличие между моделями Edimax BR-6104K и BR-6104KP состоит только в наличии двух портов USB и в поддержке принтера в firmware. Причем печатные платы у обоих устройств совершенно одинаковые,​ только на BR-6104K не распаяны элементы USB, осциллятор на 48MHz и стабилизатор питания +5V для USB. При некоторой сноровке можно дополнить недостающие элементы и получить модель BR-6104KP. Подробная нструкция [[http://​sprite.student.utwente.nl/​~jeroen/​projects/​lb000021/​usb_tutorial/​ |здесь]]. Хотя разница в цене составляет всего 10$...
 +
 +Более дорогие устройства поддерживают беспроводную сеть WiFi 802.11g :
 +
 +=== Модификации с WiFi ===
 +
 +  * [[http://​www.edimax.nl/​html/​english/​products/​BR-6104Wg.htm|BR-6104Wg]] - самая первая модель с 802.11g. 1 WAN порт, 4 LAN порта, USB нет.
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED52|BR-6524WP]] - Маршрутизатор Wireless 802.11g, 2 WAN порта, 4 LAN порта, 2 порта USB (подключение к 2 провайдерам) ($158.00)
 +  * [[http://​www.agatis.biz/​site/​page135.html?​goods=ED51|BR-6541WP]] - Маршрутизатор Wireless 802.11g 4 WAN порта, ​ 1 LAN порт, 2 USB порта (подключение к 4 провайдерам)
 +  * [[http://​www.edimax.nl/​html/​english/​products/​EW-7207APg.htm|EW-7207APg]] - Точка доступа,​ 5 портов LAN, 802.11g
 +
 +=== Принт-серверы ===
 +
 +Еще один класс устройств на процессоре ADM5120 - это сервера печати. Они имеют только один порт Ethernet и не имеют выходов коммутатора. Однако у них есть порт USB и LPT. Кроме того эти устройства имеют меньшие габариты,​ вес и цену и также весьма интересны.
 +
 +  * [[http://​www.edimax.com.tw/​html/​english/​products/​PS-3205U.htm|PS-3205U]] - Сервер печати 1Eth,​2USB,​2LPT
 +  * [[http://​www.edimax.com.tw/​html/​english/​products/​PS-3205UWg.htm|PS-3205UWg]] - Сервер печати 1Eth,​2USB,​2LPT,​ 802.11g
 +
 +==== Фото ====
 +^ Внешний вид BR-6104K ​                                  ^ Вид внутри ​  ​BR-6104K ​                           ^
 +| {{midge:​br6104k-face.jpeg|Внешний вид BR-6104K}} ​    | {{midge:​br6104k-int.jpeg|Вид внутри BR-6104K}} ​  |
 +\\
 +
 +^    Web Интерфейс ​                                                      ^^^^
 +| {{midge:​small-br6104kp-1.png}} ​ | {{midge:​small-br6104kp-2.png}} ​ | {{midge:​small-br6104kp-3.png}} ​  |
 +| {{midge:​small-br6104kp-4.png}} ​ | {{midge:​small-br6104kp-5.png}} ​ | {{midge:​small-br6104kp-6.png}} ​  |
 +| {{midge:​small-br6104kp-7.png}} ​ | {{midge:​small-br6104kp-8.png}} ​ | {{midge:​small-br6104kp-9.png}} ​  |
 +| {{midge:​small-br6104kp-10.png}} | {{midge:​small-br6104kp-11.png}} | {{midge:​small-br6104kp-12.png}} ​ |
 +| {{midge:​small-br6104kp-13.png}} | {{midge:​small-br6104kp-14.png}} |                                  |
 +
 +==== Основные возможности ====
 +
 +=== Общий доступ ===
 +Функция 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]] и форум, где владельцы маршрутизаторов исправляют ошибки допущенные производителем.
 +
 +Теперь,​ если Вы заинтересовались этим устройством,​ то Вы можете:​
 +
 +  - Использовать роутер без изменений
 +    * Для обычных пользователей подключенных через xDSL модем - то, что доктор прописал.
 +  - Использовать ядро и ramdisk от производителя изменяя под свои нужды скрипты/​бинари,​ для этого Вам потребуется:​
 +    * Изучить структуру прошивки,​ научится разбирать и собирать ramdisk
 +    * Подключить консольный кабель - получить доступ к консоли
 +    * Установить MIPS toolchain
 +  - Использовать самосборное ядро и самосборный ramdisk, для этого Вам потребуется:​
 +    * Тоже что и в предыдущем пункте
 +    * Скачать,​ собрать,​ установить ядро, buildroot ;)
 +  - Полностью пересобрать родную прошивку
 +  - Через web интерфейс залить [[http://​vlad.org.ua/​adm5120/​firmware/​usb-root/​|прошивку]] ''​root''​ система которой находится на первом разделе USB Flash диска. ​
 +    * плюс: Это '​живая'​ система,​ с изменяемой в любой момент конфигуруцией,​ а не ramdisk. ​
 +    * плюс: не требуется вскрывать роутер,​ чтобы подключиться через RS232 порт
 +    * плюс: в любой момент можно изменить файловую систему на настольном компьютере
 +
 +Поделюсь заметками и рекомендациями:​
 +\\
 +
 +===== Различная информация =====
 +==== Hardware ====
 +
 +Данный маршрутизатор построен на чипе ADM5120 фирмы %%AdmTek%% ([[http://​www.infineon.com/​|Infineon]])
 +который представляет собой высокопроизводительную и очень гибкий систему System On Chip (SOC)
 +которая может использоваться для SOHO Gateway, NAT роутер,​ принт сервер,​ точки доступа WLAN, VPN шлюза, ядром VoIP шлюза.
 +
 +Внутри себя этот чип содержит высокопроизводительный процессор MIPS32 4Kc 175 MHz/227 MIPS,
 +сетевую подсистему,​ switch engine, поддержку PCI, USB, UART.
 +
 +^  Структурная схема ​                 ^            Фотография ​         ^
 +| {{midge:​adm5120-structure.png}} ​   |  {{midge:​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 GMII((только в BGA корпусе))/​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''​ или ей подобная.\\
 +{{midge:​max232.png?​700|Схема программатора}}
 +\\
 +IMHO проще всего взять шнурок к мобильному телефону,​ обычно они все используют напряжение 3.3V. Например,​ идеально подходят шнуры от телефонов [[http://​www.meshcube.org/​meshwiki/​ModifiedMobileSerCable|Siemens]] как от старых S/​25/​С25/​C35 так и от более современных С55/CF62. Стоят они как правило 5..10$. Подходят как Serial так и USB шнуры. Первый - это собранный и залитый пластиком переходник,​ а во втором случае вы просто получите дополнительный преобразователь USB-to-Serial.
 +
 +На плате маршрутизатора имеется разъем подписанный как JP2. К нему необходимо подключать кабель согласно разводки:​
 +<​code>​
 +JP2
 +2-o o o o-8
 +1-o o o o-7
 +
 +1 - Rx
 +7 - Tx
 +8 - Gnd
 +</​code>​
 +**Внимание:​** подключение COM порта напрямую к маршратизатору непременно выведет последний из строя.\\
 +Подключайтесь любой терминальной программой на скорости 115200 бит/​сек,​ 8 бит, No parity, 1 stopbit
 +\\
 +**Tip:** Консольный вход очень чувствительный к различным шумам и наводкам,​ поэтому,​ если они у
 +Вас появляются - проверьте кабеля,​ не приближайте их к источникам помех. Как вариант можно установить конденсатор 0.1 мкф между 1 и 8 контактами.
 +
 +
 +==== USB порт ====
 +Jeroen Domburg написал прекрасное [[http://​sprite.student.utwente.nl/​~jeroen/​lb000021/​usb_tutorial/​|HOWTO]]
 +по установке компонентов для поддержки USB в те роутеры где их нет.
 +
 +==== JTAG порт ====
 +Процессор ADM5120 поддерживает JTAG (IEEE 1149.1) и MIPS [[http://​www.mips.com/​content/​Documentation/​MIPSDocumentation/​EJTAG/​doclibrary|EJTAG]] стандарты,​ которые предназначены для отладки и тестирования устройства. EJTAG - это расширение обычного JTAG, добавляет возможности пошаговой отладки процессоров MIPS и т.д.
 +
 +Выводы процессора для JTAG (корпус PQFP):
 +
 +<​code>​
 +134 /TRST
 +135 TDI
 +136 TDO
 +137 TMS
 +139 TCK
 +</​code>​
 +
 +Разъем на плате BR-6104 обозначен как JP1. Разводка соответствует так называемому EJTAG 2.5 стандарту. В прочих устройствах может использоваться другая разводка например 20-pin EJTAG 2.0 .
 +
 +<​code>​
 +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
 +</​code>​
 +
 +Вывод 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 [[http://​www.macraigor.com/​wiggler.htm|Wiggler]],​ который подключается к LPT порту. Состоит из одной микросхемы 74HC244(1564АП5),​ набора резисторов и одного транзистора. Есть и [[http://​wiki.openwrt.org/​JTAG_Cables|более простые]] схемы на LPT, состоящие просто из резисторов,​ но по отзывам они работают менее надежно. Микросхема серии 74HC (Highspeed CMOS) применяется,​ постольку поскольку она может работать на любом напряжении от +2 до +6 V, а напряжение процессора +3.3V .
 +
 +===  Схема программатора WIGGLER === 
 +{{midge:​wiggler.gif}}
 +
 +=== Утилиты 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 бесплатно предоставляет утилиту [[http://​www.macraigor.com/​ocd_cmd.htm|OCD Debugger]]. Он может работать совместно с Wiggler, схема которого приведена выше (под Windows). OCD Debugger позволяет выполнять команды JTAG и содержит небольшой простой пошаговый отладчик MIPS. Также Macraigor предлагает Demo-версию утилиты [[http://​www.macraigor.com/​flash_prog.htm|OCD Flash Programmer]] (полная версия платная).
 +
 +Другая популярная утилита - Openwince [[http://​openwince.sourceforge.net/​jtag/​|JTAG Tools]]. Она также поддерживает Macraigor Wiggler. К сожалению,​ сайт программы давно не обновлялся,​ однако в CVS новые версии появлются довольно активно. Можно использовать версию,​ в которую Marek Michalkiewicz добавил поддержку EJTAG PrAсс:​[[http://​www.amelek.gda.pl/​rtl8181/​jtag/​|jtag-0.6-cvs-20051228]].
 +
 +К сожалению,​ ADM5120 не позволяет определить тип процессора через регистр IDCODE:
 +
 +<​code>​
 +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
 +</​code>​
 +
 +Однако определение EJTAG флагов работает и возвращает вполне осмысленные значения:​
 +
 +<​code>​
 +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
 +</​code>​
 +
 +Расшифровка:​
 +
 +<​code>​
 +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
 +</​code>​
 +
 +Через порт JTAG в принципе возможно чтение/​запись flash/sdram памяти напрямую.
 +
 +  * http://​www.baycom.org/​~tom/​ejtag/​
 +  * http://​gdbmipsejtag.sourceforge.net/​
 +  * http://​www.totalembedded.com/​open_source/​jtag/​mips32_ejtag.php
 +  * Интересная дискуссия : http://​wiki.openwrt.org/​zt8qmwz
 +  * http://​adm5120.narod.ru/​ejtag-adm5120.htm
 +  * http://​adm5120.narod.ru/​ejtag_work.htm
 +
 +Приветствуется дальнейшая информация по JTAG.
 +
 +==== Заметки по родной прошивке ====
 +В основном вся логика представлена набором ''​shell''​ скриптов,​ все относительно просто.\\
 +HTTP сервером является пропатченный [[http://​webserver.goahead.com/​|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 ==
 +Светодиод питания.\\
 +<code bash>
 +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 
 +</​code>​
 +
 +== /​dev/​led_wlan ==
 +неизвестно,​ возможно светодиод WLAN
 +
 +== /dev/ttyS0, /​dev/​console ==
 +консоль
 +
 +==== Структура Flash памяти ====
 +
 +FLASH память начинается с физического адреса %%0x1fc00000%%. В соответствии с архитектурой MIPS она также видна по адресам %%0x9fc00000%% (KSEG0) и %%0xbfc00000%% (KSEG1).
 +
 +<​code>​
 +  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)
 +</​code>​
 +
 +HS, DS и CS секции начинаются с 6-ти байтного заголовка: ​
 +<code c>
 +char tag[2]; /* "​HS",​ "​DS"​ or "​CS"​ */
 +char version[2]; /* currently HS = "​01",​ DS = CS = "​08"​ */
 +uint16_t length;
 +</​code>​
 +WB4K и CSYS секции всегда начинаются на границе 64K блока (0x10000) и содержат в самом начале 12 байтовый заголовок: ​
 +<code c>
 +char signature[4];​ /* "​WB4K"​ or "​CSYS"​ */
 +uint32_t startAddress;​
 +uint32_t length;
 +</​code>​
 +Некоторые роутеры используют сигнатуру WBIP вместо WB4K.
 +
 +17KB неиспользуемого места + 64KB занимаемые webpages.bin,​ так что потенциально выигрываем 81KB. 
 +
 +==== Структура официальной прошивки ====
 +Прошивки от Edimax и Sweex (версий 2.65/2.75) имееют следующий формат
 +<​code>​
 +       ​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 ​           |
 +|                    |                      |                 ​| ​                   |
 +|                    |                      |                 ​| ​                   |
 ++--------------------+ ​                     +                 ​+--------------------+
 +</​code>​
 +
 +== ''​WB4K header''​ и ''​CSYS header''​ ==
 +Заголовки "WB4K header"​ и "CSYS header"​ описаны выше.
 +
 +==''​vmlinux.bin''​==
 +После заголовка CSYS идет запакованный образ ядра Linux с присоединенным (embedded) образом [[http://​www.linux-mips.org/​wiki/​Ramdisk|RAM-диска]]. Полностью данный образ ядра //​**vmlinux.bin**//​ имеет следующий формат :
 +
 +<​file>​
 +       ​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+--------------------+
 +</​file>​
 +После удаления заголовка CSYS и распаковки //​**vmlinux.bin.gz**//​ :
 +
 +<​code>​
 +$ perl -e 'print 0x10000+0xC'​
 +65548
 +$ dd if=EdiEngBR6104K_2.75.bin of=vmlinux.bin.gz bs=1 skip=65548
 +$ gunzip vmlinux.bin.gz
 +</​code>​
 +
 +мы имеем 2 дополнительных блока: ​
 +
 +<​code>​
 +Offset ​     Length
 +0x000000 ​   0x172000 ​   kernel
 +0x172000 ​   0x27с000 ​   RAM image block (ramdrive.img)
 +</​code>​
 +
 +**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.
 +
 +<​code>​
 +$ perl -e 'print 0x172000'​
 +1515520
 +$ dd if=vmlinux.bin of=ramdrive.img.gz bs=1 skip=1515520
 +$ unzip ramdrive.img.gz ​
 +</​code>​
 +
 +Полученный образ можно смонтировать:​
 +
 +<​code>​
 +$ mount -o loop ramdrive.img /​mnt/​edimax_ramdisk
 +</​code>​
 +
 +На диске мы увидим обычные файлы ELF для процессора MIPS и стартовые скрипты системы. После изменения и отмонтирования ''​umount''​ можно использовать новый ramdisk.img . Данный образ диска автоматически гененрируется утилитами ''​buildroot''​ которые описаны ниже.
 +
 +==== BootLoader ====
 +При загрузке,​ на консоле появляется следующее сообщение:​
 +<​code>​
 +ADM5120 Boot:
 +</​code>​
 +
 +Если нажать 3 раза пробел в течении около 1 сек, то появится загрузочное меню:
 +<​code>​
 +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 :
 +</​code>​
 +
 +  * Пункт **"​a"​** предназначен для загрузки ''​firmware''​ в FLASH. Требуется прошивка с ''​CSYS''​ заголовком \\
 +  * Пункт **"​b"​** для загрузки в RAM. Передавать нужно //​**vmlinux.bin.gz**//​ (запакованные ядро+ramdisk) \\
 +Протокол передачи - ''​XMODEM''​
 +
 +Например,​ загружаем прошивку в FLASH: \\
 +Создаем ''​firmware.bin''​
 +<code bash>
 +../​bin/​mksyshdr csys.bin vmlinux.bin.gz
 +cat csys.bin vmlinux.bin.gz >​firmware.bin
 +</​code>​
 +
 + ​Загружаем полученный файл в FLASH через XMODEM:
 +<​code>​
 +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...
 +</​code>​
 +**Tip:** передавать следует не сразу после выбора меню, а через 5-7 сек.
 +
 +==== MIPS toolchain ====
 +Для того, чтобы иметь возможность собирать программы под MIPS архитектуру,​ Вам необходим кросс-компилятор и собранная uclibc(([[http://​www.uclibc.org/​|uClibc]] - библиотека языка ''​C'',​ оптимизированная для микроконтроллеров и embedded систем.)) ​ для этой архитектуры. Есть 4 способа использовать MIPS toolchain:
 +  - Скачать и установить готовый пакет ( см Ссылки )
 +  - Скачать и собрать '​вручную'​ ''​gcc''​ и ''​uclibc''​ для платформы MIPS
 +  - Использовать собранный ''​MIPS toolchain''​ из собранного ''​buildroot''​
 +  - Если у Вас замечательный дистрибутив Debian, то рекомендую использовать пакет ''​toolchain-source''​ ( см Ссылки )
 +Я использую третий способ,​ так как все равно использую buildroot.
 +\\
 +При использовании USB накопителей можно использовать и более тяжеловесный (но стандартный) вариант библиотеки C - ''​glibc''​
 +
 +==== buildroot ====
 +Buildroot - замечательный пакет, являющийся частью проекта [[http://​www.uclibc.org/​|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'':​
 +<code bash>
 +cd build_mipsel/​busybox/​
 +make menuconfig
 +cp .config ../​../​sources/​busybox.config
 +cd - 
 +</​code>​
 +Аналогичная процедура для ''​uClibc.config''​
 +
 +==== kernel ====
 +Процесс компиляции ядра мало чем отличается от компиляции для платформы x86, конечно это должен быть ''​MIPS''​ кросс-компилятор и ядро специально для этого чипсета. \\
 +Перед компиляцией я устанавливаю переменные окружения:​
 +<code bash>
 +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
 +</​code>​
 +Если использовать компиляторы из buildroot:
 +<code bash>
 +export PATH=/​path/​to/​buildroot/​build_mipsel/​staging_dir/​bin/:​$PATH
 +</​code>​
 +\\
 +Замечу,​ что в этом случае нет смысла вручную '​собирать'​ образ ядра с ''​initrd''​ - пусть за Вас это сделает ''​make vmlinux''​. Для этого готовый ''​ramdisk''​ требуется положить в ''​arch/​mips/​ramdisk/​ramdisk_el.gz''​((настраивается)) и установить ''​[*] Embed root filesystem ramdisk into the kernel''​ в меню конфигурации ядра. \\
 +Подробности см. в ''​arch/​mips/​ramdisk/​Makefile''​. Перед упаковкой gzip ядро из ELF преобразуется в бинарный формат.
 +
 +В составе архива находящегося на сайте производителя (Linux-SC.zip) входят утилиты для построения образа для Flash и генерации заголовков CSYS.
 +
 +=== USB root ===
 +Для того, чтобы иметь возможность распологать корневую файловую систему на USB носителе,​ требуется наложить [[http://​www.lammerts.org/​software/​kernelpatches/​usb-storage-root.patch|патч]] смысл которого сводится в некоторой задержке монтирования,​ чтобы USB подсистема увидела и проинициализировала носитель.
 +
 +===== Ссылки =====
 +  * http://​midge.vlad.org.ua Linux mini distribution for ADM5120 routers
 +  * [[http://​www.norocketscience.com/​forum/​|NoRocketScience Forum]] ​
 +  * http://​vlad.org.ua/​adm5120/​firmware/ ​
 +  * http://​adm5120.narod.ru/​
 +  * http://​www.linux-mips.org/​wiki/​Adm5120
 +  * http://​www.linux-mips.org/​wiki/​BR6104
 +
 +=== Компании и устройства===
 +[[http://​edimax.ru/​broadband.html|Edimax в России]]
 +[[http://​www.infineon.com/​|Infineon]],​ [[http://​www.infineon.com/​cgi/​ecrm.dll/​ecrm/​scripts/​prod_ov.jsp?​oid=52748&​cat_oid=-12483|Infineon ADM5120]],
 +[[http://​www.infineon.com/​cmc_upload/​documents/​010/​6565/​EASY5120P-ATAToolBrief.pdf|ADM5120P 2 Channel VoIP ATA]] \\
 +[[http://​www.canyon-tech.com/​products/​show.cfm/​Net/​Wireless_Products_IEEE_802.11g/​CN-WF512/​|Canyon CN-WF512]] \\
 +[[http://​www.ovislink.com.tw|OvisLink]] компания производящяя Linux устройство [[http://​www.ovislink.com.tw/​MU9000.htm|MU-9000VPN - Multimedia Server + VPN Router ]] на чипсете ADM5120 \\
 +[[http://​www.arcadyan.com/​Products/​Digital_Home.htm#​mlr50|Home Media Server (64M RAM, 32M Flash, 40-80G HDD)]], [[http://​www.arcadyan.com/​PDF/​DigitalHome/​HMS300.pdf|HMS300 Datasheet]] \\
 +http://​www.dns120-linux.org - Linux устройство на чипсете Adm5120
 +[[http://​www.google.com.ua/​search?​hl=uk&​q=D-Link+DNS-120&​btnG=%D0%9F%D0%BE%D1%88%D1%83%D0%BA+%D1%83+Google&​meta=|google search D-Link 120]] \\
 +
 +=== Crosscompile ===
 +  * [[http://​people.debian.org/​~debacle/​cross.html|Setting up a Cross Development Environment on Debian GNU/​Linux]] ​
 +  * [[http://​www.mobilab.unina.it/​Resources/​crosscompilerHOWTO.html|Crosscompiler HOWTO]] ​
 +  * [[http://​www.jimbrooks.org/​web/​linux/​docs/​programming/​SettingUpACrossDevelopmentEnvironmentOnDebianLinux.php| Setting up a Cross Development Environment on and for Debian GNU/Linux]]
 +  * [[http://​cac.engin.umich.edu/​doc/​txt/​mips_perf_gd.pdf|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://​joco.kezdionline.ro/​linux-2.4.31-adm.diff.bz2|2.4.31 patch (to vanilla kernel)]]
 +  * 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 ​
 +  * [[http://​eeek.borgchat.net/​lists/​mips/​msg18313.html|Porting to 2.6.x kernel]]
 +  * [[http://​sharon.esrac.ele.tue.nl/​users/​pe1rxq/​|2.6.10 patch]] ​
 +
 +
 +=== Документы ===
 +  * [[http://​stuff.sateh.com/​ccc.pdf|Hacking Linux-Powered Devices]] ​
 +  * [[http://​www.infineon.com/​cmc_upload/​documents/​010/​6590/​ADM5120_Product_Brief.pdf|ADM5120 Product Brief]] ​
 +  * [[http://​midge.vlad.org.ua/​datasheet/​ADM5120-1.14-22Dec03.pdf|ADM5120 Datasheet]] ​
 +  * [[http://​midge.vlad.org.ua/​datasheet/​MX29LV160T.pdf|MX29LV160T]] ​ [[http://​midge.vlad.org.ua/​datasheet/​MX29LV320T-B-1.4.pdf|MX29LV320T]] Flash
 +  * [[http://​midge.vlad.org.ua/​datasheet/​]]
 +== MIPS ==
 +  * IRC канал #mipsrus в сети freenode (CP-1251)
 +  * http://​user.it.uu.se/​~johanb/​kurser/​DS-DV/​HT02/​Progman/​hardware.html ​
 +  * http://​www.xtrj.org/​smr/​smr_chinese.htm ​
 +  * http://​vlad.org.ua/​adm5120/​datasheet/​4Kc_SoftwareUsersManual_01.17.pdf
 +
 +
 +
 +=== Купить ===
 +zft: http://​flyrouter.net/​
 +
 +===== Благодарности =====
 +Компании '​Агатис'​ http://​www.agatis.biz , которая является официальным дистрибутором фирм SWEEX и EDIMAX в Украине. А особенно Шафаренко Дмитрию - менеджеру по сбыту\\
 +Большое спасибо Андрею Ищенко и Адилю Изидинову за наводку,​ Воропай Александру,​ а также Игорю Залатову другу и "​HAM'​у"​.
 +
 +===== (с) =====
 +Vladislav Moskovets (Владислав Московец)\\
 +mail: adm5120 {at} vlad . org . ua\\
 +icq: 3703834 \\
 +Буду рад любым замечаниям,​ конструктивной критике,​ предложениям,​ дополнительной информации.
midge/ru_article.txt · Last modified: 2018/04/09 15:36 (external edit)