Мне удалось запустить 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)


  1. Johan_Palych
    13.10.2023 21:18
    +2

    Нормально отрабатывает и по стандартной инструкции за 10 мин. Виртуалка с Ubuntu 22.04.3 LTS уже преднастроена. Собирал для другой железки.
    https://github.com/armbian/build
    В BRANCH=legacy собирает с vmlinuz-5.10.160-legacy-rk35xx

    ./compile.sh build BOARD=hinlink-h28k BRANCH=legacy BUILD_DESKTOP=no BUILD_MINIMAL=yes EXPERT=yes KERNEL_CONFIGURE=no RELEASE=bookworm
    ls -la ~/build/output/images/
    sudo kpartx -av ~/build/output/images/Armbian_23.11.0-trunk_Hinlink-h28k_bookworm_legacy_5.10.160_minimal.img
    sudo parted -l | grep loop0p
    Диск /dev/mapper/loop0p1: 268MB
    Диск /dev/mapper/loop0p2: 3909MB
    Маунт в файл-манагере.
    mount | grep loop0p
    ls -la /media/user/armbi_boot
    ls -la /media/user/armbi_root
    screenshot


    1. jpegqs Автор
      13.10.2023 21:18

      Вы заменяли .dtb? Я только два чужих проверял - для hinlink, и с тем же названием внутри (rk3528-evb1-ddr4-v10) что .dtb из андроида. Но в Armbian файл с тем же именем различается по размеру. С ними Линукс не грузится, с .dtb из андроида грузит. Похоже производитель моего устройства взял стандартный rk3528-evb1-ddr4-v10, внёс в него свои правки и не заморачивался с изменением названия. По чипам памяти с платы (K4B4G0446D) - используется память DDR3.


      1. Johan_Palych
        13.10.2023 21:18

        Через 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 ...

        ./compile.sh build BOARD=hinlink-h28k BRANCH=legacy BUILD_DESKTOP=no BUILD_MINIMAL=yes EXPERT=yes FIXED_IMAGE_SIZE=4000 KERNEL_CONFIGURE=no RELEASE=bookworm ROOTFS_TYPE=f2fs


        1. jpegqs Автор
          13.10.2023 21:18

          dtc -b 0 -O dts -I dtb -o my.dts recovery.img-second.gz

          Каким образом это работает? dtc находит первый попавшийся в потоке данных dtb по заголовку? Например, на TV-боксе Amlogic я вытаскивал 6 .dtb конфигов из boot раздела:

          gxbb_p201_1g.dtb
          gxbb_p201_2g.dtb
          gxl_p211_1g.dtb
          gxl_p211_2g.dtb
          gxl_p215_1g.dtb
          gxl_p215_2g.dtb

          Какой из них использовать - можно понять выполнив команду в adb shell:

          $ echo $(cat /proc/device-tree/amlogic-dt-id)
          gxbb_p201_1g

          Да, в данном случае используется первая, что нашлась бы поиском заголовка .dtb, но могла быть и другая.

          nano(mcedit, gedit ...) my.dts

          Что предлагается редактировать?

          Надо попробовать F2FS.

          Это не связано с файловой системой. Имеется в виду стадия загрузки, U-Boot эту флэшку не посчитал загрузочной. Через картридер работало с тем же самым образом системы.


  1. jpegqs Автор
    13.10.2023 21:18

    фото поддельного USB 2.0 хаба

    Достался мне подарком к другому TV-боксу. Микросхема MW7211A IPA170201-1, на обратной стороне только USB разъёмы. Очевидно, что в качестве подарков добавляют хлам, который хоть и работает, но со скоростями USB 1.1 бесполезен.


    1. RarogCmex
      13.10.2023 21:18

      У меня был похожий, только выдавал честные USB 2.0. Даже с usb 1.1 на дешевую клаву с мышкой его может хватить.


      1. jpegqs Автор
        13.10.2023 21:18

        Корпус типовой, в нём что угодно можно засунуть. Да, на клавиатуру/мышь/геймпад этого достаточно. Для USB накопителей - ужасно медленно.


  1. jpegqs Автор
    13.10.2023 21:18
    +3

    Кто поставил минус за "Низкий технический уровень материала" - я согласен что инструкция не глубокая, но у меня цель была запустить хоть какой-то Линукс, и я её добился. Тут самое главное - что нужен U-Boot загрузчик с патчами из Armbian, и правильный .dtb файл для устройства. Базовая поддержка этого чипа в Linux уже есть.

    Разбираюсь сейчас с настройкой Armbian сборки Ubuntu - там всё проглюченно и приходится искать как решить разные проблемы, пока я написал только про одну с Xfce. Плюс надо разобраться как включить графическое ускорение, интерфейс не тормозит, но я хочу попробовать 3D графику. Драйвер на GPU Mali-450 уже должен быть в Linux.


    1. NutsUnderline
      13.10.2023 21:18

      чую я что ему то как раз требовалась инструкция как поставить линукс в один клик, что и обещал заголовок, а тут только какой то git, make, dd


  1. NutsUnderline
    13.10.2023 21:18

    если нет Ethernet разъёма - то через USB адаптер.

    вот тут меня смущает идея что обязательно найдется неподдреживаемый адаптер ...