
Мировое сообщество энтузиастов не перестает удивлять попытками портирования легендарного DOOM на самые неожиданные устройства. Вдохновившись этим, я решил проверить возможности своего старого роутера TP-Link WR-841N. Как следует из названия, запустить культовый шутер мне не удалось, однако результатом изысканий стало глубокое погружение в архитектуру прошивок и успешно работающий «Тетрис» на борту маршрутизатора.
Важное предупреждение: любые описанные ниже действия вы совершаете на собственный страх и риск. Прежде чем приступать к манипуляциям с аппаратной частью, необходимо четко осознавать возможные последствия, включая риск превращения устройства в «кирпич». Тот факт, что мой экземпляр уцелел, не гарантирует аналогичного исхода для вас.
Значительная часть представленной информации актуальна и для других моделей сетевого оборудования. В любом случае, этот материал позволит вам взглянуть на программную начинку роутеров под другим углом, если вы ранее не интересовались вопросами низкоуровневой разработки.
Стоит отметить, что модель TP-Link WR-841N насчитывает целых 14 аппаратных ревизий. В моем эксперименте использовалась версия V8, для которой и подготавливалась сборка с игрой.
Процесс разработки и отладки ПО немыслим без взаимодействия с системной консолью. Именно сюда транслируются диагностические сообщения в процессе загрузки и здесь же предоставляется доступ к командной оболочке Linux. Первым делом разберемся, как наладить этот канал связи.
Доступ к системной консоли
Алгоритм действий для подключения к консоли выглядит следующим образом:
-
Вскрываем корпус устройства. Мне потребовалось выкрутить пару винтов и аккуратно разъединить пластиковые половины, стараясь не повредить фиксаторы. На печатной плате обычно предусмотрено четыре площадки для UART-интерфейса. На моем фото к ним уже припаяна соединительная гребенка.

-
С помощью паяльника фиксируем контакты и определяем распиновку. Для данной модели она распределяется так:

Для работы нам понадобятся всего три линии: TX (передача), RX (прием) и GND (земля). Питание VCC подключать не нужно.
-
Подключаем USB-UART адаптер к ПК и роутеру. Критически важно убедиться, что ваш переходник работает с логическими уровнями 3,3 В, характерными для этого устройства.
-
В терминале Linux выполняем команду:
sudo picocom -b 115200 /dev/ttyUSB0
Здесь 115200 — стандартная скорость обмена данными, а /dev/ttyUSB0 — путь к виртуальному порту адаптера.
-
Подаем питание на роутер и наблюдаем лог загрузки в окне терминала:
U-Boot 1.1.4 (Jun 20 2013 - 17:34:51) U-boot AP123 DRAM: 32 MB id read 0x100000ff Flash: 4 MB Using default environment In: serial Out: serial Err: serial Net: ag934x_enet_initialize... wasp reset mask:c03300 WASP ----> S27 PHY file: ag934x.c,line: 179==: set LAN&WAN SWAP. --debug by HouXB GMAC: cfg1 0x5 cfg2 0x7114 eth0: ba:be:fa:ce:08:41 s27 reg init athrs27_phy_setup ATHR_PHY_CONTROL 4: 0x1000 athrs27_phy_setup ATHR_PHY_SPEC_STAUS 4: 0x10 eth0 up WASP ----> S27 PHY file: ag934x.c,line: 179==: set LAN&WAN SWAP. --debug by HouXB GMAC: cfg1 0xf cfg2 0x7214 eth1: ba:be:fa:ce:08:41 s27 reg init lan ATHRS27: resetting s27 ATHRS27: s27 reset done athrs27_phy_setup ATHR_PHY_CONTROL 0: 0x1000 athrs27_phy_setup ATHR_PHY_SPEC_STAUS 0: 0x10 athrs27_phy_setup ATHR_PHY_CONTROL 1: 0x1000 athrs27_phy_setup ATHR_PHY_SPEC_STAUS 1: 0x10 athrs27_phy_setup ATHR_PHY_CONTROL 2: 0x1000 athrs27_phy_setup ATHR_PHY_SPEC_STAUS 2: 0x10 athrs27_phy_setup ATHR_PHY_CONTROL 3: 0x1000 athrs27_phy_setup ATHR_PHY_SPEC_STAUS 3: 0x10 eth1 up eth0, eth1 Autobooting in 1 seconds ## Booting image at 9f020000 ... Uncompressing Kernel Image ... OK ........ -
В процессе вывода можно обнаружить полезные сведения, например, структуру разделов флеш-памяти:
5 cmdlinepart partitions found on MTD device ath-nor0 Creating 5 MTD partitions on "ath-nor0": 0x000000000000-0x000000020000 : "u-boot" 0x000000020000-0x000000120000 : "kernel" 0x000000120000-0x0000003e0000 : "rootfs" 0x0000003e0000-0x0000003f0000 : "config" 0x0000003f0000-0x000000400000 : "art" -
После завершения загрузки нажимаем
Enterдля доступа к интерфейсу входа:TL-WR841N mips #11 Thu Jul 24 17:24:48 CST 2014 (none) TL-WR841N login: -
Для заводской прошивки логин обычно
root, а пароль —sohoadmin. Стоит учесть, что в новых моделях средства безопасности гораздо серьезнее.
Следующий этап — запуск собственного кода. Простого копирования исполняемого файла, как на десктопе, здесь недостаточно. Стандартные прошивки крайне ограничены в ресурсах. Альтернативные системы, такие как OpenWrt, предлагают богатый функционал и пакетный менеджер, но для TP-Link WR-841N свободного места на флеш-чипе катастрофически мало.
Режимы работы загрузчика
Понимание механизмов работы загрузчика — ключ к модификации ПО. Помимо штатной загрузки, существуют режим восстановления (считывание и запись образа на чип) и интерактивный режим (ручной ввод команд консоли).
Управление U-Boot
На большинстве устройств TP-Link используется кастомизированный U-Boot. Чтобы войти в интерактивное меню, необходимо в момент появления строки Autobooting in 1 seconds быстро напечатать tpl.
Команда help выведет список доступных функций. В моей версии их немного, но этого достаточно для манипуляций с памятью и сетевой загрузки.
Технические характеристики
Маркетинговые данные на коробке бесполезны для разработчика. Нам нужны реальные спецификации «железа»:
-
Используемый SoC (система на чипе);
-
Архитектура команд процессора (ISA);
-
Модели чипов WiFi и Ethernet;
-
Объем оперативной и флеш-памяти;
-
Разметка разделов и тип стокового загрузчика.
Эту информацию часто можно найти в вики проекта OpenWRT. Для TP-Link WR-841N v8 параметры следующие:
|
Параметр |
Спецификация |
|---|---|
|
SoC |
Atheros AR9341 |
|
Ethernet / WiFi |
Интегрированы в чипсет |
|
ISA |
MIPS32 |
|
Процессор |
MIPS 24Kc @ 560 MHz |
|
ОЗУ (RAM) |
32 MB |
|
Flash-память |
4 MB SPI NOR |
Эти данные определяют выбор тулчейна (набора инструментов для компиляции) и понимание порядка байтов (Endianness). Ограничения по памяти диктуют жесткие условия оптимизации.
Карта памяти
Для безопасной работы важно представлять структуру адресного пространства.
Разметка флеш-памяти:
|
Раздел |
Смещение |
Размер |
Назначение |
|---|---|---|---|
|
u-boot |
0x000000 |
128 КБ |
Первичный загрузчик и консоль |
|
firmware |
0x020000 |
3904 КБ |
Область ядра и файловой системы |
|
config |
0x3e0000 |
64 КБ |
Пользовательские настройки |
|
art |
0x3f0000 |
64 КБ |
Калибровки радиомодуля и MAC |
Распределение ОЗУ:
|
Область |
Адрес |
|---|---|
|
Распаковка ядра |
0x80000000 |
|
Буфер загрузки по TFTP |
0x81000000 |
|
Маппинг флеш-памяти |
0x9f000000 |
Будьте предельно осторожны с разделами boot и art. Их повреждение приведет к необходимости использования программатора или сложным манипуляциям с «прищепкой». В art хранятся уникальные калибровки WiFi для вашего экземпляра; их потеря неизбежно ухудшит качество беспроводной связи.
Механика загрузки
Большинство роутеров функционируют под управлением Linux. Загрузчик извлекает ядро из флеш-памяти в оперативную по заданному адресу и передает ему управление.
Для ручного запуска используется команда:
bootm 0x9f020000
Также возможна загрузка по сети через TFTP. Сначала скачиваем образ в ОЗУ, затем запускаем:
tftpboot 0x81000000 firmware.bin
bootm 0x81000000
Параметры сетевого окружения (IP сервера и роутера) можно узнать через printenv.
Развертывание TFTP-сервера
Для Linux проще всего использовать Docker-контейнер.
-
Подготовка структуры:
mkdir -p tftp/boot cd tftp -
Создание Dockerfile:
FROM busybox:latest RUN echo "69 dgram udp wait root tftpd tftpd -c /tftpboot" > /etc/inetd.conf EXPOSE 69/udp CMD ["inetd", "-f", "-e", "/etc/inetd.conf"] -
Сборка и запуск:
sudo docker build -t simple-tftp . sudo docker run --rm -p 192.168.1.100:69:69/udp -v $(pwd)/boot:/tftpboot --name simple-tftp -it simple-tftp
Компиляция кастомной прошивки
Поскольку современные версии OpenWrt слишком тяжелы для 32 МБ ОЗУ, воспользуемся веткой 19.07.8 и соберем минималистичный образ типа initramfs.
-
Подготовим среду сборки в Docker (Ubuntu 18.04 со всеми зависимостями).
-
Сконфигурируем проект через
make menuconfig, выбрав архитектуру Atheros AR7xxx и профиль для WR841N v8. Обязательно активируемramdiskв настройках Target Images. -
Запустим компиляцию:
make -j$(nproc).
Интеграция своего приложения (Тетрис)
Чтобы добавить игру в систему, нужно создать описание пакета для OpenWrt.
-
Создаем директорию пакета и пишем
Makefile, который опишет, как скачивать и собирать исходники. -
Используем готовый проект Micro Tetris.
-
Для корректной работы в консоли UART потребуется наложить патч, исправляющий определение размеров экрана, так как стандартные вызовы
ioctlмогут отдавать неверные данные. -
После сборки прошивка с предустановленным тетрисом будет готова к загрузке.
Запуск и результат
После загрузки полученного файла tetris.bin по TFTP и старта системы достаточно ввести команду tetris в консоли. Благодаря ANSI-последовательностям, игра отлично отрисовывается прямо в терминале через последовательный порт.

Заключение
Работа с прошивками — это увлекательный процесс, который становится прозрачным при использовании инструментов вроде OpenWrt. Даже такое скромное устройство, как старый TP-Link, представляет собой полноценный компьютер на базе Linux, открытый для экспериментов.
Хотя объем памяти WR-841N накладывает серьезные ограничения, это лишь добавляет азарта при оптимизации. Возможно, в будущем удастся запустить полноценное современное ядро или даже вернуться к идее с DOOM.
© 2026 ООО «МТ ФИНАНС»


