Загрузчик U-Boot для 1892ВМ14Я. Руководство программиста¶
О документе¶
Данный документ описывает особенности работы загрузчика U-Boot 2019.01.0.9 для следующих модулей на базе СнК 1892ВМ14Я (далее MCom-02):
- Салют-ЭЛ24Д1 r1.3;
- Салют-ЭЛ24Д1 r1.4;
- Салют-ЭЛ24Д1 r1.5;
- Салют-ЭЛ24Д1 r1.5 с установленным навигационным радиомодулем RF2Chan v2;
- Салют-ЭЛ24Д2 r1.1;
- Салют-ЭЛ24ОМ1 r1.1 с установленным Салют-ЭЛ24ПМ1 r1.1 или Салют-ЭЛ24ПМ1 r1.2;
- Салют-ЭЛ24ОМ1 r1.2 с установленным Салют-ЭЛ24ПМ1 r1.2, Салют-ЭЛ24ПМ2 r1.0 или Салют-ЭЛ24ПМ2 r1.1.
Назначение и основные особенности загрузчика¶
Основное назначение загрузчика:
- начальная инициализация аппаратуры;
- загрузка Device Tree Blob (DTB) из SPI флеш-памяти или с SD/MMC/USB/NAND-носителя [1];
- загрузка образа Linux с SD/MMC/USB/NAND-носителя;
- загрузка образа Linux по TFTP;
- загрузка baremetal приложений из SPI флеш-памяти или с SD/MMC/USB/NAND-носителя;
[1] | Загрузчик не поддерживает USB на модулях Салют-ЭЛ24ПМ1. |
Основные особенности загрузчика:
- поддержка схем загрузки Linux Distro и Legacy;
- передача параметров запуска Linux;
- инициализация контроллеров памяти DDR;
- загрузка и редактирование DTB;
- поддержка переменных окружения;
- поддержка монитора U-Boot по терминалу UART;
- поддержка сторожевого таймера;
- поддержка программной перезагрузки;
- поддержка GPIO;
- поддержка I2C;
- поддержка USB на встроенном контроллере USBIC в режиме Host/Device [2];
- поддержка MMC;
- поддержка SPI флеш-памяти;
- поддержка NAND флеш-памяти [3];
- поддержка Ethernet;
- поддержка файловых систем FAT, ext2, ext4 (только чтение), UBIFS;
- поддержка заводских настроек;
- вывод статуса последнего сброса микросхемы.
[2] | Для работы USB в режиме Device необходимо, чтобы USB на плате был разведён в режиме OTG/Device. На модулях Салют-ЭЛ24OM1, Салют-ЭЛ24Д1 и Салют-ЭЛ24Д2 USB разведён только в режиме Host. |
[3] | Термином NAND флеш-память в U-Boot обозначается флеш-память параллельного NAND, подключенного к контроллеру NFC. |
Загрузчик реализует обходы для следующих ограничений согласно документу «Микросхема интегральная 1892ВМ14Я. Перечень выявленных ограничений»:
- #867;
- #971;
- #972;
- #1160;
- #1969;
- #3346.
Сборка загрузчика¶
Исходные коды¶
Исходные коды основаны на U-Boot 2019.01.
Имена файлов и директорий указаны относительно корневой директории исходных кодов загрузчика.
Описание общей структуры исходных кодов доступно в файле README
.
Список файлов для поддержки модулей на базе MCom-02:
- Файлы начальной инициализации:
arch/arm/cpu/armv7/mcom/*.c
arch/arm/cpu/armv7/mcom/*.S
arch/arm/include/asm/arch-mcom/*.h
board/elvees/common/*.c
board/elvees/salute/*.c
board/elvees/salute-pm/*.c
- Файлы Device Tree Source (DTS):
arch/arm/dts/mcom*.dts
arch/arm/dts/mcom*.dtsi
- Файлы конфигурации Kconfig:
arch/arm/cpu/armv7/mcom/Kconfig
board/elvees/Kconfig
board/elvees/salute/Kconfig
board/elvees/salute-pm/Kconfig
configs/saluted1_defconfig
configs/saluted2_defconfig
configs/salutepm_defconfig
- Файлы конфигурации для поддерживаемых модулей:
include/configs/mcom.h
Конфигурация¶
Подробное описание параметров конфигурации загрузчика содержится в файле README
.
Дополнительные параметры конфигурации для модулей на базе MCom-02:
DDR_CALIBRATION
Включение режима калибровки памяти DDR.
Значение по умолчанию: не задано.
DDR_CALIBRATION_DDRMC_ID
Номер контроллера DDR для режима калибровки.
Значение по умолчанию:
0
.HW_WATCHDOG
Включение аппаратного сторожевого таймера.
Значение по умолчанию: не задано.
BOOT_ELF_FROM_SPI
Включение загрузки ELF-файла из SPI флеш-памяти.
Значение по умолчанию: не задано.
Сборка¶
Результатом сборки исходных кодов загрузчика является образ u-boot.mcom
, предназначенный для
прошивки SPI флеш-памяти модуля или записи на SD/MMC-карту. Образ доступен в корневой директории
загрузчика после завершения сборки.
Для сборки загрузчика на ПЭВМ должно быть установлено следующее программное обеспечение:
- arm-linux-gnueabi toolchain для кросс-компиляции;
Переменные окружения, влияющие на сборку загрузчика:
ARCH
— целевая архитектура;CROSS_COMPILE
— префикс кросс-компилятора;DEVICE_TREE
— имя файла DTS (без расширения) для целевого модуля;PATH
— пути для поиска используемых приложений.
Соответствие модулей, конфигураций и имён DTS файлов приведено в таблице 20.
Модуль | Конфигурация | DTS |
---|---|---|
Салют-ЭЛ24Д1 r1.3 | saluted1_defconfig |
mcom02-saluteel24d1-r1.3 |
Салют-ЭЛ24Д1 r1.4 | saluted1_defconfig |
mcom02-saluteel24d1-r1.4 |
Салют-ЭЛ24Д1 r1.5 | saluted1_defconfig |
mcom02-saluteel24d1-r1.5 |
Салют-ЭЛ24Д1 r1.5 c RF2Chan | saluted1_defconfig |
mcom02-saluteel24d1-r1.5-rf2chan |
Салют-ЭЛ24Д2 r1.1 | saluted2_defconfig |
mcom02-saluteel24d2-r1.1 |
Салют-ЭЛ24ПМ1 с ОМ1 | salutepm_defconfig |
mcom02-saluteel24pm1-r1.1-1.2-om1-r1.1-1.2 |
Салют-ЭЛ24ПМ2 с ОМ1 | salutepm_defconfig |
mcom02-saluteel24pm2-r1.0-1.1-om1-r1.2 |
Пример сборки загрузчика для модуля Салют-ЭЛ24Д1 r1.3:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
export DEVICE_TREE=mcom02-salute-el24d1-r1.3
make saluted1_defconfig
make
Состав образа¶
Образ загрузчика u-boot.mcom
состоит из образа U-Boot, прикрепленного к образу U-Boot SPL.
Образ U-Boot включает DTB для настройки устройств и передачи в Linux.
Образы U-Boot SPL и U-Boot имеют формат uImage и создаются приложением tools/mkimage
, входящим
в состав загрузчика.
Для обхода ограничения #867 в заголовке образа U-Boot SPL значению поля Target Operating System
присваивается значение U-Boot
.
Для обхода ограничения #3346 размер образа U-Boot SPL выравнивается до ближайшего четного значения.
Схема разбиения образа u-boot.mcom
представлена в таблице 21.
Область | Смещение (КБ) | Максимальный размер (КБ) |
---|---|---|
Образ U-Boot SPL | 0 | 56 |
Переменные окружения [4] | 64 | 64 |
Образ U-Boot | 128 |
[4] | Размер и смещение области переменных окружения выровнены на границу сектора SPI флеш-памяти, установленной на модулях на базе MCom-02. При сохранении переменных окружения загрузчик стирает соответствующую область SPI флеш-памяти. |
Запуск загрузчика¶
Обзор загрузки¶
При включении питания модуля выполняется:
- Первичный загрузчик BootROM копирует U-Boot Secondary Program Loader (U-Boot SPL) из SPI флеш-памяти или с SD/MMC-карты во внутреннюю память RAM и передает ему управление. Источник копирования определяется значением регистра BOOT контроллера SMCTR СнК 1892ВМ14Я.
- U-Boot SPL копирует основной загрузчик (U-Boot) из SPI флеш-памяти или с SD/MMC-карты в память DDR и передает ему управление. Источник копирования определяется значением регистра BOOT контроллера SMCTR СнК 1892ВМ14Я. Подробнее см Инициализация U-Boot SPL.
- U-Boot выполняет:
- Чтение заводских настроек в соответствии с документом «Спецификация заводских настроек
модулей на базе 1892ВМ14Я». Подробнее см. описание переменных окружения
factory_eth_mac
иfactory_serial
. - Выключение контроллера DDR, заданного переменной
ddrctl_cid
, если значение переменнойddrctl_cmd
установлено вdisable
. По умолчанию выключается контроллер DDR1 для модулей Салют-ЭЛ24Д1 и Салют-ЭЛ24Д2. - Исполнение сценария, заданного переменной окружения
bootcmd
. Выполнение сценария может быть прервано отсылкой любого символа в терминал UART модуля. В этом случае запускается монитор U-Boot для выполнения команд загрузчика (подробнее см. Команды).
- Чтение заводских настроек в соответствии с документом «Спецификация заводских настроек
модулей на базе 1892ВМ14Я». Подробнее см. описание переменных окружения
В зависимости от значения переменной окружения bootcmd
возможны сценарии работы
(подробнее см. Загрузка целевого приложения):
- загрузка Linux с SDMMC0-носителя (установлен по умолчанию);
- загрузка Linux с SDMMC1-носителя;
- загрузка Linux с USB-носителя;
- загрузка Linux с NAND-носителя;
- загрузка Linux по TFTP и NFS;
- загрузка ELF-файла из SPI флеш-памяти.
Для загрузки Linux c SD/MMC/USB/NAND-носителя носитель должен содержать загрузочный раздел, соответствующий требованиям:
- быть основным (первичным);
- содержать в корневой директории файл образа Linux (см.
bootfile
).
Инициализация U-Boot SPL¶
При инициализации U-Boot SPL выполняется:
- включение L1-кэша инструкций для CPU0, CPU1 (L1-кэш данных включается для CPU0 в основном загрузчике);
- минимальная начальная настройка аппаратуры (см. функцию
board_init_f()
в файлеarch/arm/cpu/armv7/mcom/board.c
):- выключение ядра CPU1 (подробнее см. Передача управления из U-Boot в baremetal-приложение);
- выключение DDR retention (ограничение #1160);
- запись адреса функции холодного сброса BootROM в регистр ALWAYS_MISC0;
- включение сторожевого таймера, если задано конфигурацией;
- включение отображения загрузочных областей по умолчанию (ограничение #971);
- включение конфигурации по умолчанию для коммутатора Accelerator Coherency Port (ограничение #972);
- настройка APLL, CPLL и SPLL;
- настройка терминала UART0;
- включение питания модулей памяти DDR0 и DDR1 (для модулей Салют-ЭЛ24ПМ);
- настройка контроллеров памяти DDR0 и DDR1;
- настройка контроллеров SDMMC0 и SDMMC1 (включение резистивных подтяжек и т.д.);
- загрузка U-Boot (см. функцию
board_init_r()
в файлеcommon/spl/spl.c
):- загрузка драйвера GPIO;
- загрузка драйвера SPI для контроллера SPI0;
- загрузка драйвера SPI флеш-памяти;
- загрузка драйвера контроллерa SDMMC;
- загрузка драйвера контроллера USBIC;
- копирование из SPI флеш-памяти или с SD/MMC-карты в память DDR основного загрузчика;
- передача управления основному загрузчику.
Карта распределения ОЗУ¶
После запуска загрузчик располагается в верхней области памяти, подключенной к контроллеру DDR0. Свободные области DDR0/DDR1 могут использоваться для загрузки Linux и автономных приложений.
Расположение загрузчика в памяти для поддерживаемых модулей на базе MCom-02 показано в таблице 22.
Область | Начальный адрес | Конечный адрес |
---|---|---|
Свободная память | 0x40000000 | 0x7EFFFFFF |
U-Boot [5] | 0x7F000000 | 0x7FFFFFFF |
Свободная память | 0xA0000000 | 0xDFFFFFFF |
[5] | Начальный адрес области памяти, используемой загрузчиком, указан для справки и изменяется в зависимости от конфигурации загрузчика. |
Подробную информацию об использовании памяти загрузчиком можно получить с помощью команды монитора
bdinfo
.
Переменные окружения¶
Загрузчик поддерживает возможность настройки через переменные окружения.
Во время запуска загрузчик выполняет поиск переменных окружения, сохраненных в SPI флеш-памяти:
- при успешном обнаружении устанавливаются переменные окружения, сохраненные в SPI флеш-памяти;
- в случае ошибки устанавливаются переменные окружения, заданные по умолчанию.
Переменные окружения загрузчика, заданные по умолчанию (см. файл include/configs/mcom.h
):
-
bootfile
¶ Имя файла, содержащего образ Linux для загрузки.
Значение по умолчанию:
zImage
.
-
loadaddr
¶ Адрес буфера для копирования образа Linux с SD/MMC/USB/NAND-носителя.
Значение по умолчанию:
0x40000000
.
-
bootm_low
¶ Нижняя граница области памяти, используемой для загрузки Linux.
Значение по умолчанию: не задано.
-
bootm_size
¶ Размер области памяти, используемой для загрузки Linux.
Значение по умолчанию:
0x10000000
.
-
stdin, stdout, stderr
¶ Имена стандартных устройств ввода/вывода, используемых загрузчиком.
Значение по умолчанию:
serial
.
-
ddrctl_cmd
¶ Команда управления контроллерами DDR.
Значение по умолчанию:
disable
.
-
ddrctl_cid
¶ Номер контроллера DDR для команды
ddrctl_cmd
.Значение по умолчанию:
1
.
-
bootcmd
¶ Последовательность действий, выполняемых при команде
boot
.Значение по умолчанию соответствует последовательности действий, описанной ниже.
Если загрузчик собран с включенной опцией
BOOT_ELF_FROM_SPI
, то выполняется:- Копирование ELF-файла приложения из SPI флеш-памяти в ОЗУ. Источник размещения в SPI
флеш-памяти определяется переменными окружения
bootelf_elfsize
,bootelf_spibus
,bootelf_spioffset
. Адрес в ОЗУ определяется переменнойbootelf_addr
. - Передача управления в скопированный ELF-файл.
Если загрузчик собран с выключенной опцией
BOOT_ELF_FROM_SPI
, то выполняется последовательность команд, указанная в переменнойboot_targets
. Если в названии команды присутствует префиксlegacy
, будет использована схема загрузки Legacy, в противном случае — Distro. Если команда завершилась не успешно, загрузчик переходит к выполнению следующей команды из спискаboot_targets
. Например, приboot_targets="legacy_mmc0 mmc0"
будет выполнено:- команда загрузки Linux c SDMMC0 с использованием схемы Legacy;
- если
legacy_mmc0
завершится не успешно, команда загрузки Linux c SDMMC0 с использованием схемы Distro.
Последовательность действий, выполняемая при загрузке Linux c использованием схемы Legacy:
- Выполнение команд, заданных переменной
bootenvcmd
. - Чтение образа Linux с загрузочного раздела SD/MMC/USB/NAND-носителя в память по адресу,
заданному переменной
loadaddr
. Устройство и файл, содержащие образ Linux, номер загрузочного раздела задаются переменнымиboot_targets
,bootfile
,bootpartnum
. - Запуск образа Linux по адресу, заданному переменной
loadaddr
. При запуске загрузчик:- устанавливает параметры загрузки Linux, заданные переменной
set_bootargs
; - копирует и модифицирует DTB (подробнее см. Состав образа), передает Linux адрес модифицированного DTB.
- устанавливает параметры загрузки Linux, заданные переменной
Последовательность действий, выполняемая при загрузке Linux c использованием схемы Distro:
- Поиск файла
extlinux/extlinux.conf
на загрузочном разделе SD/MMC/USB/NAND-носителя. - Чтение и обработка опций, заданных в
extlinux/extlinux.conf
. - Загрузка образа Linux по адресу, указанному в переменной
kernel_addr_r
. - Запуск образа Linux с помощью команды
sysboot
.
- Копирование ELF-файла приложения из SPI флеш-памяти в ОЗУ. Источник размещения в SPI
флеш-памяти определяется переменными окружения
-
bootenvcmd
¶ Дополнительная команда, выполняемая перед загрузкой Linux.
Значение по умолчанию: не задано.
-
console
¶ Имя и параметры устройства Linux, используемого в качестве консоли.
Значение по умолчанию:
ttyS0,115200
.
-
cmdline
¶ Дополнительные параметры загрузки Linux.
Значение по умолчанию: не задано.
-
boot_targets
¶ Последовательность команд загрузки Linux (подробнее см.
bootcmd
).Значение по умолчанию:
mmc0, legacy_mmc0, mmc1, legacy_mmc1, usb0, legacy_usb0, ubifs0, legacy_ubifs0
.
-
bootpartnum
¶ Номер раздела SD/MMC/USB/NAND-носителя, используемого для загрузки Linux и файла переменных
окружения. Значение по умолчанию:
1
.
-
rootpartnum
¶ Номер раздела SD/MMC/USB/NAND-носителя, содержащего корневую файловую систему.
Значение по умолчанию:
2
.
-
set_bootargs
¶ Параметры загрузки Linux для режима загрузки с SD/MMC/USB/NAND-носителя.
Значение по умолчанию:
setenv bootargs console=${console} root=${rootfsdev} rootfstype=${rootfstype} rw rootwait ${cmdline}
.
-
rootfstype
¶ Тип корневой файловой системы Linux для режима загрузки с SD/MMC/USB/NAND-носителя.
Значение по умолчанию:
ext4
.
-
bootelf_addr
¶ Адрес памяти ОЗУ для загрузки ELF-файла.
Значение по умолчанию:
0x50000000
.
-
bootelf_elfsize
¶ Размер ELF-файла в байтах.
Значение по умолчанию:
0x200000
.
-
bootelf_spibus
¶ Номер шины SPI к которой подключен чип SPI флеш-памяти.
Значение по умолчанию:
0
.
-
bootelf_spioffset
¶ Смещение ELF-файла в SPI флеш-памяти в байтах.
Значение по умолчанию:
0x100000
.
-
ethaddr
¶ MAC-адрес контроллера Ethernet. При наличии переменной, U-Boot использует указанный адрес для инициализации контроллерa Ethernet и добавляет свойство
local-mac-address
в узел контроллерa внутри Device Tree. Поиск узла осуществляется посредством псевдонимаethernet
узлаaliases
. Таким образом, U-Boot и Linux используют один MAC-адрес во время работы. При отсутствии переменной U-Boot и Linux генерируют произвольные MAC-адреса независимо.При загрузке модуля выполняется чтение заводских настроек и анализ наличия переменной
factory_eth_mac
. Если переменнаяfactory_eth_mac
существует, аethaddr
не существует, тоethaddr
создаётся и заполняется значениемfactory_eth_mac
. В противном случаеethaddr
не изменяется.
-
factoryoffset
¶ Смещение в байтах последнего сектора SPI флеш-памяти, где хранятся заводские настройки. Переменная создаётся динамически и не должна изменяться пользователем.
-
factorysize
¶ Размер в байтах сектора SPI флеш-памяти, где хранятся заводские настройки. Переменная создаётся динамически и не должна изменяться пользователем.
-
factory_eth_mac
¶ MAC-адрес Ethernet из заводских настроек. Переменная создаётся динамически и не должна изменяться пользователем. Переменная не создаётся в случае отсутствия заводских настроек. См. также
ethaddr
.
-
factory_serial
¶ Серийный номер модуля из заводских настроек. Переменная создаётся динамически и не должна изменяться пользователем. Переменная не создаётся в случае отсутствия заводских настроек.
Значение переменной записывается в свойство
serial-number
в DTB (свойство доступно в Linux).
-
kernel_addr_r
¶ Адрес буфера для копирования образа Linux с SD/MMC/USB/NAND-носителя. Используется при загрузке c использовании схемы загрузки Distro.
Значение по умолчанию:
0x40000000
.
-
fdt_addr_r
¶ Адрес буфера для копирования DTB-файла с SD/MMC/USB/NAND-носителя. Используется при загрузке c использовании схемы загрузки Distro, если в
extlinux/extlinux.conf
заданы опцииfdtdir
илиfdt
.Значение по умолчанию:
0x48000000
.
-
fdt_addr
¶ Адрес буфера, содержащего DTB-файл. Используется при загрузке c использовании схемы загрузки Distro, если в
extlinux/extlinux.conf
не заданы опцииfdtdir
илиfdt
.Значение по умолчанию:
0x41000000
.
-
scriptaddr
¶ Адрес буфера для копирования и обработки файла
extlinux/extlinux.conf
. Используется при загрузке c использовании схемы загрузки Distro.Значение по умолчанию:
0x49000000
.
-
ramdisk_addr_r
¶ Адрес буфера для копирования ramdisk c SD/MMC/USB/NAND-носителя. Используется при загрузке c использовании схемы загрузки Distro.
Значение по умолчанию:
0x50000000
.
В мониторе U-Boot доступны функции управления переменными окружения.
Для возврата переменной окружения значения по умолчанию — в мониторе U-Boot выполнить команды:
env default <var_name>
saveenv
Описание некоторых переменных окружения содержится в файле README
.
Команды¶
Некоторые команды, поддерживаемые монитором загрузчика:
base
— установка смещения для команд обращения к памяти;bdinfo
— печать информации о модуле;bootd
— выполнение команды загрузки по умолчанию;bootelf
— загрузка образа ELF из памяти;bootm
— загрузка образа приложения из памяти;bootz
— загрузка образаzImage
из памяти;cmp
— сравнение содержимого памяти;coninfo
— печать информации о консольных устройствах;cp
— копирование содержимого памяти;crc32
— вычисление контрольной суммы;dm
— печать информации о драйверах устройств;echo
— печать аргументов;editenv
— редактирование переменных окружения;env
— управление переменными окружения;fdt
— управление Flattened Device Tree (FDT);go
— запуск приложения по указанному адресу;help
— печать справки и полного списка команд монитора;iminfo
— печать информации об образе приложения;load
— загрузка файла из файловой системы;loadb
— загрузка файла через терминал по протоколу Kermit;loads
— загрузка файла в формате S-Record через терминал;loadx
— загрузка файла через терминал по протоколу XMODEM;loady
— загрузка файла через терминал по протоколу YMODEM;loop
— бесконечный цикл по диапазону адресов;md
— отображение содержимого памяти;meminfo
— отображение информации о памяти;mm
— изменение содержимого памяти с автоматическим увеличением адреса;mmc
— функции для работы с подсистемой MMC;mmcinfo
— отображение информации о MMC;mw
— заполнение памяти;nm
— изменение содержимого памяти по постоянному адресу;printenv
— печать переменных окружения;reset
— выполнение «теплого» сброса микросхемы;run
— выполнение команд из указанной переменной окружения;save
— сохранение файла в файловой системе;saveenv
— сохранение переменных окружения;setenv
— установка переменных окружения;sf
— функции для работы с подсистемой SPI флеш-памяти;version
— печать версий монитора, компилятора и компоновщика.
Дополнительные команды монитора для модулей на базе MCom-02:
ddrctl disable <0|1>
Выключение контроллеров памяти DDR. Команда отключает тактовую частоту для указанного контроллера.
Полный список команд доступен по команде монитора help
.
Загрузка целевого приложения¶
Схемы загрузки Legacy и Distro¶
Загрузчик поддерживает загрузку Linux с SD/MMC/USB/NAND-носителя с использованием схем:
- Distro — схема загрузки c использованием файла
extlinux/extlinux.conf
; - Legacy — схема загрузки без использования файла
extlinux/extlinux.conf
.
Преимущества использования схемы Distro описаны в файле README.distro.
Формат файла extlinux/extlinux.conf
описан на
wiki.syslinux.org.
Последовательность действий при загрузке Linux описана в bootcmd
, список команд
загрузки — в boot_targets
.
Например, для загрузки с SDMMC1-носителя на модуле Салют-ЭЛ24ПМ с установленным Салют-ЭЛ24ОМ1 с использованием схемы Distro выполнить:
Создать файл
extlinux/extlinux.conf
на загрузочном разделе SD-карты. Содержимое файла:menu title Linux Boot Options default Buildroot timeout 20 label Buildroot kernel ../zImage append root=/dev/mmcblk0p2 rw rootwait console=ttyS0,115200 video=HDMI:1920x1080
В мониторе U-Boot установить переменную
boot_targets
в значениеmmc1
:setenv boot_targets mmc1 saveenv
Примечание
По умолчанию Buildroot 3.1 собирается в режиме Legacy. Дальнейшие инструкции по загрузке Linux приводятся для схемы загрузки Legacy, если не указано иное.
Загрузка ELF-файла из SPI флеш-памяти¶
Для загрузки ELF-файла из SPI флеш-памяти необходимо собрать загрузчик с опцией
BOOT_ELF_FROM_SPI
(подробнее см. bootcmd
).
Загрузка Linux с SD/MMC/USB-носителя¶
Для загрузки Linux с SD/MMC/USB-носителя необходимо выполнить:
Прошить образ SD-карты на SD/MMC/USB-носитель. Процедура описана в документе «Дистрибутив ОС GNU/Linux на базе Buildroot для 1892ВМ14Я. Руководство программиста».
Перезагрузить модуль и в мониторе U-Boot установить переменную окружения
boot_targets
в значение:legacy_usb0
для загрузки с USB-носителя;legacy_mmc0
для загрузки с SDMMC0-носителя;legacy_mmc1
для загрузки с SDMMC1-носителя.
Например, для загрузки с SDMMC1-носителя:
setenv boot_targets legacy_mmc1 saveenv
Перезагрузить модуль или выполнить команду загрузки в мониторе U-Boot:
boot
Загрузка Linux с NAND-носителя¶
Для загрузки Linux с NAND-носителя необходимо выполнить:
На модуле подготовить файловую систему на NAND-носителе. Нижеприведённые команды выполнять в терминале ОС Linux модуля:
Определить устройство NAND-носителя:
mtdinfo -a
В выведенном списке выбрать устройство с полем
Type: nand
.Подготовить разделы NAND и примонтировать их:
ubiformat /dev/<устройство NAND> ubiattach -p /dev/<устройство NAND> ubimkvol /dev/ubi0 -N boot -s 128MiB ubimkvol /dev/ubi0 -N root -s 1024MiB mkdir -p /mnt/boot mkdir -p /mnt/root mount -t ubifs ubi0:boot /mnt/boot mount -t ubifs ubi0:root /mnt/root
Скопировать с ПЭВМ файл образа Linux
zImage
, расположенный в директорииbuildroot/output/images
дистрибутива Buildroot, в директорию/mnt/boot
.Скопировать с ПЭВМ и распаковать архив
rootfs.tar
, расположенный в директорииbuildroot/output/images
дистрибутива Buildroot, в директорию/mnt/root
.Отмонтировать разделы:
sync umount /mnt/boot umount /mnt/root ubidetach -d 0
Перезагрузить модуль и установить переменную окружения
boot_targets
в значениеlegacy_ubifs0
.Выполнить команду загрузки в мониторе U-Boot:
boot
Загрузка Linux по TFTP и NFS¶
Для загрузки Linux по TFTP и корневой файловой системы по NFS со статическим назначением IP-адреса модулю в мониторе U-Boot необходимо выполнить:
Установить IP-адрес модуля:
setenv ipaddr <ip_address>
Установить IP-адрес TFTP-сервера:
setenv serverip <tftp_server_ip_address>
Установить параметры запуска Linux:
setenv bootargs console=ttyS0,115200 root=/dev/nfs rw nfsroot=<nfs_server_ip>:/<nfs_root_directory>,vers=3 ip=${ipaddr}
Установить команду загрузки Linux:
setenv bootcmd 'tftpboot; bootz ${loadaddr} - ${fdtcontroladdr}'
Сохранить переменные окружения:
saveenv
Перезагрузить модуль или выполнить команду загрузки:
boot
Для загрузки Linux по TFTP и корневой файловой системы по NFS c динамическим назначением IP-адреса модулю в мониторе U-Boot необходимо выполнить:
Установить IP-адрес TFTP-сервера:
setenv serverip <tftp_server_ip_address>
Установить параметры запуска Linux:
setenv bootargs console=ttyS0,115200 root=/dev/nfs rw nfsroot=<nfs_server_ip>:/<nfs_root_directory>,vers=3 ip=dhcp
Установить команду загрузки Linux:
setenv bootcmd 'tftpboot; dhcp; bootz ${loadaddr} - ${fdtcontroladdr}'
Сохранить переменные окружения:
saveenv
Перезагрузить модуль или выполнить команду загрузки:
boot
Передача управления из U-Boot в baremetal-приложение¶
Варианты передачи управления в baremetal-приложение:
- с возвратом в U-Boot,
- без возврата в U-Boot.
Для передачи управления без возврата в U-Boot необходимо:
- разработать исходный код приложения. Требования к исходному коду:
- секции кода, стека и данных не должны использовать используемые загрузчиком U-Boot адреса (подробнее см. Карта распределения ОЗУ);
- для включения CPU1 необходимо:
- переключить отображение нулевых адресов CPU1 в BootROM (записать значение 0x3 по физическому адресу 0x38096004);
- записать адрес начала кода, исполняемого CPU1, в регистр ALWAYS_MISC0;
- включить домен питания CPU1 (записать значение 4 по физическому адресу 0x38095000).
- скомпилировать ELF-файл приложения;
- загрузить ELF-файл приложения с ПЭВМ в память ОЗУ модуля, например:
- через интерфейс Ethernet:
- загрузить ELF-файл на сервер TFTP на ПЭВМ;
- загрузить ELF-файл приложения в память ОЗУ модуля командой
tftpboot
.
- через интерфейс SD/eMMC/USB:
- cкопировать ELF-файл приложения в раздел Boot на SD/eMMC/USB-носитель;
- загрузить ELF-файл приложения в память ОЗУ модуля. Например для модуля Салют-ЭЛ24ОМ1 с
установленным модулем Салют-ЭЛ24ПМ1 и установленной SD-картой необходимо выполнить команду
fatload mmc 1 <addr> <file.elf>
, где<addr>
— адрес ОЗУ для загрузки ELF-файла,<file.elf>
— имя ELF-файла на SD-карте.
- через интерфейс NAND:
- cкопировать ELF-файл приложения в раздел Boot NAND флеш-памяти;
- загрузить ELF-файл приложения в память ОЗУ модуля, выполнив команду
ubifsload <addr> <file.elf>
, где<addr>
— адрес ОЗУ для загрузки ELF-файла,<file.elf>
— имя ELF-файла в разделе Boot NAND флеш-памяти.
- через интерфейс SPI:
- загрузить ELF-файл приложения в SPI флеш-память:
- загрузить ELF-файл приложения в память ОЗУ модуля через интерфейсы UART, SD/eMMC, Ethernet;
- выполнить запись командой
sf write
.
- загрузить ELF-файл приложения в память ОЗУ модуля командой
sf read
.
- загрузить ELF-файл приложения в SPI флеш-память:
- через интерфейс UART:
- выполнить команду
loady
на модуле; - передать ELF-файл приложения с помощью программы
minicom
с использованием протокола YMODEM на ПЭВМ.
- выполнить команду
- через интерфейс Ethernet:
- передать управление из U-Boot в приложение командой
bootelf <addr>
, где<addr>
— адрес загруженного в памяти ELF-файла.