frost_11 (frost_11) wrote,
frost_11
frost_11

Categories:

Хак ради хака

Аппаратная начинка

Устройство WRV54G в целом очень напоминает изученный ранее NSLU2. 8Мб flash, 32Мб Ram, процессор XScale ixp425, работающий на частоте 266 МГц. Самое главное - на плате распаян слот miniPCI, и есть второй, разведённый, но не распаяный. Это позволяет подключить два произвольных miniPCI устройства, что делает возможности модернизации очень широкими. Хотя данный стандарт уже уходит, но пока ещё можно купить самые разнообразные устройства этого типа.

Программная начинка

Программное обеспечение маршрутизатора выполнено на базе пропиетарной платформы OpenRG. (Интересно, что здесь open?) Подробнее о ней можно почитать здесь. К сожалению, она не предоставляет каких-либо возможностей расширения и модернизации. Начальный загрузчик rgloader является закрытой разработкой и частному лицу найти документацию по его конфигурированию затруднительно. Формат официального firmware экзотический, и требует дополнительного изучения в случае его использования. Разбиение файловой системы в штатном варианте крайне неудачно - squashfs гораздо предпочтительнее.

Существующие недостатки приводят к выводу, что проще будет заменить её целиком. Описанные способы достучаться до консоли разнятся между собой, и, к сожалению, ни один из них не оказался действенным. Возможно, причиной этого стало отсутствие такой возможности в последних версиях прошивки, одна из которых была на моём маршрутизаторе, но старых версий обнаружить не удалось. Поэтому был выбран радикальный метод - JTAG.

Материалы по теме

Перед началом работ стоит ознакомится с имеющимися материалами, благо их в сети немало.

Сайт проекта openwrt. Базовая информация, содержит ошибки (!). Содержит ссылку на модернизированный вариант сборки RedBoot подключёнными модулями сетевых интерфейсов, который позволяет осуществить настройку через telnet.

Описание хакнутого устройства. Попытка создать тематический проект, который позже влился в openwrt, но полностью готового к употреблению решения не создал. Содержит ошибки (!)

Ещё одно подробное описание хакнутого устройства.

Материалы по семейству XScale ixp4xx

Материалы по установке  linux на аналогичное устройство NSLU2. Содержит множество полезных how-to, подходящих и для wrv54g. Навигация оставляет желать лучшего, и некоторые материалы доступны только при поиске. Например, как прошить начальный загрузчик при помощи JTAG.

Ещё один проект. Пример использования загрузчика RedBoot.

Доработки

Корпус крепится на саморезах, замаскированных под резиновыми ножками, и процесс разборки не представляет из себя ребуса.  Вид платы после снятия крышки представлен ниже. Фотография сделана post factum.
linksys wrv54g

Плата закреплена на пластиковых клапанах (1). Иных креплений не обнаружено. Особенностью данного роутера является наличие слота miniPCI, в котором установлен wifi адаптер на 54Мбит. Логичным желанием было бы его заменить на что-то более подходящее. Адаптер припаян к слоту в точках (2). Освободить его оттуда при помощи паяльника и оловоотсоса не представляет труда, но надо помнить, что после этого из-за оставшегося слоя олова слот не будет защёлкиваться при надавливании платы miniPCI, и металлические клапана надо отжимать, иначе есть риск сломать слот. Адаптер подключается к антенному проводу не через разъём, а просто припаян (5). В корпусе есть штатное место для установки второй антенны (7). Есть возможность напаять ещё один слот на плату (6), но это требует определённого навыка и хорошего оборудования. Для перепрошивки потребуется распаять разъём JTAG (3), для доступа к консоли - разъём последовательного порта (4).

Так выглядит плата после доработок.
linksys wrv54g

Больше никаких особенных возможностей для доработок плата не предоставляет. Даже найти слот miniPCI оказалось нереально сложно. Пожалуй, есть резон распаять и задействовать дополнительный светодиод, но у меня пока не дошли до этого руки.

Распайка разъёма JTAG

На плате под обозначением J2 находится разводка под стандартный 20-pin разъём JTAG. Схема разводки указана на фотографии ниже.
20pin JTAG

Схема разводки детально
c[] LED5+3.3V -- 1o o2 -- ncnTRST -- 3o o4 -- GNDTDI -- 5o o6 -- GNDTMS -- 7o o8 -- GNDTCK -- 9o o10 - GNDGND - 11o o12 - GNDTDO - 13o o14 - GNDnRESET - 15o o16 - GNDnc - 17o o18 - GNDnc - 19o o20 - GND
При распайке разъёма следует учесть, что отверстия выполнены с металлизацией, а толщина медных проводников на этой плате значительная и работает неплохим радиатором. То есть при попытке раплавить припой, тепло быстро отводится на всю поверхность платы. Чтобы очистить отверстия от припоя быстро, советую запастить паяльником помощнее - 40 Ватт как минимум. И оловоотсос как само собой разумеющееся.

Изготовление JTAG кабеля

Среди разработчиков JTAG кабель не является экзотикой, и в специализированных магазинах всегда можно купить готовый. Но обычно они стоят достаточно дорого, и для работы раз от разу эта покупка была бы нерациональной.

Чаще всего для подобных действий используется хакерский мод кабеля DLC5, также известного под названием Xilinx, Xilinx III, Parallel cable III. Но большая часть хакерских утилит, умеющая работать с ним, предназначена только для роутера wrt54g и мне не подходит. Универсальные утилиты лучше поддерживают другой тип кабеля - WIGGLER, который я модифицировал в том же ключе. Он так же подключается к LPT порту компьютера. Cхему привожу ниже.

wiggler hack mod

Этот мод, как и DLC5,  будет особенно чувствителен к качеству сборки и длине проводов, так как у него тоже отсутствует микросхема буфера. В качестве проводников я использовал обрезок ethernet кабеля длиной около 30 сантиметров. Его разноцветная изоляция помогает не запутаться во время пайки. Длины оказалось достаточно, а кабель работал безупречно.

Такой вид имеет готовый кабель
wiggler

На этом паяльник можно отложить.

Загрузчик

Наиболее очевидным является выбор загрузчика RedBoot. Это открытый программный продукт, хорошо документированный и распространяющийся по лицензии GPL, материалы по которому можно найти на официальном сайте. Аналогичное устройство NSLU2 также использует загрузчик RedBoot. Intel официально рекомендует его к использованию и предлагает исходный код и готовые сборки.

Предполагается, что штатным образом конфигурирование загрузчика осуществляется через терминал, но это делает обязательным распайку на плате устройства разъёма последовательного порта и создания устройства сопряжения. Однако существует самосборный вариант RedBoot с подключёнными модулями сетевых интерфейсов, который позволяет осуществить настройку через telnet. У некоторых готовых сборок от Intel тоже заявляется возможность работы через сеть, но я это не проверял. Кстати, сборка от Intel, и вышеуказанная самодельная сборка имеют одинаковую версию - 2.04.

Иногда в качестве загрузчика применяется u-boot, но материалов по нему (применительно к данному устройству) гораздо меньше и принципиальных преимуществ от такого выбора не видно.

Лирическое отступление

Потенциально есть возможность значительно упростить процесс формирования прошивки. Так как аппаратно WRV54g в известной степени совместим с NSLU2, то, используя загрузчик от прошивки NSLU2, при помощи кнопки Reset можно войти в инженерный режим, и далее, используя утилиту upslug2, обновить прошивку целиком. Этот процесс описан в моей предыдущей заметке.

По слухам, таким загрузчиком обладает прошивка Unslung версии 5.5. В более поздних версиях эта возможность заблокирована.

Извлечь загрузчик из прошивки можно посредством нижеследующей команды.

$ dd if=Unslung-5.5-beta.bin of=redboot.bin ibs=1 count=262144 conv=swab

Таким образом будет создан файл redboot.bin с загрузчиком.

Но на данном пути возникают следующие трудности. Во-первых, нет гарантии, что данный режим действительно работает на WRV54g. Во-вторых, для инициализации данного режима требуется очень точно выдержать паузу при нажатой кнопке Reset. У NSLU2 при этом начинал моргать светодиод, но для WRV54g может потребоваться аппаратная модификация. Поэтому я пошел по каноническому пути.Установка загрузчика
Для прошивки с помощью JTAG существует множество утилит. Одна из наиболее подходящих - UrJtag. Скачать её можно здесь. Пользоваться ей очень просто - она предоставляет консольный интерфейс с подробной справкой. Кроме того есть хороший справочник, который находится здесь. Особенно следует обратить внимание на третью главу, где описываются способы использования.

Запускаем приложение, попадаем в консоль. (Программируемое устройство в данный момент должно быть включено, а кабель подключён.)

jtag>

Самые важные команды. Список доступных команд

jtag> help

Справка по использованию команды

jtag> help <имя команды>

Можем приступать к работе. Сначала нужно инициализировать кабель.

jtag> cable WIGGLER parallel 0x378

Здесь WIGGLER - тип используемого кабеля.

parallel - тип используемого подключения.

0x378 - адрес порта. Нужно указать настоящий адрес порта. По молчанию он 0x378, но может быть и другим.


Теперь надо определить устройство.

jtag> detect

Появится сообщение с указанием типа процессора - ixp425. Отсутствие оного говорит об ошибках в конфигурации, или возможных проблемах с кабелем или устройством.

Инициализация шины. Делается для очистки совести, так как по умолчанию она уже инициализирована.

jtag> initbus ixp425

Инициализация flash памяти. Указывается начальный адрес с которого будет модифицироваться содержимое. Адрес flash начинается с 0x050000000 (пятёрка и семь нулей).

jtag> detectflash 0x050000000

Переход в режим bigEndian. Процессор ixp425 может работать и в bigEndian и в littleEndian режимах, но закрытые сетевые драйверы Intel поставляет только в bigEndian формате.

jtag> endian big

Создаём резервную копию образа. Запись данных из flash в файл на диске. Ещё раз напомню - скорость работы с самопальным кабелем составляет всего 86 байт в секунду. То есть 8Мб будут считываться 27 часов 5 минут.

jtag> readmem 0x050000000 0x0800000 backup.bin

Здесь 0x050000000 - начальный адрес;
0x0800000 - общее количество считанных байт в hex формате. (8Мб в данном случае)
backup.bin - имя файла, куда будет происходить сохранение.

Желательно записать данные в файл несколько раз, а потом сравнить полученные результаты. Если кабель работает хорошо, то результаты отличаться не будут. Различия указывают на недостаточную мощность LPT-порта или большие потери в кабеле. Впору задуматься о полноценном варианте кабеля.

Очистка flash. Тоже выполняется на всякий случай - при записи блоки предварительно очищаются.

jtag> eraseflash 0x050000000 8

Здесь 0x050000000 - начальных адрес, с которого выполняется очистка.
8 - размер очищаемой области в блоках. В моём случае каждый блок - 64Кб.

Запись образа во flash.

jtag> flashmem 0x050000000 redboot-ROM.bin

Здесь 0x050000000 - начальный адрес.
redboot-ROM.bin - имя записываемого образа

После записи программа проверяет записанное.  На этом устройство можно выключить и отключить кабель JTAG.

Подготовка образов

В данном случае выбор OpenWRT будет практически безальтернативным. Во-первых, он поддерживает устройства на чипе ixp425. Во-вторых, это полнофункциональный дистрибутив linux, содержащий необходимую мне функциональность. И самое главное - в процессе сборки создаются образы, предназначенные для заливки в flash.

Для работы понадобится собрать openwrt-gtwx5715-zImage и openwrt-ixp4xx-squashfs.img из исходников, которые можно взять здесь. На момент написания статьи была доступна версия 8.09.2, но со временем она может обновиться. Собранный по умолчанию openwrt-ixp4xx-zImage брать не стоит, так как он не содержит модуля, поддерживающего сетевой интерфейс.

Данная версия содержит необходимые патчи для моего роутера, но почему-то они находятся в дезактивированном состоянии. Найдём упоминания о поддерживаемых устройствах.

> grep -R nslu2 *

Интересующий файл находится по адресу

./scrips/arm-magic.sh

В нём нужно описать "boadname machtypeid". Зная, что плата роутера именуется как gwtx5715, отправим соответствующий запрос в поиск. Обнаруживается, что MachTypeId соответствует 641. Внесём эту правку в файл.

for board in "gtwx5715 641" "avila 526"....

Теперь необходимо настроить сборку образа

> make menuconfig

В этом меню выбираем

Target System -> Intel IXP4xx[2.6]
Target Images -> jffs2,squashfs
Kernel-modules -> Network devices -> kmod-ixp4xx-npe
Kernel-modules -> Other modules-> kmod-spi-ks8995

Теперь сборка

> make -j2

Если всё было правильно, то мы получим образы openwrt-gtwx5715-zImage и openwrt-ixp4xx-squashfs.img

Главное достоинство подключения по сети - возможность быстрой заливки образов и сохранения резервных копий. Для этого требуется поднять tftp или http сервер. Для моего OpenSuSe он есть в составе дистрибутива. Для Windows наиболее известен tftpd32, который можно взять здесь.

Размещаем скачанные образы openwrt-gtwx5715-zImage и openwrt-ixp4xx-squashfs.img в корневой папке сервера. Для моего OpenSuSe это будет /tftpboot.

Прошивка

Если всё было сделано согласно данной инструкции, и была прошита сборка RedBoot, поддерживающая сеть, то дальше можно работать через telnet. Для указанной сборки после загрузки будет активирован интерфейс eth0, ip адрес - 192.168.1.1, маска подсети 255.255.255.0, порт - 9000. (Если использовать сборку не поддерживающую сеть, то подключиться к терминалу можно через последовательный порт, но для этого необходимо изготовить или купить преобразователь, что не всегда охота. С другой стороны, без него прийдётся настраивать устройство вслепую, что зачастую неудобно).

Подключаем сетевой кабель к порту WAN. Где-то через три минуты после включения, устройство будет готово к работе. Пингуем порт

> ping 192.168.1.1

Подключаемся по telnet

> telnet 192.168.1.1 9000

После этого должна появится командная строка RedBoot.

RedBoot>

Инициализируем Flash Image System (FIS) и всю flash память, за исключением первых блоков, где находится сам загрузчик.

RedBoot> fis init -f

Соглашаемся с предложением отформатировать разделы. После этого смотрим, что получилось

RedBoot> fis list
Name              FLASH addr  Mem addr    Length      Entry pointRedBoot           0x50000000  0x50000000  0x00080000  0x00000000FIS directory     0x507E0000  0x507E0000  0x0001F000  0x00000000RedBoot Config    0x507FF000  0x507FF000  0x00001000  0x00000000
Сам загрузчик занял раздел размером в 0x080000 байт (512 кБайт). Это многовато по меркам RedBoot и при меньшем объёма ROM может стать критическим недостатком, но это плата за возможность не делать преобразователь для подключения по последовательному порту.

Ещё одно отступление

Если в процессе настройки прошивка придёт в неработоспособное состояние, то для возвращение в исходное состояние достаточно стереть блоки с конфигурацией используя JTAG. Опуская описания промежуточных действий, это выглядит так.

jtag> cable WIGGLER parallel 0x378
...
jtag> detect
...
jtag> initbus ixp425
...
jtag> detectflash 0x050000000
...
jtag> eraseflash 0x0507D0000 3

После этого консоль RedBoot снова станет доступна. (Загрузка образов, разумеется, не произойдёт). Заливка образа по сети выполняется следующей командой

RedBoot> load -r -b %{FREEMEMLO} -h 192.168.1.20 openwrt-gtwx5715-zImage

Здесь FREEMEMLO - переменная, которая установилась после выполнения команды fis init, адрес сервера tftp - 192.168.1.20, имя файла с образом ядра - openwrt-gtwx5715-zImage.

Несмотря на правильность настроек, с высокой степенью вероятности на эту команду получим следующее.

Using default protocol (TFTP)
Can't load ''openwrt-gtwx5715-zImage': invalid parameter

Причина такого поведения непонятна. Однако после перезагрузки и переустановки связи больше не проявляется.
RedBoot> reset

На этом связь естественно теряется. Переустанавливаем соединение.

> ping 192.168.1.1
...
> telnet 192.168.1.1 9000
...
RedBoot> fis init

Теперь загрузка образа должна пройти без проблем

RedBoot> load -r -b %{FREEMEMLO} -h 192.168.1.20 openwrt-gtwx5715-zImage

Создаём раздел в flash. Дополнительные параметры вводить не обязательно - образ будет создан по значениям, полученным в процессе загрузки.

RedBoot> fis create kernel

Следующий шаг - загрузка и создание образа корневой файловой системы. Так как она будет использоваться ещё и для установки дополнительных пакетов, разумно зарезервировать для неё всё оставшееся место.

Смотрим текущее состояние флеш

RedBoot> fis list
Name              FLASH addr  Mem addr    Length      Entry point
RedBoot 0x50000000 0x50000000 0x00080000 0x00000000
kernel 0x50080000 0x00024C00 0x00100000 0x00024C00
FIS directory 0x507E0000 0x507E0000 0x0001F000 0x00000000
RedBoot Config 0x507FF000 0x507FF000 0x00001000 0x00000000Таким образом осталось 0x507E0000 - (0x50080000 + 0x00100000) = 0x0660000 байт (6528 кБайт).

Расчистим память, чтобы не забивать флеш мусором

RedBoot> mfill -b %{FREEMEMLO} -l 0x0660000 -p 0

Затем загружаем образ файловой системы squashfs

RedBoot> load -r -b %{FREEMEMLO} -h 192.168.1.20 openwrt-ixp4xx-squashfs.img

Точно так же создаём раздел

RedBoot> fis create -b %{FREEMEMLO} -l 0x0660000 rootfs

После чего файловая система принимает следующий вид.

RedBoot> fis list
Name              FLASH addr  Mem addr    Length      Entry point
RedBoot 0x50000000 0x50000000 0x00080000 0x00000000
zImage 0x50080000 0x00024C00 0x00100000 0x00024C00
rootfs 0x50180000 0x00024C00 0x00660000 0x00024C00
FIS directory 0x507E0000 0x507E0000 0x0001F000 0x00000000
RedBoot Config 0x507FF000 0x507FF000 0x00001000 0x00000000Осталось только ввести правильные настройки.

Настройка загрузчика

1F9C400
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment