1. Дистрибутив Buildroot

1.1. Получение дистрибутива

Дистрибутив распространяется на странице https://dist.elvees.com/mcom03/buildroot/. Пример иерархии директорий 2023.03:

└── rockpi
    ├── graphs/
    ├── images/
    ├── git-info.json
    ├── manifest.json
    └── mcom03-defconfig-src.tar.gz

В поддиректориях выкладываются архивы исходных кодов и образы для поддерживаемых модулей MCom-03 BuB, ROCK Pi N10, и т.п.

В файле git-info.json перечислены SHA-версии пакетов Buildroot.

В директории images хранятся предсобранные образы и архивы:

  • sbl/sbl.bin — для прошивки QSPI0,

  • rootfs.tar.gz — для прошивки SD-карты или eMMC,

  • aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz — комплект тулчейнов ARM, MIPS, DSP (подробнее см. toolchain).

Файл images/tar2dev используется для прошивки SD-карты, см. howto-flash-sd.

Для сборки необходимо скачать содержимое директории (например rockpi), распаковать архив с исходными кодами *-defconfig-src.tar.gz, перейти в распакованную директорию:

tar -xf ..-defconfig-src.tag.gz
cd ..-defconfig-src

Важно

Путь до директории, в которой выполняется распаковка и сборка, не должен содержать символов кириллицы и пробелов.

Примечание

Архив *-defconfig.src подготовлен командами:

make mcom03_defconfig FRAGMENTS=<someboard>
make source
tar -czf ...defconfig-src.tag.gz ...

1.2. Сборка в «родной» ОС (native)

Перед сборкой необходимо установить системные пакеты, пакеты брать из соответствующих файлов Dockerfile.* (например centos8stream, ubuntujammy, и т.д.).

Примечание

Распространяемый архив был собран в Docker-контейнере DOCKERFILE=Dockerfile.centos8stream. Примененный файл конфигурации buildroot/.config содержит список пакетов строго для данной среды. В случае смены ОС требуется повторное применение конфигурации docker-build.sh make ..._defconfig .... При запуске make из сети могут скачиваться дополнительные пакеты.

Для сборки Buildroot для ROCK Pi N10 с ядром 4.19 необходимо выполнить:

make mcom03_defconfig FRAGMENTS=rockpi
make

Для сборки Buildroot для ROCK Pi N10 c ядром 5.10 необходимо выполнить:

sed -i 's/mcom03-5.10.y/fc54cc45f63b3a03ea0d84815417c9019f091b6c/' \
  external-mcom03/fragments/linux510.fragment
make mcom03_defconfig FRAGMENTS=rockpi:linux510
make

Для сборки Buildroot для ELV-SMARC-CB необходимо выполнить:

make mcom03_defconfig FRAGMENTS=elvsmarccb
make

Собранные образы доступны в директории buildroot/output/images, описание файлов см. getting-source.

Поддерживаемые фрагменты расположены в директории external-mcom03/fragments.

При сборке Buildroot могут быть использованы любые стандартные команды: make source, make <package>-reconfigure, make menuconfig. Подробнее см. официальный Buildroot manual.

1.3. Сборка в среде Docker

Установите и настройте Docker: добавьте пользователя в группу docker, настройте прокси для клиента и сервера.

Собрать в среде Docker:

export DOCKERFILE=Dockerfile.centos8stream
export ENABLE_NETWORK=1  # container is allowed to access network

./docker-build.sh make mcom03_defconfig FRAGMENTS=rockpi
./docker-build.sh make

1.4. Средства сборки

В состав Buildroot входят средства сборки (далее — тулчейны) для процессорных ядер MCom-03:

  • baremetal mipsel-elvees-elf32 на базе GCC для MIPS32 RISC0. Тулчейн портирован компанией ЭЛВИС. Тулчейн содержит обходы ошибок процессора.

    Использовать другие тулчейны для MIPS32 RISC0 не рекомендуется.

  • Linux GCC для ARM CPU0. Тулчейн собирается из исходных кодов во время сборки Buildroot.

  • LLVM Clang для DSP. Тулчейн портирован компанией ЭЛВИС.

Варианты использования тулчейнов:

  1. Собрать Buildroot и использовать тулчейны, добавляя пути до исполняемых файлов в PATH:

    # ARM toolchain
    export PATH=$PWD/buildroot/output/host/bin:$PATH
    
    # MIPS toolchain
    export PATH=$PWD/buildroot/output/host/opt/toolchain-mipsel-elvees-elf32/bin:$PATH
    
    # DSP toolchain
    export PATH=$PWD/buildroot/output/host/opt/toolchain-elcore50/bin:$PATH
    
  2. Собрать набор тулчейнов (aka relocatable Buildroot SDK) c использованием встроенного механизма Buildroot (подробнее см. «Using the generated toolchain outside Buildroot» в Buildroot manual).

    Создать архив тулчейнов ..._sdk-buildrot.tag.gz в buildroot/output/images:

    make sdk
    

    Распаковать архив в произвольную директорию, вызвать скрипт для настройки путей (команда настроит переменную PATH):

    source <your/sdk/path>/environment-setup
    

    Примечание

    Предсобранный ..._sdk-buildroot.tar.gz распространяется в составе артефактов MCom-03 Buildroot, см. getting-source.

    Примечание

    Несмотря на префикс «aarch64» в названии архива, архив содержит тулчейны для всех процессоров.

Для поддержки сборки проектов на базе CMake для каждого из тулчейнов создаётся toolchain.cmake-файл. toolchain.cmake-файлы присутствуют в сборочной директории buildroot/output/host и копируются в архив тулчейнов:

buildroot/output/host/share/buildroot/toolchainfile.cmake
buildroot/output/host/opt/toolchain-mipsel-elvees-elf32/share/cmake/toolchain.cmake
buildroot/output/host/opt/toolchain-elcore50/share/cmake/elcore50-toolchain.cmake

Проекты CMake могут собираться с использованием стандартного механизма (см. CMake cross-compiling):

cmake -DCMAKE_TOOLCHAIN_FILE=<absolute-path-to-toolchain.cmake> ...

1.5. Сборка произвольных версий пакетов

Сборка с произвольной версией пакета выполняется согласно стандартному механизму override file local.mk, см. «Using Buildroot during development» в главе https://buildroot.org/downloads/manual/manual.html#_advanced_usage.

Важно

Выпуск MCom-03 Buildroot содержит слепок коммитов различных репозиториев. SHA коммитов репозиториев перечислены в файле git-info.json (см. getting-source). Собираемость и работоспособность гарантируется только для указанных SHA.

Для сборки произвольных версий пакетов mcom03-sbl, ddrinit, U-Boot, Linux необходимо:

  1. Склонировать в произвольную директорию перечисленные выше компоненты (U-Boot, Linux, mcom03-sbl), выгрузить необходимую версию:

    git clone https://github.com/elvees/...
    git checkout ...
    
  2. Создать файл buildroot/local.mk. В файле добавить строки с путями до склонированных репозиториев:

    ARM_TRUSTED_FIRMWARE_OVERRIDE_SRCDIR = <abspath to local TF-A>
    DDRINIT_OVERRIDE_SRCDIR = <abspath to local ddrinit>
    LINUX_OVERRIDE_SRCDIR = <abspath to local Linux>
    MCOM03_SBL_OVERRIDE_SRCDIR = <abspath to local mcom03-sbl>
    UBOOT_OVERRIDE_SRCDIR = <abspath to local U-Boot>
    
  3. Запустить сборку:

    make
    
    # or to build in docker
    ENABLE_NETWORK=1 ./docker-build.sh make
    

1.6. Обзор загрузки ОС (boot flow)

MCom-03 запускается в режиме QSPI0 XIP. Память QSPI0 содержит образы SBL, ddrinit, TF-A, U-Boot. SD-карта содержит ядро, DTB, extlinux.conf.

U-Boot поддерживает загрузку Linux по схеме Generic Distro с использованием файла extlinux.conf:

  • U-Boot перебирает источники загрузки SDMMC0, SDMMC1, USB (порядок может отличаться в зависимости от используемой версии U-Boot),

  • U-Boot запускает ядро в соответствии с первым обнаруженным extlinux.conf (копирует DTB и ядро в ОЗУ, передаёт управление ядру).

Последовательность загрузки приведена на диаграмме:

digraph G {

  node [ shape = box, style = filled, width=2.5, height=0.4]

  poweron [label = "User Power On", fillcolor=darkolivegreen1]
  sbl1 [label = "SBL @ RISC0 (QSPI0 XIP)", fillcolor=azure2]
  ddrinit [label = "DDR init @ RISC0 (SPRAM)", fillcolor=azure2]
  sbl2 [label = "SBL @ RISC0 (QSPI0 XIP)", fillcolor=azure2]
  tfa [label = "TF-A @ CPU (DDR)", fillcolor=lightsalmon]
  uboot [label = "U-Boot @ CPU (DDR)", fillcolor=lightsalmon]
  linux [label = "Linux @ CPU (DDR)", fillcolor=lightsalmon]

  poweron -> sbl1 -> ddrinit -> sbl2 -> tfa -> uboot -> linux
}

Последовательность загрузки Linux (в скобках указан источник исполнения)

1.7. Запуск ОС на ROCK Pi N10

Для запуска ОС необходимо:

  1. Установить джампер режима Boot 0 (QSPI0).

  2. Подключить переходник USB-to-UART к UART2 модуля (пример подключения), подключить переходник к ПК.

  3. Подключить HDMI-дисплей к модулю.

  4. Подключить блок питания USB type C.

  5. На ПК открыть терминал, залогиниться.

  6. Если на HDMI-дисплей не выводится видео, выполнить перезапуск HDMI, см. Поддержка HDMI.

1.7.1. Поддержка HDMI

При включении/сбросе СнК видео на HDMI может не выводиться или выводиться испорченным. Для перезапуска HDMI требуется перезапуск процессора или перенастройка PLL СнК. Перенастройка PLL выполняется скриптом mcom03-hdmi-setup.sh (установлен в ОС).

1.8. Прошивка SD-карты

Прошивка SD-карты выполняется на ПК или на устройстве (при условии загрузки c eMMC):

  1. Определить имя устройства SD-карты на ПК (извлечь SD-карту из считывателя карт ПЭВМ, считать список устройств командой ls -la /dev/sd*, установить SD-карту в ПК, повторно считать список устройств, обнаружить новое устройство /dev/sdX).

  2. Записать архив корневой файловой системы на SD-карту с помощью утилиты tar2dev (утилита входит в состав сборки, см. getting-source):

    chmod +x ./tar2dev
    sudo ./tar2dev mcom03-altlinux-rootfs-....tar.gz /dev/sdX
    
  3. Для загрузки с SD-карты в /boot/extlinux.conf SD-карты требуется изменить путь до корневой файловой системы и FDT.

Утилита tar2dev поддерживает опции и переменные для установки раздела root, fdt в extlinux.conf, установки имени хоста устройства, подробнее см. tar2dev -h.

Примеры:

  • Записать SD-карту для модуля ROCK Pi N10 (загрузка будет выполняться с SD-карты):

    ROOT=/dev/mmcblk1p1 tar2dev -n newhostname rootfs.tar.gz /dev/sdX
    
  • Записать SD-карту для модуля ТрастФон_ПМ (загрузка будет выполняться с SD-карты):

    ROOT=/dev/sda1 tar2dev -n newhostname rootfs.tar.gz /dev/sdX
    

1.9. Прошивка eMMC

Память eMMC на ELV-MC03-SMARC доступна как стандартное блочное устройство Linux /dev/mmcblk0p2. eMMC может прошиваться тем же образом, что и SD-карта.

Для прошивки достаточно:

  • загрузить Linux с карты памяти SD;

  • скопировать rootfs.tar.gz для прошивки eMMC и tar2dev на SD-карту;

  • прошить eMMC утилитой tar2dev (см. howto-flash-sd);

  • обновить корневую файловую систему в extlinux.conf на eMMC.

1.10. Прошивка QSPI-памяти

Прошивка QSPI-памяти выполняется с ПК. Python-пакет утилит для прошивки QSPI-памятей mcom03-flash-tools и инструкция по прошивке расположены по адресу https://github.com/elvees/mcom03-flash-tools.

Образ прошивки QSPI-памяти указан в getting-source.