Найти в Дзене
mamaich

Интерактивный u-boot на Яндекс ТВ Станции

Когда я приобрёл себе домой ТВ Станцию, меня порадовало наличие в ней доступа к ADB. Собственно, мой первый публичный хак появился благодаря этому - отлаживал его я на ТВ Станции. Но, по неведомым мне причинам, производитель решил урезать функционал принадлежащего мне устройства, не уведомив об этом меня как потребителя. Я считаю, что эта ошибка возникла случайно, и как правомерный обладатель имею полное право этот баг устранить. В данной статье я не расскажу, как включить ADB, а только приведу подготовительную информацию. Возможно, кому-то будет это интересно.
Как обычно сообщаю, что информация, приведенная в данной статье является неофициальной, может не работать на вашем конкретном устройстве, а повторение описанных далее действий вы производите на свой страх и риск. Для начала потребуется разобрать свой ТВ: Слева находится материнская плата, которую необходимо снять, чтобы припаяться к диагностическому разъему, любезно оставленному нам инженерами Яндекс. Распиновка контактов нам

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

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

Для начала потребуется разобрать свой ТВ:

Слева находится материнская плата, которую необходимо снять, чтобы припаяться к диагностическому разъему, любезно оставленному нам инженерами Яндекс.

-2

Распиновка контактов нам знакома по Станции Макс:

1. DP - USBOTG D+
2. DM - USBOTG D-
3. GND
4. TXD - UART0_TX
5. RXD - UART0_RX
6. POC1 - кнопка вызова Алисы
7. GND

Этот же USB выведен на верхний боковой USB разъем, так что припаиваться к DP/DM нет смысла. Контакт POC1, если по аналогии с Яндекс Станцией Макс, должен переключать режим загрузки колонки на USB, но у меня он работал как вызов Алисы кнопкой внизу экрана. Кстати, кнопка чуть ниже разъема Ethernet - это тоже вызов Алисы.
В любом случае режим загрузки устройства с USB нам бесполезен, так как все платы с завода идут с паролем, который известен только Яндексу.

С обратной стороны платы требуется припаяться к точке на фото:

-3

Она находится рядом с надписью EMMC_D5 ближе к кондёру СЕ1. Вызванивал точки не я, и я даже не знаком с этим человеком - но очень ему благодарен.
Данная точка = D0 для EMMC и далее мы будем ее коротить на землю, чтобы сломать штатный процесс загрузки устройства.

Обычно, в устройствах Яндекса на процессорах Amlogic в случае неуспешной загрузки с EMMC, u-boot пытается запустить режим восстановления с SD карты (при наличии) и USB, загружая и запуская на исполнение скрипт aml_autoscript.
Если "поломать" работу EMMC, то тем самым мы можем провалиться в загрузку с USB и выполнить aml_autoscript с нашими командами u-boot.

Сперва готовим флешку с нужными нам командами. Нам нужна флешка с файловой системой FAT (в моем случае я просто взял старую флешку отсюда), и в файл aml_autoscript записываем свои команды, например:

setenv silent 0
saveenv
help

Не забываем, что файл aml_autoscript бинарный, и его надо обработать утилитой mkimage.

Флешку желательно брать со светодиодом, чтобы по его морганию увидеть, что к ней идет обращение. Это особенно важно когда silent=1.

Далее, подаем питание на плату (+12 вольт и землю на подписанные на плате контакты) и смотрим на загрузку через UART2USB. В случайные моменты загрузки до начала загрузки Андроида замыкаем припаянный к D0 провод на землю на несколько секунд, чтобы чтение ядра Андроида обломилось. Если поймать нужный момент, то флешка "заморгает" и с нее запустится приведенный выше скрипт, очищающий молчаливый режим и выдающий справку на экран.

-4

После того, как режим silent установлен в 0, мы в процессе загрузки видим строку "Hit any key to stop autoboot:" - это наш любимый кролик. Кролик обходится точно так же, как на других устройствах, только немного по другому :)

В u-boot данного устройства отсутствует команда "go", которую я ранее использовал для запуска функции cli_loop. Но это - мелочь.
Так как в u-boot есть команды по правке памяти, я просто меняю указатель одной из бесполезных команд u-boot на адрес cli_loop. Я выбрал команду "get_bootloaderversion". После смены указателя - запускаем команду и получаем интерактивный u-boot.

Вот набор команд, работающий под версией u-boot после сброса до заводских настроек (250218.044234):

mw.b 0x00000000BF770AC8 58 1
mw.b 0x00000000BF770AC9 e9 1
mw.b 0x00000000BF770ACA 62 1
get_bootloaderversion

А это команды для свежей версии u-boot (250408.101157). Сам адрес cli_loop в новой версии u-boot не изменился, но таблица функций, в которой я подменяю адрес get_bootloaderversion немного сползла:

mw.b 0x00000000BF770BB8 58 1
mw.b 0x00000000BF770BB9 e9 1
mw.b 0x00000000BF770BBA 62 1
get_bootloaderversion

Данные команды следует добавить в скрипт aml_autoscript, либо прописать в раздел misc (чтобы не замыкать провод при каждом включении ТВ).

Обновление от 24.05.2025:
Более стабильный способ запуска интерактивного режима u-boot описан в этой статье.

После того, как мы провалились в интерактивный u-boot описанным выше способом - нам будут недоступны команды, работающие с EMMC до тех пор, пока мы не выполним команду "mmc rescan":

-5

После "mmc rescan" мы можем уже делать что угодно - читать и писать разделы или запустить ТВ загружаться далее. Или можно команды запуска интерактивного режима u-boot записать в раздел misc, чтобы проваливаться в него при каждой перезагрузке.