3. Загрузчик U-Boot

3.1. О документе

Данный документ описывает особенности работы загрузчика U-Boot для модулей на базе микросхемы 1892ВА018 (aka СКИФ, Scythian, MCom-03).

3.2. Обзор загрузчика

3.2.1. Возможности

  • Поддержка модулей на базе MCom-03:

    • ROCK Pi N10 с установленным процессорным модулем ELV-MC03-SMARC r1.1;

    • NGFW-CB r1.0 с установленным процессорным модулем ELV-MC03-SMARC r1.1;

    • conga-SEVAL с установленным процессорным модулем ELV-MC03-SMARC r1.1;

    • ELV-SMARC-CB r1.0 с установленным процессорным модулем ELV-MC03-SMARC r1.1;

    • Трастфон-Э ОПН r1.1 с установленным процессорным модулем Трастфон-Э ПМ r1.5;

    • MCom-03 BuB r1.3.x, r1.5.x (aka IPCom BuB).

  • Загрузчик исполняется на ARM CPU.

  • Поддержка загрузки ядра Linux по схеме Generic Distro.

  • Поддержка загрузки PXE.

  • Поддержка UART0.

  • Поддержка GEMAC0, GEMAC1.

  • Поддержка SDMMC0, SDMMC1.

  • Поддержка QSPI0, QSPI1.

  • Поддержка NAND Flash Controller (NFC).

  • Поддержка USB.

  • Поддержка переменных окружения в памятях QSPI0, QSPI1.

3.2.2. Исходный код

Git-репозиторий исходного кода загрузчика — https://github.com/elvees/u-boot/tree/mcom03.

Основные файлы поддержки микросхемы:

  • arch/arm/dts/mcom03*.dts,

  • board/elvees/,

  • configs/mcom03*_defconfig,

  • include/configs/mcom03.h.

3.2.3. Конфигурация и сборка

Соответствие модулей и конфигураций приведено в таблице Таблица 3.1.

Таблица 3.1 Конфигурации для модулей MCom-03

Модуль

Конфигурация

MCom-03 BuB r1.3.x

mcom03bub_defconfig

ROCK Pi N10

elvmc03smarc-rockpi_defconfig

NGFW-CB r1.0

elvmc03smarc-ngfwcb_defconfig

conga-SEVAL

elvmc03smarc-ngfwcb_defconfig

ELV-SMARC-CB r1.0

elvmc03smarc-elvsmarccb_defconfig

Трастфон-Э ОПН r1.1

trustphonepm_defconfig

Результатом сборки исходных кодов загрузчика является образ u-boot.bin. Образ доступен в корневой директории загрузчика после завершения сборки.

Для сборки загрузчика на ПК требуется кросс-компилятор aarch64-linux-gnu.

Переменные окружения, влияющие на сборку загрузчика:

  • CROSS_COMPILE — префикс кросс-компилятора;

  • PATH — пути для поиска используемых приложений.

Официальная инструкция по сборке U-Boot https://u-boot.readthedocs.io/en/latest/build/gcc.html.

Пример сборки загрузчика для модуля MCom-03 BuB r1.3.0:

export PATH=<compiler-path>:$PATH
export CROSS_COMPILE=aarch64-linux-
make mcom03bub_defconfig
make -j $(nproc)

3.2.4. Загрузка ядра Linux

U-Boot выполняет загрузку Linux по схеме Generic Distro:

  • SD-карта (или eMMC, USB-накопитель) содержит файл extlinux.conf, образы ядер Linux, DTB-файлы, rootfs.

  • U-Boot перебирает источники загрузки: монтирует файловые системы с носителей подключенных к SD-контроллерам MCom-03, USB-контроллерам, проверяет наличие extlinux.conf. Порядок носителей определяется переменной boot_targets.

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

3.2.5. Переменные окружения

Загрузчик поддерживает настройку через переменные окружения.

Во время запуска загрузчик выполняет поиск переменных окружения, сохраненных в QSPI флеш-памяти:

  • при успешном обнаружении устанавливаются переменные окружения, сохраненные в QSPI флеш-памяти;

  • в случае ошибки устанавливаются переменные окружения, заданные по умолчанию в коде U-Boot (см. файл include/configs/mcom03.h).

3.2.6. Драйвер GEMAC

TBD

3.2.7. Драйвер NAND NFC

TBD

3.2.8. Драйвер QSPI

Драйвер контроллера QSPI реализует ведущее устройство на шине SPI согласно классу UCLASS_SPI (см. doc/driver-model/spi-howto.rst) модели драйверов U-Boot.

Драйвер поддерживает спецификацию ведущего и ведомых устройств на шине SPI согласно doc/device-tree-bindings/spi/spi-bus.txt.

Возможности драйвера:

  • Поддержка до четырех ведомых устройств.

  • Передача в формате CPHA = 0 (см. флаг SPI_CPHA режима).

  • Полярность сигнала синхронизации CPOL = 0 (см. флаг SPI_CPOL режима).

  • Сигнал CS в активном состоянии «логический 0» (см. флаг SPI_CS_HIGH режима).

  • Передача слов данных старшим битом вперед (см. флаг SPI_LSB_FIRST режима).

  • Ведущее устройство на шине SPI (см. флаг SPI_SLAVE режима).

  • Пересылка в режиме full-duplex (в режиме NORMAL):

    • Передача данных по одному выводу на шине SPI (см. флаг SPI_TX_BYTE режима).

    • Прием данных по одному выводу на шине SPI (см. флаг SPI_RX_SLOW режима).

  • Пересылка в режиме half-duplex (в режиме QUAD):

    • Передача данных по 4 линиям на шине SPI (см. флаг SPI_TX_QUAD).

    • Прием данных по 4 линиям на шине SPI (см. флаг SPI_RX_QUAD).

Ограничения драйвера:

  • Не поддерживается установка скорости передачи. Частота на шине SPI равна частоте clk_ext, которая указывается в свойстве clocks в device tree. Частота clk_ext должна быть не больше частоты clk_axi на шине AXI.

  • Размер данных должен быть кратен восьми битам.

  • Передача в формате CPHA = 1 не поддерживается (флаг SPI_CPHA режима должен быть равен 0).

  • Полярность сигнала синхронизации CPOL = 1 не поддерживается (флаг SPI_CPOL режима должен быть равен 0).

  • Сигнал CS в активном состоянии «логическая 1» не поддерживается (флаг SPI_CS_HIGH режима должен быть равен 0).

  • Передача слов данных младшим битом вперед не поддерживается (флаг SPI_LSB_FIRST режима должен быть равен 0).

  • Передача/прием данных по одной линии не поддерживается (флаг SPI_3WIRE режима должен быть равен 0).

  • Режим loopback не поддерживается (флаг SPI_LOOP режима должен быть равен 0).

  • Режим ведомого устройства на шине SPI не поддерживается (флаг SPI_SLAVE режима должен быть равен 0).

  • Пропуск принятых байтов данных перед преамбулой не поддерживается (флаг SPI_PREAMBLE режима должен быть равен 0).

  • Передача данных по двум выводам на шине SPI не поддерживается (флаг SPI_TX_DUAL режима должен быть равен 0).

  • Прием данных по двум выводам на шине SPI не поддерживается (флаг SPI_RX_DUAL режима должен быть равен 0).

При инициализации драйвер выполняет:

  • захват и включение тактового сигнала;

  • вывод контроллера QSPI из состояния сброса;

  • настройку контактных площадок в подсистеме HSPERIPH для внешних выводов контроллера QSPI1 на микросхеме MCom-03;

  • начальную настройку контроллера QSPI.

При удалении драйвер выполняет:

  • выключение тактового сигнала;

  • ввод контроллера QSPI в состояние сброса.

3.3. Поддержка ELV-MC03-SMARC

Загрузчик и переменные окружения размещаются в QSPI0.

Загрузчик поддерживает нижеперечисленные интерфейсы модуля ELV-MC03-SMARC. Наименования интерфейсов приведены в соответствии со спецификацией SMARC 2.1. В скобках указаны контроллеры MCom-03.

Интерфейс

Примечание

eMMC (SDMMC0)

Поддерживается SDR50

GBE0, GBE1

Ethernet 1 Гбит/с

SDIO (SDMMC1)

QSPI0

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

SER1 (UART0)

Консоль MCom-03

USB0, USB1, USB2, USB4, USB5 (USB1)

Только USB 2.0

3.3.1. Поддержка ROCK Pi N10

Загрузчик поддерживает следующие интерфейсы модуля ROCK Pi N10:

Интерфейс

Примечание

Ethernet

Ethernet 1 Гбит/с (скорости 10 Мб/с и 100 Мб/с не поддерживаются)

SD-карта

Поддерживается Default Speed. Подключена к SDMMC1 MCom-03

UART0

Консоль MCom-03

USB Type-A

USB 2.0 (порт USB 3.0, поддерживает только устройства USB 2.0). Подключен к USB0 MCom-03

3.3.2. Поддержка NGFW-CB

Загрузчик поддерживает следующие интерфейсы модуля NGFW-CB:

Интерфейс

Примечание

Ethernet

Два порта Ethernet 1 Гбит/с

SD-карта

Поддерживается Default Speed. Подключена к SDMMC1 MCom-03

UART0

Консоль MCom-03

USB Type-A

Только USB 2.0. Подключен к USB1 MCom-03. На разъёме два USB-порта

3.3.3. Поддержка conga-SEVAL

Загрузчик поддерживает следующие интерфейсы модуля conga-SEVAL:

Интерфейс

Примечание

Ethernet

Два порта Ethernet 1 Гбит/с

Micro USB

Работает в режиме USB 2.0. Подключен к USB1 MCom-03 через хаб на ELV-MC03-SMARC

USB Type-A

Работает в режиме USB 2.0. Подключен к USB1 MCom-03 через хаб на ELV-MC03-SMARC

USB Type-C

Работает в режиме USB 3.0. Подключен к USB0 MCom-03

SD-карта

Поддерживается Default Speed. Подключена к SDMMC1 MCom-03

UART0

Консоль MCom-03

3.3.4. Поддержка ELV-SMARC-CB

Загрузчик поддерживает следующие интерфейсы модуля ELV-SMARC-CB:

Интерфейс

Примечание

Ethernet

Два порта Ethernet 1 Гбит/с

DBG UART

Консоль MCom-03. Подключен к SER1 на ELV-MC03-SMARC.

Наименования интерфейсов указаны в соответствии с маркировкой на плате.

3.4. Поддержка Трастфон-Э

Загрузчик и переменные окружения размещаются в QSPI0.

3.5. Поддержка MCom-03 BuB

Загрузчик и переменные окружения размещаются в QSPI0.

Загрузчик поддерживает следующие интерфейсы модуля MCom-03 BuB:

Интерфейс

Примечание

eMMC

Память eMMC подключена к SDMMC1 MCom-03

Ethernet

Два порта Ethernet 1 Гбит/с

NAND

Поддерживается память, подключенная к шине данных [7:0]

SD-карта

Поддерживается Default Speed. SD-карта подключена к SDMMC0 MCom-03

QSPI0

Подключена съемная Flash-память. Поддерживается только однобитный режим

QSPI1

Подключена съемная Flash-память. Поддерживается только однобитный режим

UART0

Консоль MCom-03

USB0

Только USB 2.0. Подключен к USB0 MCom-03

USB1

Только USB 2.0. Подключен к USB1 MCom-03

3.6. Инструкции по конфигурации

3.6.1. Загрузка Linux по TFTP и NFS

Для загрузки Linux по TFTP и корневой файловой системы по NFS со статическим назначением IP-адреса модулю необходимо:

  1. Настроить на ПК серверы TFTP и NFS:

    • В качестве директории для NFS-сервера использовать смонтированный образ rootfs.ext2.

    • В корне TFTP-сервера необходимо:

      • Скопировать образ ядра Image.

      • Создать директорию pxelinux.cfg и создать в ней файл default-arm-mcom03 с содержимым:

        TIMEOUT 3
        
        LABEL MCom-03 Buildroot
          MENU LABEL PXE boot
          LINUX /Image
          FDTDIR /elvees
          APPEND console=ttyS0,115200 root=/dev/nfs rw nfsroot=<ip_address>:/exports,vers=3 ip=dhcp earlycon
        
      • Изменить <ip_address> в файле default-arm-mcom03 на IP-адрес NFS-сервера. (не рекомендуется использовать имя хоста NFS-сервера вместо IP-адреса).

  2. Включить модуль, дождаться загрузки терминала U-Boot, установить IP-адрес TFTP-сервера:

    setenv ipaddr <ip_address>
    
  3. Установить переменную boot_targets:

    setenv boot_targets pxe
    
  4. (Опционально) Сохранить переменные окружения:

    saveenv
    
  5. Выполнить команду загрузки:

    boot