Обзор загрузчика 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:

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

    • 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.

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

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

Соответствие микросхемы, модуля и конфигурации приведено в таблице 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-машины, переименовать папку /exports/. Пересобрать ядро:

        [*] Built-in kernel command line
        (console=ttyS0,115200N ip=dhcp nfsroot=<host-ip>:/exports/,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:

    Примечание

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

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