Мне удалось запустить Armbian сборку Ubuntu на TV-боксе с новым чипсетом RK3528. Используя конфиги для Hinlink H28K, первого поддерживаемого в Armbian устройства на этом чипе.
Это продолжение статьи, где я описал несколько способов достать Device Tree файлы из Андроид установленного на TV-боксе. Нужно для запуска на конкретном устройстве, даже для одной и той же модели - компоненты устройства могут отличаться, эти детали есть в Device Tree. Эта инструкция рассказывает как собрать и запустить Armbian используя полученный Device Tree файл. Написано для пользователей Линукс, средней сложности - почти всё подробно описано по шагам.
Инструкция для запуска в том числе с USB накопителя, что по умолчанию отключено в загрузчике U-Boot.
Сборка Armbian для RK3528
Рекомендую почитать статью по сборке Armbian для TV-бокса на чипе Amlogic, которая мне немного помогла.
Но мы немного отклонимся от инструкций из той статьи.
$ git clone --depth=1 https://github.com/armbian/build armbian-build
$ cd armbian-build
Используйте --depth=1
где можно, вряд ли вам нужна вся история коммитов, а в некоторых репозиториях история занимает в десятки раз больше последнего состояния, достаточного для сборки.
Будем использовать конфиг для мини-роутера Hinlink H28K.
$ ./compile.sh build BOARD=hinlink-h28k EXPERT=yes KERNEL_GIT=shallow
KERNEL_GIT=shallow
означает --depth=1
для исходников ядра, чтобы не потратить много времени на выкачивания их из интернета и кучу места на диске для хранения ~миллиона мелких файлов.
Вам будет предложено выбрать дистрибутив что вам нравится. У меня заработал Ubuntu 20.04 focal с Xfce десктопом. Потом я попробовал Ubuntu 22.04 jammy с Mate десктопом (который мне больше нравится) - не запускается. Подумал, что может быть это из-за jammy, и собрал focal с Mate - тоже не запускается. Собрал jammy с Xfce - запустился! Так что, имейте в виду, что не все варианты сборки Armbian, что можно выбрать - у вас заработают. (причину нашел - добавил решение в конце статьи)
Скрипт напишет как повторить выбранные опции, например:
./compile.sh build BOARD=hinlink-h28k BRANCH=legacy BUILD_DESKTOP=yes BUILD_MINIMAL=no DESKTOP_ENVIRONMENT=xfce DESKTOP_ENVIRONMENT_CONFIG_NAME=config_base EXPERT=yes KERNEL_CONFIGURE=yes KERNEL_GIT=shallow RELEASE=jammy
Сборка Armbian будет компилировать только ядро Линукс, остальные пакеты будут скачаны в готовом виде.
Готовые образы дисков будут лежать в output/images
, например с таким именем:
Armbian_23.11.0-trunk_Hinlink-h28k_jammy_legacy_5.10.160_xfce_desktop.img
Добавление своего Device Tree
Как его получить - читайте в моей предыдущей статье.
Можно добавить прямо в образ диска, до записи:
$ sudo mount -o rw,loop,offset=16M <образ-armbian.img> /mnt/loopimage
Или после записи на USB/карту (у меня автоматически раздел не монтируется):
$ sudo mount /dev/sdX1 <директория>
Заходим в примонтированный раздел, в директории dtb/rockchip
хранятся .dtb, сюда надо скопировать свой, полученный из boot раздела Андроид.
Например, с таким именем: dtb/rockchip/rk3528-tvbox.dtb
Настройки бута хранятся в armbianEnv.txt
, будет примерно такое содержимое (UUID раздела меняется для разных сборок Armbian):
verbosity=1
bootlogo=true
overlay_prefix=rk35xx
fdtfile=rockchip/rk3528-hinlink-h28k.dtb
rootdev=UUID=813764a1-91f7-4247-992f-2ade953afa7d
rootfstype=ext4
Надо изменить строку fdtfile=
, указав на .dtb со своего устройства:
fdtfile=rockchip/rk3528-tvbox.dtb
Когда закончили, не забудьте отмонтировать раздел, чтобы все данные сохранились на диск:
$ sudo umount <устройство или директория>
Если на вашем TV-боксе вас есть разъём под карту памяти, то можете вставить карту с записанным образом в него, и пропустить пару следующих разделов этой инструкции.
Порядок загрузки Rockchip устройств
Сначала загрузка идёт с карты памяти, если есть разъём для карты памяти и вставленна карта. Карта памяти подключенная через USB картридер - работает как обычный USB накопитель, поэтому в загрузке не учитывается.
Если карта памяти не обнаружена - то загружается с EMMC.
С карты/EMMC должен загрузиться начальный загрузчик SPL, который далее запускает U-Boot, и если U-Boot был собран с опцией CONFIG_ROCKCHIP_USB_BOOT=y
, то пытается загрузиться с первого USB устройства в котором на 64 секторе (0x8000 в байтах) стоит один из заголовков Rockchip загрузчиков. При этом U-Boot записанный на USB накопитель - не выполняются, U-Boot уже загруженный с карты/EMMC сразу переходит к поиску скриптов для загрузки ядра на USB накопителе.
Сборка своего U-Boot с поддержкой загрузки с USB
Нужно для загрузки Linux с USB носителя или для дампа разделов с EMMC без хаков. Описано в предыдущей статье, но повторю.
$ sudo apt-get install gcc-aarch64-linux-gnu
$ git clone --depth=1 https://github.com/rockchip-linux/u-boot.git
$ git clone --depth=1 https://github.com/rockchip-linux/rkbin.git
$ cd u-boot
Заменяем в начале make.sh
кросс-компилятор на системный, из пакета gcc-aarch64-linux-gnu
: CROSS_COMPILE_ARM64=/usr/bin/aarch64-linux-gnu-
В Armbian есть патчи для hinlink-h28k, лежат они тут:
armbian-build/patch/u-boot/legacy/board_hinlink-h28k
Устанавливаем их находясь в директории u-boot:
$ cat <path-to-armbian-build>/patch/u-boot/legacy/board_hinlink-h28k/*.patch | patch -p1
Патчи добавляют исправления загрузки Линукс и конфиг для Hinlink-H28K. Без этих патчей у вас даже комплектный Андроид из EMMC не станет грузиться.
Перед сборкой сначала уберём ограничение чтения в режиме download:
$ sed -i 's/(blkstart + blkcnt) > RKUSB_READ_LIMIT_ADDR/0/' cmd/rockusb.c
И добавим в конфиг для H28K поддержку загрузки с USB накопителей:
$ sed -i '1i CONFIG_ROCKCHIP_USB_BOOT=y' configs/hinlink_rk3528_defconfig
Можно собирать: $ ./make.sh hinlink_rk3528
Загружаем на устройство: $ rkflashtool w 0x4000 0x2000 < uboot.img
Про rkflashtool
рассказано в предыдущей статье. Для U-Boot на Rockchip есть стандартный адрес на диске - 8МБ от начала (в Андроиде он оформлен как раздел, на Линукс - нет), занимает 4МБ - в которых повторяется два раза.
Первый запуск Armbian
При первом запуске нужно подключить устройство к локальной сети, если нет Ethernet разъёма - то через USB адаптер.
При первом подключении по ssh, с именем root и паролем 1234, вас спросят: новый пароль для рута, имя первого пользователя (с правами рута) и пароль для него, язык и часовой пояс. После этого заработает графическая оболочка.
Нечитаемые флэшки
У меня есть USB 3.0 флэшка Kingston на 32Гб - почему-то она как загрузочная не определяется. А вот новая карта на 32Гб через картридер работает. Правда картридер USB 2.0 - возможно в этом дело.
Скорее всего, U-Boot при проверке USB носителей проверяет на наличие интерфейса USB 1.1, а на упаковке флэшки было написано только про USB 2.0/3.0/3.1/3.2. Даже если ОС сможет эту флэшку читать - всё равно для U-Boot нужна поддержка старого стандарта.
Xfce проблемы
Оказалось, что в Xfce из сборки Armbian не работают программы что должны показывать окно для ввода пароля для получения рута. Это множество системных утилит. Решается установкой этого пакета:
sudo apt-get install policykit-1-gnome
После этого надо сделать logout и войти по новой (перезагрузка системы не нужна).
Другие проблемы
У меня нашелся поддельный USB 2.0 хаб, поддельность в том, что работает он явно не со скоростью USB 2.0, а более низкой. В результате чего загрузка Линукс страшно тормозит. Через него я подключал картридер с картой, на которой был записан Линукс.
Через другой USB 2.0 хаб грузится быстро. У меня худший вариант TV-бокса по количеству портов - разъёма карты памяти нет, и один USB 2.0 порт.
Еще один патч для U-Boot
Добавил в статью после публикации. Решает проблему загрузки Mate десктопа, это проявляется не всегда, может проявиться на любом десктопе (в том числе Xfce), зависит от каких-то случайностей.
Нужно для загрузки с USB, когда U-Boot грузится из EMMC, а ОС с USB накопителя.
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -455,9 +455,9 @@ int board_late_init(void)
#endif
setup_download_mode();
scan_run_cmd();
-#ifdef CONFIG_ROCKCHIP_USB_BOOT
- boot_from_udisk();
-#endif
#ifdef CONFIG_DM_CHARGE_DISPLAY
charge_display();
#endif
#ifdef CONFIG_DRM_ROCKCHIP
if (rockchip_get_boot_mode() != BOOT_MODE_QUIESCENT)
rockchip_show_logo();
#endif
+#ifdef CONFIG_ROCKCHIP_USB_BOOT
+ boot_from_udisk();
+#endif
#ifdef CONFIG_ROCKCHIP_EINK_DISPLAY
rockchip_eink_show_uboot_logo();
#endif
Проблема в том, что U-Boot для Rockchip инициализирует дисплей и показывает лого. Лого читается из boot раздела Android. При использовании загрузки через USB - лого читается с USB накопителя, но по указателям для Android, и загрузиться не может. Где-то так, я пока точно не разобрался как ищутся эти ресурсы.
По UART в логе такие ошибки:
No resource file:
VP0 fail to load kernel logo
No resource file:
VP1 fail to load kernel logo
А потом падение, на разыменовании нулевого указателя.
Не пробовал запускать Линукс на сборке U-Boot без CONFIG_DRM_ROCKCHIP
, но у меня не запускается Андроид без CONFIG_DRM_ROCKCHIP
. Если переставить вызов boot_from_udisk()
после rockchip_show_logo()
, то грузится и Андроид, и Линукс с USB накопителя. Наверное эту проблему можно решить разными путями, и это не самый идеальный. Лучше бы вообще отключить загрузку и показ лого, но оставить инициализацию экрана.
Комментарии (10)
jpegqs Автор
13.10.2023 21:18фото поддельного USB 2.0 хаба
Достался мне подарком к другому TV-боксу. Микросхема MW7211A IPA170201-1, на обратной стороне только USB разъёмы. Очевидно, что в качестве подарков добавляют хлам, который хоть и работает, но со скоростями USB 1.1 бесполезен.
RarogCmex
13.10.2023 21:18У меня был похожий, только выдавал честные USB 2.0. Даже с usb 1.1 на дешевую клаву с мышкой его может хватить.
jpegqs Автор
13.10.2023 21:18Корпус типовой, в нём что угодно можно засунуть. Да, на клавиатуру/мышь/геймпад этого достаточно. Для USB накопителей - ужасно медленно.
jpegqs Автор
13.10.2023 21:18+3Кто поставил минус за "Низкий технический уровень материала" - я согласен что инструкция не глубокая, но у меня цель была запустить хоть какой-то Линукс, и я её добился. Тут самое главное - что нужен U-Boot загрузчик с патчами из Armbian, и правильный .dtb файл для устройства. Базовая поддержка этого чипа в Linux уже есть.
Разбираюсь сейчас с настройкой Armbian сборки Ubuntu - там всё проглюченно и приходится искать как решить разные проблемы, пока я написал только про одну с Xfce. Плюс надо разобраться как включить графическое ускорение, интерфейс не тормозит, но я хочу попробовать 3D графику. Драйвер на GPU Mali-450 уже должен быть в Linux.
NutsUnderline
13.10.2023 21:18чую я что ему то как раз требовалась инструкция как поставить линукс в один клик, что и обещал заголовок, а тут только какой то git, make, dd
NutsUnderline
13.10.2023 21:18если нет Ethernet разъёма - то через USB адаптер.
вот тут меня смущает идея что обязательно найдется неподдреживаемый адаптер ...
Johan_Palych
Нормально отрабатывает и по стандартной инструкции за 10 мин. Виртуалка с Ubuntu 22.04.3 LTS уже преднастроена. Собирал для другой железки.
https://github.com/armbian/build
В BRANCH=legacy собирает с vmlinuz-5.10.160-legacy-rk35xx
screenshot
jpegqs Автор
Вы заменяли .dtb? Я только два чужих проверял - для hinlink, и с тем же названием внутри (rk3528-evb1-ddr4-v10) что .dtb из андроида. Но в Armbian файл с тем же именем различается по размеру. С ними Линукс не грузится, с .dtb из андроида грузит. Похоже производитель моего устройства взял стандартный rk3528-evb1-ddr4-v10, внёс в него свои правки и не заморачивался с изменением названия. По чипам памяти с платы (K4B4G0446D) - используется память DDR3.
Johan_Palych
Через adb shell копировал boot или recovery, распаковывал с abootimg и использовал родной .dtb
(для примера - данные старые Android 4.4) - Dump the partition to a file using dd
Extracting Existing Kernel + Ramfs
https://gist.github.com/azureru/478fe60ee5b9ec545fa5eb286fb2c4be
sudo apt-get install abootimg device-tree-compiler
dtc -b 0 -O dts -I dtb -o my.dts recovery.img-second.gz
nano(mcedit, gedit ...) my.dts
dtc -b 0 -O dtb -I dts -o my.dtb my_box.dts
Надо попробовать F2FS.
https://docs.armbian.com/Developer-Guide_Build-Options/
ROOTFS_TYPE ( ext4 | f2fs | btrfs | nilfs2 | xfs | nfs | fel ): create image with different root filesystems instead of default ext4. Requires setting FIXED_IMAGE_SIZE to something smaller than the size of your SD card for F2FS
FIXED_IMAGE_SIZE= 4000 8000 16000 ...
jpegqs Автор
Каким образом это работает? dtc находит первый попавшийся в потоке данных dtb по заголовку? Например, на TV-боксе Amlogic я вытаскивал 6 .dtb конфигов из boot раздела:
Какой из них использовать - можно понять выполнив команду в
adb shell
:Да, в данном случае используется первая, что нашлась бы поиском заголовка .dtb, но могла быть и другая.
Что предлагается редактировать?
Это не связано с файловой системой. Имеется в виду стадия загрузки, U-Boot эту флэшку не посчитал загрузочной. Через картридер работало с тем же самым образом системы.