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

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

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

└── 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.bin — для прошивки QSPI0,

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

  • aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz — комлпект тулчейнов ARM, MIPS, DSP, комплект создан командой make sdk, подробнее см «Build an external toolchain with Buildroot» в Buildroot manual.

Файл 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.* (например centos7, ubuntufocal, и т.д.).

Примечание

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

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

make mcom03_defconfig FRAGMENTS=rockpi
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.centos7
export ENABLE_NETWORK=1  # container is allowed to access network

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

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

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

Для сборки произвольных версий пакетов 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.5. Обзор загрузки ОС (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
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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.8. Прошивка 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.9. Прошивка QSPI-памяти

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

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