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

Мировое сообщество энтузиастов не перестает удивлять попытками портирования легендарного DOOM на самые неожиданные устройства. Вдохновившись этим, я решил проверить возможности своего старого роутера TP-Link WR-841N. Как следует из названия, запустить культовый шутер мне не удалось, однако результатом изысканий стало глубокое погружение в архитектуру прошивок и успешно работающий «Тетрис» на борту маршрутизатора.

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

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

Стоит отметить, что модель TP-Link WR-841N насчитывает целых 14 аппаратных ревизий. В моем эксперименте использовалась версия V8, для которой и подготавливалась сборка с игрой.

Процесс разработки и отладки ПО немыслим без взаимодействия с системной консолью. Именно сюда транслируются диагностические сообщения в процессе загрузки и здесь же предоставляется доступ к командной оболочке Linux. Первым делом разберемся, как наладить этот канал связи.

Доступ к системной консоли

Алгоритм действий для подключения к консоли выглядит следующим образом:

  1. Вскрываем корпус устройства. Мне потребовалось выкрутить пару винтов и аккуратно разъединить пластиковые половины, стараясь не повредить фиксаторы. На печатной плате обычно предусмотрено четыре площадки для UART-интерфейса. На моем фото к ним уже припаяна соединительная гребенка.

Плата роутера TPlink WR-841N v8
Аппаратная платформа TP-Link WR-841N v8
  1. С помощью паяльника фиксируем контакты и определяем распиновку. Для данной модели она распределяется так:

Распиновка контактов UART-интерфейса TPlink WR-841N v8
Схема контактов UART для ревизии v8

Для работы нам понадобятся всего три линии: TX (передача), RX (прием) и GND (земля). Питание VCC подключать не нужно.

  1. Подключаем USB-UART адаптер к ПК и роутеру. Критически важно убедиться, что ваш переходник работает с логическими уровнями 3,3 В, характерными для этого устройства.

  2. В терминале Linux выполняем команду:

    sudo picocom -b 115200 /dev/ttyUSB0
    

Здесь 115200 — стандартная скорость обмена данными, а /dev/ttyUSB0 — путь к виртуальному порту адаптера.

  1. Подаем питание на роутер и наблюдаем лог загрузки в окне терминала:

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

    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"
    
  3. После завершения загрузки нажимаем Enter для доступа к интерфейсу входа:

    TL-WR841N mips #11 Thu Jul 24 17:24:48 CST 2014 (none)
    TL-WR841N login: 
    
  4. Для заводской прошивки логин обычно 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-контейнер.

  1. Подготовка структуры:

    mkdir -p tftp/boot
    cd tftp
    
  2. Создание 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"]
    
  3. Сборка и запуск:

    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.

  1. Подготовим среду сборки в Docker (Ubuntu 18.04 со всеми зависимостями).

  2. Сконфигурируем проект через make menuconfig, выбрав архитектуру Atheros AR7xxx и профиль для WR841N v8. Обязательно активируем ramdisk в настройках Target Images.

  3. Запустим компиляцию: make -j$(nproc).

Интеграция своего приложения (Тетрис)

Чтобы добавить игру в систему, нужно создать описание пакета для OpenWrt.

  1. Создаем директорию пакета и пишем Makefile, который опишет, как скачивать и собирать исходники.

  2. Используем готовый проект Micro Tetris.

  3. Для корректной работы в консоли UART потребуется наложить патч, исправляющий определение размеров экрана, так как стандартные вызовы ioctl могут отдавать неверные данные.

  4. После сборки прошивка с предустановленным тетрисом будет готова к загрузке.

Запуск и результат

После загрузки полученного файла tetris.bin по TFTP и старта системы достаточно ввести команду tetris в консоли. Благодаря ANSI-последовательностям, игра отлично отрисовывается прямо в терминале через последовательный порт.

Игра тетрис, запущеннная на роутере TPLink WR-841N
Процесс игры в Тетрис на аппаратных ресурсах роутера

Заключение

Работа с прошивками — это увлекательный процесс, который становится прозрачным при использовании инструментов вроде OpenWrt. Даже такое скромное устройство, как старый TP-Link, представляет собой полноценный компьютер на базе Linux, открытый для экспериментов.

Хотя объем памяти WR-841N накладывает серьезные ограничения, это лишь добавляет азарта при оптимизации. Возможно, в будущем удастся запустить полноценное современное ядро или даже вернуться к идее с DOOM.

© 2026 ООО «МТ ФИНАНС»

 

Источник

Читайте также