Запуск Линукс на TV-боксе на чипе RK3528
Мне удалось запустить 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 секторе (0×8000 в байтах) стоит один из заголовков 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
Патчи добавляют исправления загрузки Линукс и конфиг для 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 — возможно в этом дело.
Xfce проблемы
Оказалось, что в Xfce из сборки Armbian не работают программы что должны показывать окно для ввода пароля для получения рута. Это множество системных утилит. Решается установкой этого пакета:
sudo apt-get install policykit-1-gnome
После этого надо сделать logout и войти по новой (перезагрузка системы не нужна).
Другие проблемы
У меня нашелся поддельный USB 2.0 хаб, поддельность в том, что работает он явно не со скоростью USB 2.0, а более низкой. В результате чего загрузка Линукс страшно тормозит. Через него я подключал картридер с картой, на которой был записан Линукс.
Через другой USB 2.0 хаб грузится быстро. У меня худший вариант TV-бокса по количеству портов — разъёма карты памяти нет, и один USB 2.0 порт.