Обзор загрузчика U-Boot
Далее описаны особенности работы загрузчика U-Boot 2019.07-rc2.
Поддержка периферии
В таблице 3.1 приведены сведения о поддерживаемой периферии в U-Boot 2019.07-rc2 для различных микросхем.
Микросхема |
Кодовое имя |
UART |
MFBSP-SPI |
Ethernet |
|---|---|---|---|---|
1892ВМ15Ф |
МС-30SF6 |
➕ |
➕ |
➕ |
1892ВМ206 |
MCT-06 |
➕ |
➕ |
➖ |
Исходный код
Основные файлы поддержки микросхемы в загрузчике U-Boot:
Примечание
board_name - название модуля (mct06em и т.д.)
|
Конфигурация, сборка и загрузка
Соответствие микросхемы, модуля и конфигурации приведено в таблице 3.2.
Микросхема |
Кодовое имя |
Модуль |
Конфигурация |
|---|---|---|---|
1892ВМ15Ф |
МС-30SF6 |
МС-30SF6EM-6U |
|
1892ВМ206 |
MCT-06 |
MCT-06EM-6U |
|
После успешной сборки 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 следует:
Выполнить Сборка Buildroot.
Прошить образ на SPI flash-накопитель через утилиту
mcprog(см. Утилита mcprog).Сконфигуровать TFTP-сервер на host-компьютере (см. в интернете).
Скопировать uImage в корневую папку TFTP-сервера, например:
$ cp ./buildroot/output/images/uImage /var/lib/tftpboot/
Выполнить перезагрузку модуля.
Если 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 #В командной строке U-Boot следует прописать переменную окружения serverip, указав ей значение IP-адреса host-машины, с которой будет загружаться uImage через TFTP и имя загружаемого файла:
elvees-mips # setenv serverip <host-ip> elvees-mips # setenv bootfile uImage
Далее выполнить команду:
elvees-mips # boot
После команды boot будет получение IP-адреса от DHCP сервера, затем выполнится загрузка uImage по TFTP.
Сразу после загрузки uImage по TFTP будет запущен Linux с выводом результата на тот же UART0.
Загрузка Linux через TFTP с RootFS в NFS
Для загрузки Linux через TFTP с RootFS в NFS следует:
Настроить NFS сервер на host-машине. Например, для CentOS8: https://www.tecmint.com/install-nfs-server-on-centos-8/.
Для NFS-директории
/etc/exports/указать параметры:/exports/ *(rw,sync,insecure,fsid=0,no_subtree_check,no_root_squash)
Выполнить команду:
$ exportfs -arv
Выполнить Сборка Buildroot с использованием defconfig с поддержкой NFS.
Распаковать rootfs.tar.gz в папку с NFS-сервером:
$ tar -xf ./buildroot/output/images/rootfs.tar -C /exports/
Передать Linux аргументы для запуска:
В составе Linux-образа:
Изменить 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
Выполнить заново сборку Linux с помощью команды:
$ make linux-rebuild
С помощью переменной окружения загрузчика U-Boot:
Убедиться, что строка в составе Linux-образа пустая или не дублирует команды из переменной bootargs описанной ниже.
При запуске загрузчика необходимо будет дополнительно ввести команды:
elvees-mips # setenv bootargs console=ttyS0,115200 root=/dev/nfs rw nfsroot=${serverip}:/exports/,vers=3,tcp ip=dhcp elvees-mips # saveenv
Выполнить шаги 2-8 Загрузка Linux через TFTP.
Сразу после загрузки по 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) следует:
Создать в корне 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
Выполнить шаги 1-6 Загрузка Linux через TFTP с RootFS в NFS.
Выполнить шаги 2-7 Загрузка Linux через TFTP.
Выполнить команды в 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-накопителя.
Адреса |
Размер |
Данные |
|---|---|---|
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:
Выполнить Сборка Buildroot и шаги 1-7 Загрузка Linux через TFTP.
Запрограммировать 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):Выполнить команду:
./mcprog -t -e2 -b <board_name> -f <path-to>/uImage 0x100000
Узнать размер записанного файла в hex формате:
printf "%x\n" `stat -c "%s" <path-to>/uImage`
Перезагрузить модуль.
Загрузить образ из SPI flash-накопителя в RAM:
elvees-mips # sf probe elvees-mips # sf read 0x82000000 0x100000 ${uimage_filesize} elvees-mips # bootm 0x82000000
Примечание
В случае использования утилиты
mcprogдля программирования SPI flash-накопителя необходимо заменить ${uimage_filesize} на значение размера записанного файла полученное самостоятельно