Запуск Линукс на TV-боксе на чипе RK3528

5b4bd27d07c53c7d811214a53ac78be0.jpg

Мне удалось запустить 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 /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 — возможно в этом дело.

Xfce проблемы

Оказалось, что в Xfce из сборки Armbian не работают программы что должны показывать окно для ввода пароля для получения рута. Это множество системных утилит. Решается установкой этого пакета:

sudo apt-get install policykit-1-gnome

После этого надо сделать logout и войти по новой (перезагрузка системы не нужна).

Другие проблемы

У меня нашелся поддельный USB 2.0 хаб, поддельность в том, что работает он явно не со скоростью USB 2.0, а более низкой. В результате чего загрузка Линукс страшно тормозит. Через него я подключал картридер с картой, на которой был записан Линукс.

Через другой USB 2.0 хаб грузится быстро. У меня худший вариант TV-бокса по количеству портов — разъёма карты памяти нет, и один USB 2.0 порт.

© Habrahabr.ru