Ранее я рассказал, как на Яндекс Станции Макс сдампить прошивку с помощью pyamlboot. Также в статье про нижний разъем, я обмолвился, что на Максе можно запустить Армбиан. Расскажу об этом немного подробнее.
Как обычно, я ничего нового не изобретаю - запуска Армбиан на устройствах с процессорами Amlogic описан ранее. За основу я взял эти скрипты.
Итак, для загрузки Армбиан, нам потребуется:
- Яндекс Станция Макс без пароля на USB.
- USB флешка хотя бы на 16 гб.
- Немного пайки, чтобы сделать USB папу и USB маму (с питанием) для подключения к нижнему разъему Станции Макс.
Немного оффтопик.
Так как в определенный момент мне надоело дергать свою "боевую" Станцию Макс, я купил на Авито б/ушную плату с выломанным верхним разъемом, и наколхозил вот такое:
Черный USB провод можно включать в ПК для загрузки через pyamlboot, либо втыкать в правую плату, чтобы через него подключить флешку к Станции Макс. Также на плату идет +5 вольт и UART. Распайка вполне очевидна, так что я ее не привожу. На джампера и кнопку не обращайте внимания - они нужны для посадки boot_5 на землю и подачи +5в на USB маму (можно просто запаять эти провода напрямую без джамперов). На кнопку я хотел посадить Reset - но не нашел соответствующий тестпоинт (да особо и не искал).
Если кому-то нужна распайка нижнего разъема Станции Макс (разъем Х6), то я вызвонил только пины, относящиеся к той части, которая идет далее на 7-контактный разъем, доступный извне.
Из-за природной невнимательности, нумерация в таблице ниже идет не слева направо, а справа налево (то есть, в таблице пин 1 - это на самом деле пин 36 разъёма):
1 +5в
2 +5в
3 земля
4 земля
5 tp19
6 неизвестно
7 tp98
8 tp94
9 tp96
10 tp93
11 неизвестно
12 usb boot first
13 неизвестно
14 uart_A0_A_TX tp62
15 uart_A0_A_rx tp61
16 неизвестно
17 неизвестно
18 неизвестно
19 USBOTG_B_DP tp21
20 USBOTG_B_DM tp20
21 земля
22 неизвестно
23 неизвестно
24 земля
25 неизвестно
26 неизвестно
27 земля
28 неизвестно
29 неизвестно
30 земля
31 неизвестно
32 неизвестно
33 земля
34 неизвестно
35 неизвестно
36 неизвестно
Возвращаюсь к запуску Армбиан.
Для запуска Армбиан, требуется создать флешку с соответствующим образом, после чего заставить Станцию Макс загрузиться с неё.
Образ я взял отсюда: https://imola.armbian.com/archive/aml-s9xx-box/archive/, архив Armbian_23.8.1_Aml-s9xx-box_bookworm_current_6.1.50_minimal.img.xz
Далее, после записи образа на флешку (я использовал Raspberry Pi Imager), требуется добавить на нее скрипты под наше устройство отсюда: https://github.com/devmfc/amlogic-bootscripts-Armbian. Можно просто записать все файлы с Git на FAT32 раздел флешки, перезаписав существующие. Затем требуется в файле armbianEnv.txt исправить строку "fdtfile=amlogic/meson-sm1-x96-air-gbit.dtb" на "fdtfile=amlogic/meson-g12a-x96-max.dtb", так как этот DTB к нам ближе по устройствам.
Готовим pyamlboot и утилиты от Amlogic, как я писал ранее.
А теперь интересное.
Требуется заставить Яндекс Станцию Макс загрузиться с USB устройства. Если посмотреть в раздел environment, то там можно увидеть многообещающий набор команд в "recovery_from_udisk":
В первой строке происходит загрузка в память файла "aml_autoscript" с первого FAT раздела первой USB флешки, и затем он запускается на выполнение командой autoscr.
Именно такой файл сейчас есть на флешке, и для его запуска всего лишь требуется запустить команду "recovery_from_udisk".
К сожалению, при загрузке через pyamlboot, USB контроллер у нас уже инициализирован в режиме OTG и переключить его в режим хоста мне не удалось, так что просто сделать команду "run recovery_from_udisk" не получится. Но, если посмотреть внимательнее в environment, мы видим, что команды "recovery_from_udisk" запускаются из скрипта "update", который в свою очередь запускается скриптом "switch_bootmode", если устройство загружено в режиме update.
Так что, нам требуется выполнить команду "reboot update".
Это можно сделать из Андроид с включенным ADB (adb reboot update), записав команды в раздел misc (посмотрите сами в исходниках U-Boot) или загрузиться в U-Boot через pyamlboot и выполнить в нем команду "reboot update".
Опишу вариант через U-Boot.
Для этого подключаем Станцию Макс к ПК, замыкаем ногу "usb boot first" на землю:
Перезагружаем Станцию (определится устройство VID_1B8E&PID_C003):
Запускаем:
python.exe boot-g12.py -b max
Ждем порядка 5 секунд, пока на консоли UART не прекратят бежать буквы и заходим в интерактивный U-Boot командой:
update.exe bulkcmd "go 077E83140"
После чего перезагружаем устройство в режим обновления. Это делается командой "reboot update" в консоли UART:
Но до выполнения "reboot update", необходимо отключить Станцию от ПК и в USB порт Станции воткнуть флешку с Армбиан. И не забыть подать на нее +5 вольт питания с током, достаточным чтобы завелась флешка (на фото я подаю с внешнего БП):
Вот так это выглядит у меня:
Совсем забыл! Обязательно один раз выполните в интерактивном U-Boot команды:
setenv silent 0
saveenv
Это уберет "тихий" (silent=1) режим загрузки Android и вы сможете увидеть больше сообщений на экране.
А уже после этих команд можно сделать "reboot update".
В процессе загрузки Станция Макс инициализирует USB, загрузит и запустит с него скрипт "aml_autoscript", который далее уже стартует Армбиан.
Первая загрузка Армбиана идет довольно долго. Логин там root, пароль 1234.
Далее, внутри операционной системы мы видим устройство /dev/mmcblk1
Увы, данное устройство доступно нам только частично, и "store disprotect key" нам тут не помогает. Таблицу разделов мы не видим:
Но мы можем монтировать доступные нам разделы, указывая смещение в командной строке mount. Например, вот так монтируется раздел /cache:
mount -o offset=113246208 /dev/mmcblk1 /cache
Раздел /data:
mount -o offset=5576327168 /dev/mmcblk1 /data
И /vendor:
mount -o offset=1566572544 /dev/mmcblk1 /vendor
И /product:
mount -o offset=3814719488 /dev/mmcblk1 /product
Offset для других разделов можно узнать из таблицы, которую я уже приводил ранее:
Part Start Sect x Size Type name
00 0 8192 512 U-Boot bootloader
01 73728 131072 512 U-Boot reserved
02 221184 2293760 512 U-Boot cache
03 2531328 16384 512 U-Boot env
04 2564096 16384 512 U-Boot logo
05 2596864 49152 512 U-Boot recovery
06 2662400 16384 512 U-Boot misc
07 2695168 16384 512 U-Boot dtbo
08 2727936 16384 512 U-Boot cri_data
09 2760704 32768 512 U-Boot param
10 2809856 32768 512 U-Boot boot
11 2859008 32768 512 U-Boot rsv
12 2908160 32768 512 U-Boot metadata
13 2957312 4096 512 U-Boot vbmeta
14 2977792 65536 512 U-Boot tee
15 3059712 1048576 512 U-Boot vendor
16 4124672 262144 512 U-Boot odm
17 4403200 3031040 512 U-Boot system
18 7450624 262144 512 U-Boot product
19 7729152 3145728 512 U-Boot sysrecovery
20 10891264 4378624 512 U-Boot data
Для получения смещения, требуется взять значение из столбца Start и умножить на 512 (размер сектора).
Следует быть аккуратным с монтированием /system и /vendor - при их изменении требуется также обновить хеши в vbmeta. Зато /product так не защищен, и изменив его, можно добавлять на Станцию свои APK файлы.
Армбиан в таком режиме загрузке неудобен и бесполезен для полноценного использования - но из него можно вносить правки в существующие разделы /data и /product (предварительно замонтировав), что позволяет проводить дальнейшее, более углубленное, исследование работы устройства.
Записать содержимое раздела /data, если его образ был ранее сдамплен и отредактирован на ПК, можно следующей командой:
dd bs=512 if=data.img of=/dev/mmcblk1 seek=10891264
Аналогичным образом можно записывать и другие разделы прошивки, подставляя их смещения из таблицы выше.