Однажды тихим вечером пятницы решил я обновить OpenWRT на своем домашнем роутере: иногда пропадал у него вайфай. Зря, как оказалось.
Итак, забираю я из SVN последние исходники, собираю новую прошивку, скидываю на роутер и успешно прошиваю. Вместо того, чтобы перезагрузиться и весело заморгать светодиодами, роутер зависает. Передёргивание питания и полное отсутствие каких-либо пакетов на LAN-интерфейсе показывает, что без последовательной консоли тут не обойтись.
Разобрав роутер, я лезу за преобразователем интерфейсов — и понимаю, что последний трёхвольтовый USB-UART у меня умер больше месяца назад, а новый сделать руки так и не дошли. Судорожный поиск чего-то на замену или хотя бы преобразователя уровней обнаружил лишь отладочную плату с процессором ARM. Не беда, UART есть и у него, а уровни совпадают.
За полчаса изучен даташит и написана крохотная программка, отправляющая и принимающая строки, но тут появляется ещё одна проблема. Чтобы зайти в консоль загрузчика и прошить роутер вручную, нужно набрать команду в течение секунды после появления приглашения. А плата отладочная, и, конечно, никакого интерфейса с компьютером, кроме внутрисхемного отладчика, на ней нет: на интерактивную консоль можно не рассчитывать.
Выход был найден такой: так как загружался девайс всегда одинаково, магическая комбинация «tpl» отправлялась после приёма символа с заданным номером. В одном из архивов найдена старая прошивка, TFTP-сервер запущен, команда на загрузку отдана… и примерно через десять пакетов меня ждёт таймаут с тем же результатом. «Акула проводов» подсказывает, что большая часть пакетов данных просто не доходит.
Уж не знаю, какая рыжая муза мне подсказала, но выяснилось, что если параллельно с загрузкой зафлудить устройство пингами, то не теряется ни единого пакета. И это при том, что на сами пинги загрузчик отвечать в принципе не умеет!
А роутер заработал. Только больше собирать свои прошивки я не буду.