Обзор загрузчика U-Boot

Далее описаны особенности работы загрузчика U-Boot 2019.07-rc2.

Поддержка периферии

В таблице 3.1 приведены сведения о поддерживаемой периферии в U-Boot 2019.07-rc2 для различных микросхем.

Таблица 3.1 - Поддержка периферии

Микросхема

Кодовое имя

UART

MFBSP-SPI

Ethernet

1892ВМ15Ф

МС-30SF6

1892ВМ206

MCT-06

➕ - присутствует драйвер.
➖ - отсутствует драйвер.
✖️ - отсутствует контроллер в микросхеме.

Исходный код

Основные файлы поддержки микросхемы в загрузчике U-Boot:

Примечание

board_name - название модуля (mct06em и т.д.)

  • файлы начальной инициализации:

    • arch/mips/cpu/elvees/*.S

    • arch/mips/cpu/elvees/*.c

    • arch/mips/include/asm/mach-elvees/*.h

    • board/elvees-mips/board_name/*.c

    • board/elvees-mips/board_name/*.S

  • файлы конфигурации (Board-dependent files):

    • board/elvees-mips/board_name/Kconfig

  • файлы конфигурации платы по умолчанию (Defconfigs):

    • configs/mct*_defconfig

    • configs/mc30sf6_defconfig

  • файлы конфигурации для поддерживаемых модулей:

    • include/configs/mct*.h

    • include/configs/mc30sf6.h.

Конфигурация, сборка и загрузка

Соответствие микросхемы, модуля и конфигурации приведено в таблице 3.2.

Таблица 3.2 - Соответствие микросхемы, модуля и конфигурации

Микросхема

Кодовое имя

Модуль

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

1892ВМ15Ф

МС-30SF6

МС-30SF6EM-6U

mc30sf6em_uboot_defconfig

1892ВМ206

MCT-06

MCT-06EM-6U

mct06em_uboot_defconfig

После успешной сборки Buildroot образ U-Boot находится в buildroot/output/images, а также находится в составе образа image-boot.img загружаемого во flash-накопитель. Для загрузки образа на целевую плату необходимо использовать утилиту mcprog (см. Утилита mcprog).

Варианты загрузки ядра Linux с помощью U-Boot

Сборка Buildroot

Выполнить сборку Buildroot можно без использования Docker (см. Сборка и настройка дистрибутива на локальном ПК (Native Buildroot build) или с использованием Docker Сборка и настройка дистрибутива на основе Docker). Результат сборки находится в ./buildroot/output/images.

Загрузка Linux через TFTP

Для загрузки Linux через TFTP следует:

  1. Выполнить Сборка Buildroot.

  2. Прошить образ на SPI flash-накопитель через утилиту mcprog (см. Утилита mcprog).

  3. Сконфигуровать TFTP-сервер на host-компьютере (см. в интернете).

  4. Скопировать uImage в корневую папку TFTP-сервера, например:

    $ cp ./buildroot/output/images/uImage /var/lib/tftpboot/
    
  5. Выполнить перезагрузку модуля.

  6. Если flash-накопитель был успешно прошит, на UART0 выводится результат загрузки U-Boot:

    U-Boot 2019.07-rc2 (Mar 14 2023 - 14:08:01 +0000)
    
    Board: Elvees mips CPU: proc_id=0xa2001
          Watchdog enabled
    DRAM:  64 MiB
    In:    serial
    Out:   serial
    Err:   serial
    Net:   eth_init: transceiver `LAN8710A' detected at address 0
    elvees_emac
    Hit any key to stop autoboot:  0
    elvees-mips #
    
  7. В командной строке U-Boot следует прописать переменную окружения serverip, указав ей значение IP-адреса host-машины, с которой будет загружаться uImage через TFTP и имя загружаемого файла:

    elvees-mips # setenv serverip <host-ip>
    elvees-mips # setenv bootfile uImage
    
  8. Далее выполнить команду:

    elvees-mips # boot
    
  9. После команды boot будет получение IP-адреса от DHCP сервера, затем выполнится загрузка uImage по TFTP.

  10. Сразу после загрузки uImage по TFTP будет запущен Linux с выводом результата на тот же UART0.

Загрузка Linux через TFTP с RootFS в NFS

Для загрузки Linux через TFTP с RootFS в NFS следует:

  1. Настроить NFS сервер на host-машине. Например, для CentOS8: https://www.tecmint.com/install-nfs-server-on-centos-8/.

  2. Для NFS-директории /etc/exports/ указать параметры:

    /exports/ *(rw,sync,insecure,fsid=0,no_subtree_check,no_root_squash)
    
  3. Выполнить команду:

    $ exportfs -arv
    
  4. Выполнить Сборка Buildroot с использованием defconfig с поддержкой NFS.

  5. Распаковать rootfs.tar.gz в папку с NFS-сервером:

    $ tar -xf ./buildroot/output/images/rootfs.tar -C /exports/
    
  6. Передать Linux аргументы для запуска:

    • В составе Linux-образа:

      1. Изменить Linux Kernel Kconfig c помощью команды linux-menuconfig. Kernel hacking → [*] Built-in kernel command line → Default kernel command string заменить IP-адрес на IP-адрес host-машины, указать путь до NFS rootfs директории. Пересобрать ядро:

        [*] Built-in kernel command line
        (console=ttyS0,115200N ip=dhcp nfsroot=<host-ip>:<nfs-root-host-path>,vers=3,tcp root=/dev/nfs rw) Default Kernel command string
        
      2. Выполнить заново сборку Linux с помощью команды:

        $ make linux-rebuild
        
    • С помощью переменной окружения загрузчика U-Boot:

      1. Убедиться, что строка в составе Linux-образа пустая или не дублирует команды из переменной bootargs описанной ниже.

      2. При запуске загрузчика необходимо будет дополнительно ввести команды:

        elvees-mips # setenv bootargs console=ttyS0,115200 root=/dev/nfs rw nfsroot=${serverip}:/exports/,vers=3,tcp ip=dhcp
        elvees-mips # saveenv
        
  7. Выполнить шаги 2-8 Загрузка Linux через TFTP.

  8. Сразу после загрузки по TFTP будет запущен Linux с выводом результата UART.

Загрузка Linux через PXE

Подробное описание загрузки через TFTP + PXE см. в https://wiki.stmicroelectronics.cn/stm32mpu/wiki/How_to_boot_the_kernel_via_TFTP_from_U-Boot).

Для загрузки Linux через PXE (TFTP + NFS) следует:

  1. Создать в корне TFTP-сервера директорию pxelinux.cfg, после чего, заменив IP_ADDRESS на IP-адрес NFS-сервера, создать в данной директории файл default-mips-multicore со следующим содержимым:

    TIMEOUT 3
    LABEL MC-30SF6 Buildroot
        MENU LABEL PXE boot
        LINUX /uImage
        APPEND console=ttyS0,115200N ip=dhcp nfsroot=<IP_ADDRESS>:/exports,vers=3,tcp root=/dev/nfs rw
    
  2. Выполнить шаги 1-6 Загрузка Linux через TFTP с RootFS в NFS.

  3. Выполнить шаги 2-7 Загрузка Linux через TFTP.

  4. Выполнить команды в U-Boot:

    elvees-mips # dhcp
    elvees-mips # pxe get
    elvees-mips # pxe boot
    

Загрузка Linux из SPI flash-накопителя

Для первичной загрузки/обновления образа ядра можно воспользоваться программой mcprog (см. Утилита mcprog) или через API загрузчика U-Boot + TFTP (предпочтительнее). В таблице 3.3 приведено расположение данных в SPI flash-накопителя.

Таблица 3.3 - Расположение данных в SPI flash-накопителе

Адреса

Размер

Данные

0x000000 – 0x0BFFFF

768 KiB

image-boot.img

0x0C0000 – 0x0CFFFF

64 KiB

U-Boot enviroment

0x0D0000 – 0x0FFFFF

192 KiB

Reserved

0x100000 – 0xFFFFFF

15 MiB

Linux

Для загрузки Linux из SPI flash:

  1. Выполнить Сборка Buildroot и шаги 1-7 Загрузка Linux через TFTP.

  2. Запрограммировать SPI flash-накопитель:

    • С помощью U-Boot:

      elvees-mips # set autoload off
      elvees-mips # dhcp
      elvees-mips # sf probe
      elvees-mips # tftpboot 0x82000000 uImage
      elvees-mips # sf erase 0x100000 +${filesize}
      elvees-mips # sf write 0x82000000 0x100000 ${filesize}
      elvees-mips # setenv uimage_filesize ${filesize}
      elvees-mips # saveenv
      
    • С помощью утилиты mcprog (см. Утилита mcprog):

      1. Выполнить команду:

        ./mcprog -t -e2 -b <board_name> -f <path-to>/uImage 0x100000
        
      2. Узнать размер записанного файла в hex формате:

        printf "%x\n" `stat -c "%s" <path-to>/uImage`
        
  3. Перезагрузить модуль.

  4. Загрузить образ из SPI flash-накопителя в RAM:

    elvees-mips # sf probe
    elvees-mips # sf read 0x82000000 0x100000 ${uimage_filesize}
    elvees-mips # bootm 0x82000000
    

    Примечание

    В случае использования утилиты mcprog для программирования SPI flash-накопителя необходимо заменить ${uimage_filesize} на значение размера записанного файла полученное самостоятельно