Восстановление маршрутизатора TP-Link TL-WR841N
Так как я сейчас живу не у себя дома, то некоторое количество статей будет посвящено обзору и ремонту имеющейся здесь техники.
Когда я приехал в этот дом, то обнаружил, что в розетку были включены маршрутизатор TP-Link TL-WR841N и ONU BDCOM P1501DT. По внешнему виду, оба устройства исправно работали. Необходимые светодиоды светились, оптический линк присутствовал, а маршрутизатор посылал в радиоэфир beacon’ы с SSID Wi-Fi сети.
Так как на тот момент у меня имелся безлимитный мобильный Интернет на несколько месяцев вперёд, то никакого желания интересоваться как пополнить счет местного Интернет-провайдера не возникало. Поэтому, оба устройства были без какого-либо зазрения совести отключены от питающей сети.
Но время шло и срок безлимитного мобильного Интернета подходил к концу. Настал момент воспользоваться услугами местного Интернет-провайдера. Оба устройства были снова включены в розетку. И вот тут началось самое интересное. Если ONU-шка запустилась без проблем, то маршрутизатор начал циклически перезагружаться:
Как же так? Что могло произойти? Первая мысль была о том, что всему виной блок питания. Возможно, устройство начинает загружаться, повышается энергопотребление, а блок питания с этим не справляется и происходит перезагрузка.
Подобные импульсные блоки питания не редко выходят из строя. Высыхают, а иногда и взрываются, электролитические конденсаторы в выходных фильтрующих цепях. А в некоторых, как например у блоков питания от старых точек доступа и маршрутизаторов D-Link, вообще стандартная «болезнь» — высыхание от перегрева сетевой 400-вольтовой «банки» (электролитического конденсатора, установленного после выпрямителя сетевого напряжения). После чего блок питания перестаёт работать.
Получив добро на ремонт, я не стал сразу разламывать клеенный корпус блок питания, а решил первым делом разобрать сам маршрутизатор. Тем более, что на его плате имеется и свой «блок питания» — мощный DC-DC преобразователь с большими электролитическими конденсаторами. Но замерив как входное напряжение, так и напряжения на всех питающих линиях устройства, стало ясно, что питание тут не причём.
По потребляемому току так же видно, что запуск устройства происходит, но затем следует перезагрузка:
В последний раз я сталкивался с восстановлением маршрутизаторов много лет назад, поэтому некоторые моменты пришлось восстанавливать в памяти. А чтобы в следующий раз к этому не возвращаться — решил написать эту небольшую статью. В ней ничего нового для тех, кто в теме. Но, возможно, кому-то она поможет.
Подключаемся к маршрутизатору по UART
Первым делом в сложившейся ситуации необходимо выяснить: запускается ли сам загрузчик u-boot или же устройство перезагружается по какой-то другой причине, например сторожевому таймеру (watchdog timer)? А если загрузчик запускается, то какую информацию он выводит? А какие сообщения успевает вывести ядро Linux?
Для подключения к последовательному интерфейсу маршрутизатора необходимо знать, где на печатной плате расположены соответствующие контакты этого самого UART (универсального асинхронного приёмо-передатчика). Это могут быть как контактные площадки разведённые под установку разъёма (как в нашем случае), так и просто дорожки, ведущие на какие-нибудь радиокомпоненты или тест-поинты. Иногда сигналы интерфейса UART подписаны шелкографией прямо на печатной плате. Но чаще всего информацию придётся искать в сети Интернет.
Замечу, что производители техники любят в одном и том же корпусе под одной и той же моделью продавать абсолютно разные устройства, собранные на абсолютно разных микросхемах SoC (System-on-Chip). Соответственно, прошивки у них так же не совместимы между собой. Но кроме прошивок и чипов, могут отличаться и скорость интерфейса UART, а так же расположение и «распайка» контактов на печатной плате в пределах одного модельного ряда.
В моём случае, маршрутизатор имеет аппаратную версию Ver.8.2, что указано на наклейке с нижней стороны корпуса. Эта версия имеет следующее расположение сигналов последовательного интерфейса на плате:
Подключение к компьютеру проще всего производить через переходник USB-UART. При этом не стоит забывать, что используется перекрёстное соединение сигнальных линий. То есть вход приёмника (RX) переходника подключается к выходу передатчика последовательного интерфейса в маршрутизаторе (TX) и наоборот, TX переходника — к RX маршрутизатора. Питание +3,3 В подключать не нужно.
В аппаратной версии маршрутизатора Ver. 8.2 используются следующие параметры соединения: скорость — 115200, формат данных — 8N1.
Стоит отметить, что необходимо использовать переходник, работающий с сигналами 3,3-вольтовой логики. Подключение какого-нибудь китайского переходника USB-UART на микросхеме CH340E, ни к чему не приведет. В окне терминала будет отображаться только «мусор».
К счастью, у меня в наличии оказался кабель на микросхеме Prolific PL2303. Из-за того, что данная микросхема давно скопирована и подделывается, производитель прекратил её поддержку и блокирует работу с микросхемой в своих официальных драйверах для ОС MS Windows. Так что тем, кто пользуется этой операционной системой, необходимо будет вручную установить более старую версию драйвера и запретить его обновление. Более подробную информацию об этом можно найти в Интернете.
Итак, кабель подключён. Включаю маршрутизатор и вижу следующее:
Вот так дела! Загрузчик стартует, но в процессе распаковки ядра Linux происходит ошибка. Похоже, что испорчены данные во флеш-памяти или имеются какие-то проблемы с микросхемой оперативной памяти (RAM).
Восстанавливаем маршрутизатор через U-BOOT и TFTP
Первым делом нужно попасть в консоль загрузчика. Для этого необходимо в течение секунды (в промежутке между окончанием запуска загрузчика и моментом, когда он перейдёт к загрузке ядра операционной системы) успеть набрать на клавиатуре три символа «tpl».
Если всё получилось, то вместо начала запуска ОС, загрузчик выведет приветствие:
wasp>
Справку по командам можно получить введя «help»:
Как видно, загрузчик даже имеет простой тест оперативной памяти (simple RAM test). Но беглый поиск по Интернету не дал никакого внятного объяснения как им пользоваться.
Если его просто запустить, то всё это дело «зависает» на процессе записи нулей по неизвестным адресам памяти. Если указать в качестве параметров начальный адрес ОЗУ в адресном пространстве процессора (0x80000000), конечный адрес для 32M памяти и шаблон (pattern), которым будет заполняться память, то так же ничего не происходит. А если во втором параметре указать размер тестируемой памяти, то что-то происходит, но явно не то, что ожидалось.
Так что я решил не тратить время и не разбираться как это всё работает. Ведь если оперативная память «битая», то и прошивку восстановить не удастся.
Подготовка образа прошивки и сервера
Перед прошивкой образа необходимо его «подготовить» или найти в Интернете образ с обрезанной прошивкой (не содержащей раздел с бутлоадером). Для официальной прошивки TP-Link это должен быть файл не содержащий в своём имени слово «boot».
Я же не стал тратить время на поиск необходимого файла, а скачал последнюю версию официальной прошивки с сайта производителя. После чего вырезал из файла образа первые 131 584 байт (для аппаратной версии Ver. 8), как это описано на вики OpenWRT:
dd if=wr841nv8_ru_3_14_20_up_boot\(140228\).bin of=tplink.bin skip=257 bs=512
Теперь необходимо установить TFTP-сервер и положить в каталог для выдачи файлов подготовленный образ. А ещё желательно его переименовать во что-то более короткое, например «tplink.bin».
В операционной системе MS Windows удобным вариантом может оказаться установка TFTP-сервера Tftpd32 или Tftpd64. Я же для этой процедуры воспользовался TFTP-севером tftpd-hpa для OC Linux.
После того как всё готово, можно приступать непосредственно к восстановлению.
Загружаем образ в оперативную память через TFTP
Процесс восстановления прошивки маршрутизатора начинается с загрузки файла прошивки по протоколу TFTP в оперативную память устройства.
Для того, чтобы связь между TFTP-сервером и маршрутизатором состоялась, необходимо указать в соответствующих переменных окружения загрузчика IP-адреса сервера и маршрутизатора. Пусть на компьютере, на котором запущен TFTP-сервер, статически установлен адрес 192.168.1.1, а маршрутизатору мы присвоили IP-адрес 192.168.1.2:
setenv ipaddr 192.168.1.2
setenv serverip 192.168.1.1
Можно, в принципе, воспользоваться настройками IP-адресов, которые сохранены в настройках u-boot. Для этого достаточно найти их значения в списке переменных окружения. Вывод списка переменных окружения осуществляется по команде:
printenv
Загрузка образа в оперативную память производится командой tftboot. В качестве параметров указываются начальный адрес, по которому будет происходить загрузка, и имя файла образа, находящегося на TFTP-сервере:
tftpboot 0x80000000 tplink.bin
Очищаем область флеш-памяти и записываем в неё образ
Далее необходимо очистить область флеш-памяти, в которую будет записан загруженный в оперативную память образ:
erase 0x9f020000 +0x3c0000
Тут главное не ошибиться в адресе или количестве стираемых байт. Ведь можно стереть то, чего потом не восстановить. Например, ART-раздел, содержащий калибровочные данные радиомодуля.
Осталось сохранить образ микропрограммы из оперативной памяти во флеш-память:
cp.b 0x80000000 0x9f020000 0x3c0000
Как видно, в команде cp.b в качестве параметров выступает начальный адрес данных в оперативной памяти, начальный адрес данных во флеш-памяти и количеств записываемых байт.
Результат проделанных операций должен выглядеть так:
На этом процесс прошивки завершён. Остаётся запустить записанную микропрограмму из флеш-памяти и проверить как она исполняется. Для этого можно выключить и включить питание устройства, или же выполнить команду:
bootm 0x9f020000
Маршрутизатор восстановлен
При первой загрузке устройства нужно внимательно анализировать всю информацию, которая выводится через UART. Это могут быть как неожиданные сообщения ядра Linux, так и ошибки от других программ. Ведь изначальная проблема, выразившаяся в искажении содержимого флеш-памяти, может скрываться где-то ещё.
В моём же случае никаких настораживающих сообщений об ошибках замечено не было. Можно смело сказать, что маршрутизатор был успешно восстановлен.
Осталось изменить IP-адрес в настройках сетевой карты компьютера и зайти на веб-интерфейс устройства:
Всё работает. Теперь можно произвести настройку маршрутизатора и пользоваться им по назначению.
Заключение
Так что же могло стать причиной искажения данных в микросхеме флеш-памяти? Быть может это высокоэнергетическая частица из далёкого космоса, пробившаяся через магнитосферу и прочие защитные слои Земли, прошла через кристалл микросхемы флеш-памяти и изменила заряд на изолированном затворе одного или нескольких транзисторов? Отрицать этого, конечно, нельзя. А может где-то рядом с маршрутизатором находится источник радиоактивного или рентгеновского излучения? Но в этом бы случае, неисправность возникла бы куда раньше. Или же это просто банальный брак при производстве микросхемы и заряд с затвора стёк значительно раньше гарантийного срока хранения данных?
К сожалению, ответа на этот вопрос мы никогда не узнаем. Но факт есть факт: за несколько месяцев, пока маршрутизатор был отключён от электросети, в микросхеме флеш-памяти произошло изменение содержимого. Это привело к невозможности загрузки маршрутизатора, так как изменения затронули область, в которой хранилось ядро ОС Linux.
Хочется так же заметить, что в маршрутизаторе TL-WR841N, начиная с аппаратной версии Ver.8, имеется возможность восстановления прошивки используя только u-boot и TFTP. Для этого необходимо установить IP-адрес TFTP-сервера: 192.168.0.66, а файл с прошивкой переименовать в «mr3420v2_tp_recovery.bin» или «wr841nv8_tp_recovery.bin» (для Ver. 8.4). После этого, удерживая нажатой кнопку «Reset», необходимо включить устройство. Но в моём случае этот способ восстановления не был актуален, так как нужно было выяснить причину циклической перезагрузки маршрутизатора.
Подключение маршрутизатора к компьютеру необходимо осуществлять через USB-UART преобразователь, работающий с сигналами 3,3 — вольтовой логики.
При записи данных во флеш-память необходимо быть очень внимательным при вводе адресов и количества пересылаемых байт. Структура данных в постоянной памяти содержит несколько логических разделов, в том числе и ART-раздел (Atheros Radio Test), находящийся в самом конце адресного пространства. Для маршрутизатора TP-Link TL-WR841N аппаратной версии Ver. 8 это актуально, так как эта версия построена на чипе Atheros AR9341.
Этот раздел хранят калибровочные настройки радиомодуля. Калибровка производится на производстве и настраивает рабочие режимы конкретного экземпляра микросхемы в конкретной плате. Эти настройки нельзя просто так взять и заменить настройками с другого маршрутизатора этой же серии. А если это сделать, то можно столкнуться с нестабильной работой устройства. Я уже имел такой опыт много лет назад, когда данные во флеш-памяти были настолько испорчены, что пришлось залить фуллфлеш (fullflash, полный образ содержимого флеш-памяти устройства) от другого маршрутизатора той же модели. После этой процедуры маршрутизатор хоть и ожил, но стал периодически виснуть, перезагружаться, а Wi-Fi связь стала работать нестабильно.