Обзор загрузчика 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-машины, переименовать папку /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
выполнить заново сборку 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:
Примечание
В случае использования утилиты
mcprog
для программирования SPI flash накопителя необходимо заменить ${uimage_filesize} на значение размера записанного файла полученное самостоятельноelvees-mips # sf probe elvees-mips # sf read 0x82000000 0x100000 ${uimage_filesize} elvees-mips # bootm 0x82000000