“U-Boot overview”的版本间的差异
(未显示同一用户的2个中间版本) | |||
第153行: | 第153行: | ||
== U-Boot command line interface (CLI) == | == U-Boot command line interface (CLI) == | ||
− | + | 请参阅 [http://www.denx.de/wiki/view/DULG/UBootCommandLineInterface U-Boot Command Line Interface]. | |
− | + | 如果CONFIG_AUTOBOOT已激活,则在显示以下行并执行[[#bootcmd|bootcmd]](CONFIG_BOOTCOMMAND)后,您有CONFIG_BOOTDELAY秒(默认情况下为2秒)通过按任意键进入控制台: | |
− | Hit any key to stop autoboot: | + | Hit any key to stop autoboot: 2 |
=== Commands === | === Commands === | ||
− | + | 这些命令在{{CodeSource | U-Boot | cmd/ | cmd/*.c}}. 通过相应的 '''CONFIG_CMD_*''' 配置标志激活它们。 | |
− | + | 使用U-Boot shell中的<code>help</code> 命令列出设备上可用的命令: | |
{{Board$}} help | {{Board$}} help | ||
− | + | 以下是从中提取的所有命令的列表 [http://www.denx.de/wiki/view/DULG/Manual U-Boot Manual] ('''不详尽'''): | |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupInfo Information Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupInfo Information Commands] | ||
− | ** bdinfo - | + | ** bdinfo - 打印板信息结构 |
− | ** coninfo - | + | ** coninfo - 打印控制台设备和信息 |
− | ** flinfo - | + | ** flinfo - 打印闪存信息 |
− | ** iminfo - | + | ** iminfo - 打印应用程序映像的标题信息 |
− | ** help - | + | ** help - 打印在线帮助 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupMemory Memory Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupMemory Memory Commands] | ||
− | ** base - | + | ** base - 打印或设置地址偏移量 |
− | ** crc32 - | + | ** crc32 - 校验和计算 |
− | ** cmp - | + | ** cmp - 内存比较 |
− | ** cp - | + | ** cp - 内存拷贝 |
− | ** md - | + | ** md - 内存显示 |
− | ** mm - | + | ** mm - 内存修改(自动递增) |
− | ** mtest - | + | ** mtest - 简单的RAM测试 |
− | ** mw - | + | ** mw - 内存写入(填充) |
− | ** nm - | + | ** nm - 内存修改(常量地址) |
− | ** loop - | + | ** loop - 地址范围内无限循环 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupFlash Flash Memory Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupFlash Flash Memory Commands] | ||
− | ** cp - | + | ** cp - 内存复制 |
− | ** flinfo - | + | ** flinfo - 打印闪存信息 |
− | ** erase - | + | ** erase - 清除闪存 |
− | ** protect - | + | ** protect - 启用或禁用闪存写入保护 |
− | ** mtdparts - | + | ** mtdparts - 定义与Linux兼容的MTD分区方案 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupExec Execution Control Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupExec Execution Control Commands] | ||
− | ** source - | + | ** source - 从内存运行脚本 |
− | ** bootm - | + | ** bootm - 从内存启动应用程序映像 |
− | ** go - | + | ** go - 在地址‘addr’处启动应用程序 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupDownload Download Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupDownload Download Commands] | ||
− | ** bootp - | + | ** bootp - 使用BOOTP / TFTP协议通过网络引导映像 |
− | ** dhcp - | + | ** dhcp - 调用DHCP客户端以获得IP /启动参数 |
− | ** loadb - | + | ** loadb - 通过串行线加载二进制文件(kermit模式) |
− | ** loads - | + | ** loads - 通过串行线加载S-Record文件 |
− | ** rarpboot- | + | ** rarpboot- 使用RARP/TFTP协议通过网络引导映像 |
− | ** tftpboot- | + | ** tftpboot- 使用TFTP协议通过网络引导映像 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupEnvironment Environment Variables Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupEnvironment Environment Variables Commands] | ||
− | ** printenv- | + | ** printenv- 打印环境变量 |
− | ** saveenv - | + | ** saveenv - 将环境变量保存到永久存储 |
− | ** setenv - | + | ** setenv - 设置环境变量 |
− | ** run - | + | ** run - 在环境变量中运行命令 |
− | ** bootd - | + | ** bootd - 启动默认设置,即运行‘bootcmd’ |
* [http://www.denx.de/wiki/view/DULG/UBootCmdFDT Flattened Device Tree support] | * [http://www.denx.de/wiki/view/DULG/UBootCmdFDT Flattened Device Tree support] | ||
− | ** fdt addr - | + | ** fdt addr - 选择要处理的FDT |
− | ** fdt list - | + | ** fdt list - 打印等级一级 |
− | ** fdt print - | + | ** fdt print - 递归打印 |
− | ** fdt mknode - | + | ** fdt mknode - 创建新节点 |
− | ** fdt set - | + | ** fdt set - 设置节点属性 |
− | ** fdt rm - | + | ** fdt rm - 删除节点或属性 |
− | ** fdt move - | + | ** fdt move - 将FDT blob移动到新地址 |
− | ** fdt chosen - | + | ** fdt chosen - 固定动态信息 |
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupSpecial Special Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupSpecial Special Commands] | ||
− | ** i2c - | + | ** i2c - I2C子系统 |
* [http://www.denx.de/wiki/view/DULG/UBootStorageDevices Storage devices] | * [http://www.denx.de/wiki/view/DULG/UBootStorageDevices Storage devices] | ||
* [http://www.denx.de/wiki/view/DULG/UBootCmdGroupMisc Miscellaneous Commands] | * [http://www.denx.de/wiki/view/DULG/UBootCmdGroupMisc Miscellaneous Commands] | ||
− | ** echo - | + | ** echo - 将参数返回到控制台 |
− | ** reset - | + | ** reset - 执行CPU重置 |
− | ** sleep - | + | ** sleep - 将执行延迟预定义的时间 |
− | ** version - | + | ** version - 打印监视器版本 |
− | + | 要添加新命令,请参阅{{CodeSource | U-Boot | doc/README.commands }}. | |
− | |||
=== U-Boot environment variables === | === U-Boot environment variables === | ||
− | + | U-Boot行为是通过环境变量配置的。 | |
− | + | 环境变量请参阅[http://www.denx.de/wiki/view/DULG/UBootEnvVariables Manual] 和{{CodeSource | U-Boot | README | README}} 。 | |
− | + | 首次启动时,U-Boot使用嵌入在U-Boot二进制文件中的默认环境。 您可以通过更改配置文件中CONFIG_EXTRA_ENV_SETTINGS的内容 (例如 ./include/configs/stm32mp1.h) (请参阅 {{CodeSource | U-Boot | README | README}} / - 默认环境). | |
− | + | 可以修改此环境并将其保存在引导设备中。 如果存在,它将在U-Boot初始化期间加载: | |
− | * | + | * 对于 ''e''•MMC/SD card boot (CONFIG_ENV_IS_IN_EXT4),位于文件 CONFIG_ENV_EXT4_FILE="uboot.env" 中的可引导ext4分区 "bootfs" 中。 |
− | * | + | * 对于NAND引导 (CONFIG_ENV_IS_IN_UBI), 在两个UBI卷 "config" (CONFIG_ENV_UBI_VOLUME) 和 "config_r" (CONFIG_ENV_UBI_VOLUME_REDUND)中。 |
− | * | + | * 用于NOR引导 (CONFIG_ENV_IS_IN_SPI_FLASH), 位于u-boot_env mtd分区中 (在偏移量 CONFIG_ENV_OFFSET 处). |
==== env command ==== | ==== env command ==== | ||
− | + | <code>env</code> 命令允许在U-Boot控制台中显示,修改和保存环境。 | |
{{Board$}} help env | {{Board$}} help env | ||
第258行: | 第257行: | ||
env set [-f] name [arg ...] | env set [-f] name [arg ...] | ||
− | + | 示例:按以下步骤恢复默认环境并保存它。这在U-Boot升级后很有用: | |
{{Board$}} env default -a | {{Board$}} env default -a | ||
第264行: | 第263行: | ||
==== bootcmd ==== | ==== bootcmd ==== | ||
− | + | “bootcmd”变量是自动引导命令。它定义U-Boot启动时执行的命令 (CONFIG_BOOTCOMMAND). | |
− | + | 对于stm32mp,请使用 CONFIG_BOOTCOMMAND="run bootcmd_stm32mp": | |
{{Board$}} env print bootcmd | {{Board$}} env print bootcmd | ||
bootcmd=run bootcmd_stm32mp | bootcmd=run bootcmd_stm32mp | ||
− | "bootcmd_stm32mp" | + | "bootcmd_stm32mp" 是一个脚本,它基于[[#Generic Distro configuration|generic distro scripts]]为每个引导设备选择要执行的命令,(请参阅 ./include/configs/stm32mp1.h): |
− | * | + | * 对于 serial/usb: 执行 <code>stm32prog</code> 命令。 |
− | * | + | * 对于 mmc boot (''e''•MMC, SD card), 只能在同一设备上启动 (bootcmd_mmc...). |
− | * | + | * 对于 nand boot, 请使用nand的ubifs分区(bootcmd_ubi0)引导。 |
− | * | + | * 对于 nor boot, 使用默认顺序 ''e''•MMC (SDMMC 1)/ NAND / SD card (SDMMC 0) / SDMMC2 (默认的 bootcmd: distro_bootcmd). |
{{Board$}} env print bootcmd_stm32mp | {{Board$}} env print bootcmd_stm32mp | ||
− | + | 然后,您可以更改此配置: | |
− | * | + | * 永久保存在您的电路板文件中 (通过 CONFIG_EXTRA_ENV_SETTINGS 或更改 CONFIG_BOOTCOMMAND 值的默认环境) 或 |
− | * | + | * 暂时保存在存储环境中: |
{{Board$}} env set bootcmd run bootcmd_mmc0 | {{Board$}} env set bootcmd run bootcmd_mmc0 | ||
{{Board$}} env save | {{Board$}} env save | ||
− | + | 注意:要将环境重置为其默认值: | |
{{Board$}} env default bootcmd | {{Board$}} env default bootcmd | ||
第293行: | 第292行: | ||
=== Generic Distro configuration === | === Generic Distro configuration === | ||
− | + | 有关详细信息,请参阅{{CodeSource | U-Boot | doc/README.distro | doc/README.distro}}。 | |
− | + | 默认情况下,此功能在ST板上激活(CONFIG_DISTRO_DEFAULTS): | |
− | * | + | * 每个可引导设备都有一个引导命令(bootmcd_xxx)。 |
− | * U- | + | * U-Boot独立于所使用的Linux发行版。 |
− | * | + | * bootcmd是在{{CodeSource | U-Boot | ./include/config_distro_bootcmd.h }}中定义的。 |
− | + | 启用DISTRO时,默认情况下执行的命令为{{CodeSource | U-Boot | include/config_distro_bootcmd.h}}: | |
bootcmd=run distro_bootcmd | bootcmd=run distro_bootcmd | ||
− | + | 此脚本尝试在“boot_targets”变量中找到任意设备,并执行关联的 bootcmd. | |
− | + | mmc0、mmc1、mmc2、pxe和ubifs设备示例: | |
bootcmd_mmc0=setenv devnum 0; run mmc_boot | bootcmd_mmc0=setenv devnum 0; run mmc_boot | ||
bootcmd_mmc1=setenv devnum 1; run mmc_boot | bootcmd_mmc1=setenv devnum 1; run mmc_boot | ||
第312行: | 第311行: | ||
bootcmd_ubifs0=setenv devnum 0; run ubifs_boot | bootcmd_ubifs0=setenv devnum 0; run ubifs_boot | ||
− | U-Boot | + | U-Boot 搜索每个可引导设备的'''extlinux.conf''' 配置文件。这个文件定义了要使用的内核配置: |
* bootargs | * bootargs | ||
* kernel + device tree + ramdisk files (optional) | * kernel + device tree + ramdisk files (optional) | ||
第319行: | 第318行: | ||
=== U-Boot scripting capabilities === | === U-Boot scripting capabilities === | ||
− | "Script files" | + | "Script files" 是由U-Boot命令解释器执行的命令序列。此功能对于将U-Boot配置为使用真实shell(Hush)作为命令解释程序特别有用。 |
− | + | 参见 [http://www.denx.de/wiki/view/DULG/UBootScripts| U-Boot 脚本手册] 为例。 | |
== U-Boot build == | == U-Boot build == | ||
=== Prerequisites === | === Prerequisites === | ||
− | * | + | * 装有Linux和工具的PC: |
− | ** | + | ** 参阅 [[PC_prerequisites]] |
** [[#ARM cross compiler]] | ** [[#ARM cross compiler]] | ||
− | * U- | + | * U-Boot源代码 |
− | ** | + | ** 最新的STMicroelectronics U-Boot版本 |
− | *** | + | *** 开发人员软件包中的tar.xz文件 (例如 [[STM32MP1_Developer_Package#Installing_the_U-Boot|STM32MP1]]) |
− | *** | + | *** 从 GITHUB<ref>https://github.com/STMicroelectronics/u-boot</ref>, 使用 <code>git</code> 命令 |
{{PC$}} git clone https://github.com/STMicroelectronics/u-boot | {{PC$}} git clone https://github.com/STMicroelectronics/u-boot | ||
− | :* | + | :* 从官方GIT存储库中的Mainline U-Boot <ref> https://gitlab.denx.de/u-boot/u-boot.git或https://github.com/u-boot/u-boot</ 参考> |
{{PC$}} git clone https://gitlab.denx.de/u-boot/u-boot.git | {{PC$}} git clone https://gitlab.denx.de/u-boot/u-boot.git | ||
==== ARM cross compiler ==== | ==== ARM cross compiler ==== | ||
− | + | 必须在您的主机(X86_64,i686等)的主机上安装交叉编译器<ref> https://en.wikipedia.org/wiki/Cross_compiler </ ref>,以用于ARM定位的设备体系结构。 另外,必须在您的shell中配置$ PATH和$ CROSS_COMPILE环境变量。 | |
− | + | 您可以将gcc用于ARM,可在以下位置使用: | |
− | * | + | * SDK工具链 (请参阅 [[Cross-compile with OpenSTLinux SDK]])<br/>PATH和CROSS_COMPILE会自动更新。 |
− | * | + | * 现有软件包<br/>例如, 在 Ubuntu/Debian 上安装 gcc-arm-linux-gnueabihf : ({{PC$}} sudo apt-get. |
− | * | + | * 现有的工具链: |
− | ** | + | ** ARM提供的最新GCC工具链 (https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads/) |
− | ** | + | ** linaro提供的gcc v7工具链: (https://www.linaro.org/downloads/) |
− | + | 例如,要使用arm中的 ''gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz'' , 请提取$ HOME中的工具链并使用以下命令更新您的环境: | |
{{PC$}} export PATH=$HOME/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin:$PATH | {{PC$}} export PATH=$HOME/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin:$PATH | ||
{{PC$}} export CROSS_COMPILE=arm-none-linux-gnueabihf- | {{PC$}} export CROSS_COMPILE=arm-none-linux-gnueabihf- | ||
− | + | 例如, 要使用来自https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/ 中的<br/> '''gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz'''<br/> | |
− | + | 要在$ HOME中解压缩工具链,并使用以下命令更新您的环境: | |
{{PC$}} export PATH=$HOME/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin:$PATH | {{PC$}} export PATH=$HOME/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin:$PATH | ||
{{PC$}} export CROSS_COMPILE=arm-linux-gnueabi- | {{PC$}} export CROSS_COMPILE=arm-linux-gnueabi- | ||
=== Compilation === | === Compilation === | ||
− | + | 在U-Boot源目录中,选择用于配置的<target>和<device tree>,然后执行<code> make all </code>命令: | |
{{PC$}} make <target>_defconfig | {{PC$}} make <target>_defconfig | ||
{{PC$}} make DEVICE_TREE=<device-tree> all | {{PC$}} make DEVICE_TREE=<device-tree> all | ||
− | + | 还可以选择使用 '''KBUILD_OUTPUT''' 更改输出目录以编译多个目标,或者不在源目录中编译。例如: | |
{{PC$}} export KBUILD_OUTPUT=../build/basic | {{PC$}} export KBUILD_OUTPUT=../build/basic | ||
− | '''DEVICE_TREE''' | + | 当仅支持一块板时,'''DEVICE_TREE''' 也可以导出到您的环境。 例如: |
{{PC$}} export DEVICE_TREE=stm32mp157c-ev1 | {{PC$}} export DEVICE_TREE=stm32mp157c-ev1 | ||
− | + | [[STM32MP15 U-Boot]]中的示例: | |
− | + | {{MicroprocessorDevice | device=15}}支持三种配置: | |
− | * {{Highlight|stm32mp15_trusted_defconfig}}: [[Boot_chains_overview#STM32MP boot chains|trusted boot chain]], U- | + | * {{Highlight|stm32mp15_trusted_defconfig}}: [[Boot_chains_overview#STM32MP boot chains|trusted boot chain]], U-Boot(无SPL)是不安全的,并且使用TF-A的安全监视器 |
− | * {{Highlight|stm32mp15_optee_defconfig}}: [[Boot_chains_overview#STM32MP boot chains|trusted boot chain]], | + | * {{Highlight|stm32mp15_optee_defconfig}}: [[Boot_chains_overview#STM32MP boot chains|trusted boot chain]], U引导(不带SPL)是不安全的,并且使用来自SecureOS的安全监视器 = [[OP-TEE overview|OP-TEE]] |
− | * stm32mp15_basic_defconfig: [[Boot_chains_overview#STM32MP boot chains|basic boot chain]], | + | * stm32mp15_basic_defconfig: [[Boot_chains_overview#STM32MP boot chains|basic boot chain]], 以SPL作为FSBL,U-BOOT是安全的,并通过PSCI安装监视器 |
− | + | 单板多样性仅通过设备树进行管理. | |
{{PC$}} export KBUILD_OUTPUT=../build/trusted | {{PC$}} export KBUILD_OUTPUT=../build/trusted | ||
第390行: | 第389行: | ||
{{PC$}} make DEVICE_TREE=stm32mp157c-<board> all | {{PC$}} make DEVICE_TREE=stm32mp157c-<board> all | ||
− | + | 使用帮助列出其他目标: | |
{{PC$}} make help | {{PC$}} make help | ||
=== Output files === | === Output files === | ||
− | + | 生成的U-Boot文件位于您的构建目录 (U-Boot or KBUILD_OUTPUT)中。 | |
− | + | stm32mp设备使用两种二进制格式: | |
− | * | + | * STM32图像格式(*.stm32), 由mkimage U-Boot工具和 [[Signing_tool]]管理。 ROM代码和TF-A请求它(详情请参阅 [[STM32 header for binary files]] )。 |
− | * uImage (*.img) | + | * uImage (*.img) 格式,包含U-Boot头的文件,由SPL和U-Boot管理(用于内核加载)。 |
− | + | U-Boot生成的文件如下: | |
− | * | + | * 对于 {{Highlight|'''Trusted boot chain'''}} (TF-A用作FSBL,带有或不带有OP-TEE) |
− | ** {{Highlight|'''u-boot.stm32'''}} : | + | ** {{Highlight|'''u-boot.stm32'''}} : 带有STM32映像头的U-Boot二进制文件,由TF-A加载 |
− | * | + | * 对于 '''Basic boot chain''' (SPL用作FSBL) |
− | ** '''u-boot-spl.stm32''' : | + | ** '''u-boot-spl.stm32''' : 带有STM32映像头的SPL二进制文件,由ROM代码加载 |
− | ** '''u-boot.img''' : | + | ** '''u-boot.img''' : 具有uImage标头的U-Boot二进制文件,由SPL加载 |
− | + | 用于使用gdb进行调试的文件包括 | |
− | * u-boot : | + | * u-boot : U-Boot的elf文件 |
− | * spl/u-boot-spl : | + | * spl/u-boot-spl : SPL的elf文件 |
== References == | == References == |
2020年11月3日 (二) 11:58的最新版本
目录
Das U-Boot
Das U-Boot (“通用引导加载程序”或U-Boot) 是一种开源引导加载程序,可用于ST板上以初始化平台并加载Linux® 内核。
- 官方网站: https://www.denx.de/wiki/U-Boot
- 官方手册: project documentation 和 https://www.denx.de/wiki/DULG/Manual
- 官方的源代码 可在 git 存储库下找到[1]
PC $> git clone https://gitlab.denx.de/u-boot/u-boot.git
在开始使用U-Boot之前,请阅读README | |}} README file 。它涵盖以下主题:
- 源文件树结构
- 配置定义说明
- 关于构建U-Boot的说明
- Hush外壳的简要说明
- 常用环境变量列表
U-Boot overview
同一个U-Boot源可以生成SPL和U-Boot中使用的两个固件 STM32 MPU boot chain:
- 受信任的引导链:TF-A作为FSBL,U-Boot作为SSBL
- 基本启动链:SPL作为FSBL,U-Boot作为SSBL
基本启动链不能用于产品开发 (请参见Boot chains overview 以获取详细信息). |
它仅作为最简单的SSBL的示例提供,并支持上游U-Boot开发。但是,当SPL与U-Boot中提供的用于基本引导链的最小安全监视器结合使用时,已经发现了几个已知的限制。它们适用于:
- 功率
- 安全访问寄存器
- 有限的功能(STM32CubeProgrammer / boot from NAND Flash memory).
没有针对这些限制的修复计划。
SPL: FSBL for basic boot
U-Boot SPL 或 SPL 是 the basic boot chain的第一阶段引导加载程序(FSBL)。
它是从U-Boot源生成的小二进制文件(引导实用程序),并存储在内部有限大小的嵌入式RAM中。SPL的主要功能如下:
- 它由ROM代码加载。
- 它执行初始的CPU和板配置(时钟和DDR内存)。
- 它将SSBL(U-Boot)加载到DDR内存中。
U-Boot: SSBL
U-Boot 是STM32 MPU平台的默认第二阶段引导程序(SSBL)。它同时用于 trusted and basic引导链
SSBL的主要功能如下:
- 它是可配置和消耗的。
- 它具有一个简单的命令行界面(CLI),允许用户通过串行端口控制台进行交互。
- 它提供脚本功能
- 它将内核加载到RAM中并控制内核
- 它管理多个内部和外部设备,例如NAND和NOR闪存,以太网和USB。
- 它支持以下功能和命令:
- 文件系统:FAT, UBI/UBIFS, JFFS
- IP堆栈:FTP
- 显示: LCD, HDMI, BMP for splashcreen
- USB: host (mass storage) or device (DFU stack)
SPL phases
SPL 在SYSRAM中执行以下主要阶段:
- board_init_f(): 驱动程序初始化,包括DDR初始化(最小堆栈和堆:CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN)
- DDR内存中堆的配置(CONFIG_SPL_SYS_MALLOC_F_LEN)
- board_init_r(): 初始化在SPL设备树中激活的其他驱动程序
- 加载并执行U-Boot(或Falcon模式下的内核[1]: doc/README.falcon | |}} README.falcon ).
U-Boot phases
U-Boot 在DDR内存中执行以下主要阶段:
- Pre-relocation 初始化 (common/board_f.c): 在CONFIG_SYS_TEXT_BASE加载地址上运行的最小初始化(例如CPU,时钟,重置,DDR和控制台)
- Relocation: 将代码复制到DDR内存的末尾。
- Post-relocation initialization:(common/board_r.c): 初始化所有驱动程序。
-
Command execution 通过自动引导(CONFIG_AUTOBOOT)或控制台shell
- 启动命令的执行(默认情况下 bootcmd=CONFIG_BOOTCOMMAND):
例如,将命令bootm
执行到:- 加载并检查映像(例如内核,设备树和ramdisk)
- 修复内核设备树
- 安装安全监视器(可选)或
- 将控制权传递给Linux内核(或另一个目标应用程序)
- 启动命令的执行(默认情况下 bootcmd=CONFIG_BOOTCOMMAND):
U-Boot configuration
U-Boot二进制配置基于
-
Kbuild infrastructure (与Linux Kernel, 您可以在U-Boot中使用
make menuconfig
)
配置基于以下各项:- 在 Kconfig 文件中定义的选项(CONFIG _ compilation 标志)
- 所选配置文件:configs/ | |}} configs/stm32mp*_defconfig
-
other compilation flags 定义于include/configs/ | |}} include/configs/stm32mp*.h (这些标志将逐步迁移到Kconfig)
文件名通过CONFIG_SYS_CONFIG_NAME配置。
对于 {{#vardefine:info|}}{{#vardefine:dev|MP15x lines}}{{#vardefine:info| }}STM32{{#var:dev}}{{#var:info}}, 使用了include/configs/stm32mp1.h | |}} include/configs/stm32mp1.h 文件。
- DeviceTree: U-Boot和SPL二进制文件包括在运行时解析的设备树blob
所有的配置标志(前缀为 CONFIG_)都在源代码中描述, 或者在 README | |}} README 文件中,或者在doc/ | |}} documentation directory 目录中。
例如,CONFIG_SPL激活SPL编译
因此,为了选择一个预定义的配置,需要为主板编译 U-Boot,select the <target> 和 the device tree 。
有关示例,请参阅#U-Boot_build。
Kbuild
与内核一样,U-Boot构建系统也基于 configuration symbols (在Kconfig文件中定义). 选定的值存储在build目录的.config文件中,具有相同的Makefile目标。
按照以下步骤进行:
- 选择预定义的配置(configs/ | |}} configs directory 中的defconfig文件) 并生成第一个 .config:
PC $> make <config>_defconfig.
- 使用以下五个
make
命令之一更改U-Boot编译配置(修改.config):
PC $> make menuconfig --> menu based program PC $> make config --> line-oriented configuration PC $> make xconfig --> QT program[2] PC $> make gconfig --> GTK program PC $> make nconfig --> ncurse menu based program
然后,您可以使用更新的.config编译U-Boot。
Warning: 修改是在构建目录的本地执行的。在 make distclean 之后它将丢失
.
保存您的配置以将其用作defconfig文件:
PC $> make savedefconfig
此目标将当前配置保存为build目录中的defconfig文件。 然后可以将其与预定义的配置进行比较(configs/stm32mp*defconfig).
其他makefile目标如下:
PC $> make help .... Configuration targets: config - Update current config utilising a line-oriented program nconfig - Update current config utilising a ncurses menu based program menuconfig - Update current config utilising a menu based program xconfig - Update current config utilising a Qt based front-end gconfig - Update current config utilising a GTK+ based front-end oldconfig - Update current config utilising a provided .config as base localmodconfig - Update current config disabling modules not loaded localyesconfig - Update current config converting local mods to core defconfig - New config with default from ARCH supplied defconfig savedefconfig - Save current config as ./defconfig (minimal config) allnoconfig - New config where all options are answered with no allyesconfig - New config where all options are accepted with yes allmodconfig - New config selecting modules when possible alldefconfig - New config with all symbols set to default randconfig - New config with random answer to all options listnewconfig - List new options olddefconfig - Same as oldconfig but sets new symbols to their default value without prompting
Device tree
请参阅doc/README.fdt-control | |}} doc/README.fdt-control 以获取详细信息。
板设备树具有与内核相同的绑定。它集成在SPL和U-Boot二进制文件中:
- 默认情况下,它被附加在代码的末尾(CONFIG_OF_SEPARATE).
- 它嵌入在U-Boot二进制文件(CONFIG_OF_EMBED)中。这对调试很有用,因为它可以轻松加载.elf文件。
defconfig文件中有一个默认的设备树(通过设置CONFIG_DEFAULT_DEVICE_TREE)。
您可以使用DEVICE_TREE make标志选择另一个受支持的设备树。 对于stm32mp板,相应的文件为: arch/arm/dts/ | |}} arch/arm/dts/stm32mp*.dts .
PC $> make DEVICE_TREE=<dts-file-name>
或提供预编译的设备树blob(using EXT_DTB option):
PC $> make EXT_DTB=boot/<dts-file-name>.dtb
SPL设备树也从该设备树生成。 但是为了减小其大小,U-Boot生成文件使用fdtgrep工具来解析完整的U-Boot DTB并识别SPL所需的所有驱动程序。
为此,U-Boot使用特定的设备树标志来定义相关的驱动程序是否在U-Boot重定位之前初始化和/或相关的节点是否存在于SPL中:
- u-boot,dm-pre-reloc => 存在于SPL中,在U-Boot中重新定位之前初始化
- u-boot,dm-pre-proper => 在U-Boot中重新定位之前初始化
- u-boot,dm-spl => 存在于SPL中
在U-Boot使用的设备树中,这些标志需要添加到SPL或U-Boot中使用的每个节点中,然后再进行重定位以及每个使用的句柄(时钟,复位,引脚控制)。
U-Boot command line interface (CLI)
请参阅 U-Boot Command Line Interface.
如果CONFIG_AUTOBOOT已激活,则在显示以下行并执行bootcmd(CONFIG_BOOTCOMMAND)后,您有CONFIG_BOOTDELAY秒(默认情况下为2秒)通过按任意键进入控制台:
Hit any key to stop autoboot: 2
Commands
这些命令在cmd/ | |}} cmd/*.c . 通过相应的 CONFIG_CMD_* 配置标志激活它们。
使用U-Boot shell中的help
命令列出设备上可用的命令:
Board $> help
以下是从中提取的所有命令的列表 U-Boot Manual (不详尽):
-
Information Commands
- bdinfo - 打印板信息结构
- coninfo - 打印控制台设备和信息
- flinfo - 打印闪存信息
- iminfo - 打印应用程序映像的标题信息
- help - 打印在线帮助
-
Memory Commands
- base - 打印或设置地址偏移量
- crc32 - 校验和计算
- cmp - 内存比较
- cp - 内存拷贝
- md - 内存显示
- mm - 内存修改(自动递增)
- mtest - 简单的RAM测试
- mw - 内存写入(填充)
- nm - 内存修改(常量地址)
- loop - 地址范围内无限循环
-
Flash Memory Commands
- cp - 内存复制
- flinfo - 打印闪存信息
- erase - 清除闪存
- protect - 启用或禁用闪存写入保护
- mtdparts - 定义与Linux兼容的MTD分区方案
-
Execution Control Commands
- source - 从内存运行脚本
- bootm - 从内存启动应用程序映像
- go - 在地址‘addr’处启动应用程序
-
Download Commands
- bootp - 使用BOOTP / TFTP协议通过网络引导映像
- dhcp - 调用DHCP客户端以获得IP /启动参数
- loadb - 通过串行线加载二进制文件(kermit模式)
- loads - 通过串行线加载S-Record文件
- rarpboot- 使用RARP/TFTP协议通过网络引导映像
- tftpboot- 使用TFTP协议通过网络引导映像
-
Environment Variables Commands
- printenv- 打印环境变量
- saveenv - 将环境变量保存到永久存储
- setenv - 设置环境变量
- run - 在环境变量中运行命令
- bootd - 启动默认设置,即运行‘bootcmd’
-
Flattened Device Tree support
- fdt addr - 选择要处理的FDT
- fdt list - 打印等级一级
- fdt print - 递归打印
- fdt mknode - 创建新节点
- fdt set - 设置节点属性
- fdt rm - 删除节点或属性
- fdt move - 将FDT blob移动到新地址
- fdt chosen - 固定动态信息
-
Special Commands
- i2c - I2C子系统
- Storage devices
-
Miscellaneous Commands
- echo - 将参数返回到控制台
- reset - 执行CPU重置
- sleep - 将执行延迟预定义的时间
- version - 打印监视器版本
要添加新命令,请参阅doc/README.commands | |}} doc/README.commands .
U-Boot environment variables
U-Boot行为是通过环境变量配置的。
环境变量请参阅Manual 和README | |}} README 。
首次启动时,U-Boot使用嵌入在U-Boot二进制文件中的默认环境。 您可以通过更改配置文件中CONFIG_EXTRA_ENV_SETTINGS的内容 (例如 ./include/configs/stm32mp1.h) (请参阅 README | |}} README / - 默认环境).
可以修改此环境并将其保存在引导设备中。 如果存在,它将在U-Boot初始化期间加载:
- 对于 e•MMC/SD card boot (CONFIG_ENV_IS_IN_EXT4),位于文件 CONFIG_ENV_EXT4_FILE="uboot.env" 中的可引导ext4分区 "bootfs" 中。
- 对于NAND引导 (CONFIG_ENV_IS_IN_UBI), 在两个UBI卷 "config" (CONFIG_ENV_UBI_VOLUME) 和 "config_r" (CONFIG_ENV_UBI_VOLUME_REDUND)中。
- 用于NOR引导 (CONFIG_ENV_IS_IN_SPI_FLASH), 位于u-boot_env mtd分区中 (在偏移量 CONFIG_ENV_OFFSET 处).
env command
env
命令允许在U-Boot控制台中显示,修改和保存环境。
Board $> help env env - environment handling commands Usage: env default [-f] -a - [forcibly] reset default environment env default [-f] var [...] - [forcibly] reset variable(s) to their default values env delete [-f] var [...] - [forcibly] delete variable(s) env edit name - edit environment variable env exists name - tests for existence of variable env print [-a | name ...] - print environment env print -e [name ...] - print UEFI environment env run var [...] - run commands in an environment variable env save - save environment env set -e name [arg ...] - set UEFI variable; unset if 'arg' not specified env set [-f] name [arg ...]
示例:按以下步骤恢复默认环境并保存它。这在U-Boot升级后很有用:
Board $> env default -a Board $> env save
bootcmd
“bootcmd”变量是自动引导命令。它定义U-Boot启动时执行的命令 (CONFIG_BOOTCOMMAND).
对于stm32mp,请使用 CONFIG_BOOTCOMMAND="run bootcmd_stm32mp":
Board $> env print bootcmd bootcmd=run bootcmd_stm32mp
"bootcmd_stm32mp" 是一个脚本,它基于generic distro scripts为每个引导设备选择要执行的命令,(请参阅 ./include/configs/stm32mp1.h):
- 对于 serial/usb: 执行
stm32prog
命令。 - 对于 mmc boot (e•MMC, SD card), 只能在同一设备上启动 (bootcmd_mmc...).
- 对于 nand boot, 请使用nand的ubifs分区(bootcmd_ubi0)引导。
- 对于 nor boot, 使用默认顺序 e•MMC (SDMMC 1)/ NAND / SD card (SDMMC 0) / SDMMC2 (默认的 bootcmd: distro_bootcmd).
Board $> env print bootcmd_stm32mp
然后,您可以更改此配置:
- 永久保存在您的电路板文件中 (通过 CONFIG_EXTRA_ENV_SETTINGS 或更改 CONFIG_BOOTCOMMAND 值的默认环境) 或
- 暂时保存在存储环境中:
Board $> env set bootcmd run bootcmd_mmc0 Board $> env save
注意:要将环境重置为其默认值:
Board $> env default bootcmd Board $> env save
Generic Distro configuration
有关详细信息,请参阅doc/README.distro | |}} doc/README.distro 。
默认情况下,此功能在ST板上激活(CONFIG_DISTRO_DEFAULTS):
- 每个可引导设备都有一个引导命令(bootmcd_xxx)。
- U-Boot独立于所使用的Linux发行版。
- bootcmd是在./include/config_distro_bootcmd.h | |}} ./include/config_distro_bootcmd.h 中定义的。
启用DISTRO时,默认情况下执行的命令为include/config_distro_bootcmd.h| |}} include/config_distro_bootcmd.h :
bootcmd=run distro_bootcmd
此脚本尝试在“boot_targets”变量中找到任意设备,并执行关联的 bootcmd.
mmc0、mmc1、mmc2、pxe和ubifs设备示例:
bootcmd_mmc0=setenv devnum 0; run mmc_boot bootcmd_mmc1=setenv devnum 1; run mmc_boot bootcmd_mmc2=setenv devnum 2; run mmc_boot bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi bootcmd_ubifs0=setenv devnum 0; run ubifs_boot
U-Boot 搜索每个可引导设备的extlinux.conf 配置文件。这个文件定义了要使用的内核配置:
- bootargs
- kernel + device tree + ramdisk files (optional)
- FIT image
U-Boot scripting capabilities
"Script files" 是由U-Boot命令解释器执行的命令序列。此功能对于将U-Boot配置为使用真实shell(Hush)作为命令解释程序特别有用。
参见 U-Boot 脚本手册 为例。
U-Boot build
Prerequisites
- 装有Linux和工具的PC:
- U-Boot源代码
PC $> git clone https://github.com/STMicroelectronics/u-boot
- 从官方GIT存储库中的Mainline U-Boot <ref> https://gitlab.denx.de/u-boot/u-boot.git或https://github.com/u-boot/u-boot</ 参考>
PC $> git clone https://gitlab.denx.de/u-boot/u-boot.git
ARM cross compiler
必须在您的主机(X86_64,i686等)的主机上安装交叉编译器<ref> https://en.wikipedia.org/wiki/Cross_compiler </ ref>,以用于ARM定位的设备体系结构。 另外,必须在您的shell中配置$ PATH和$ CROSS_COMPILE环境变量。
您可以将gcc用于ARM,可在以下位置使用:
- SDK工具链 (请参阅 Cross-compile with OpenSTLinux SDK)
PATH和CROSS_COMPILE会自动更新。 - 现有软件包
例如, 在 Ubuntu/Debian 上安装 gcc-arm-linux-gnueabihf : (PC $> sudo apt-get. - 现有的工具链:
- ARM提供的最新GCC工具链 (https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads/)
- linaro提供的gcc v7工具链: (https://www.linaro.org/downloads/)
例如,要使用arm中的 gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz , 请提取$ HOME中的工具链并使用以下命令更新您的环境:
PC $> export PATH=$HOME/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin:$PATH PC $> export CROSS_COMPILE=arm-none-linux-gnueabihf-
例如, 要使用来自https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/ 中的
gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
要在$ HOME中解压缩工具链,并使用以下命令更新您的环境:
PC $> export PATH=$HOME/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin:$PATH PC $> export CROSS_COMPILE=arm-linux-gnueabi-
Compilation
在U-Boot源目录中,选择用于配置的<target>和<device tree>,然后执行 make all
命令:
PC $> make <target>_defconfig PC $> make DEVICE_TREE=<device-tree> all
还可以选择使用 KBUILD_OUTPUT 更改输出目录以编译多个目标,或者不在源目录中编译。例如:
PC $> export KBUILD_OUTPUT=../build/basic
当仅支持一块板时,DEVICE_TREE 也可以导出到您的环境。 例如:
PC $> export DEVICE_TREE=stm32mp157c-ev1
STM32MP15 U-Boot中的示例:
{{#vardefine:info|}}{{#vardefine:dev|MP15x lines}}{{#vardefine:info| }}STM32{{#var:dev}}{{#var:info}}支持三种配置:
- stm32mp15_trusted_defconfig: trusted boot chain, U-Boot(无SPL)是不安全的,并且使用TF-A的安全监视器
- stm32mp15_optee_defconfig: trusted boot chain, U引导(不带SPL)是不安全的,并且使用来自SecureOS的安全监视器 = OP-TEE
- stm32mp15_basic_defconfig: basic boot chain, 以SPL作为FSBL,U-BOOT是安全的,并通过PSCI安装监视器
单板多样性仅通过设备树进行管理.
PC $> export KBUILD_OUTPUT=../build/trusted PC $> make stm32mp15_trusted_defconfig PC $> make DEVICE_TREE=stm32mp157c-<board> all
PC $> export KBUILD_OUTPUT=../build/optee PC $> export DEVICE_TREE=stm32mp157c-<board> PC $> make stm32mp15_optee_defconfig PC $> make all
PC $> make stm32mp15_basic_defconfig PC $> make DEVICE_TREE=stm32mp157c-<board> all
使用帮助列出其他目标:
PC $> make help
Output files
生成的U-Boot文件位于您的构建目录 (U-Boot or KBUILD_OUTPUT)中。
stm32mp设备使用两种二进制格式:
- STM32图像格式(*.stm32), 由mkimage U-Boot工具和 Signing_tool管理。 ROM代码和TF-A请求它(详情请参阅 STM32 header for binary files )。
- uImage (*.img) 格式,包含U-Boot头的文件,由SPL和U-Boot管理(用于内核加载)。
U-Boot生成的文件如下:
- 对于 Trusted boot chain (TF-A用作FSBL,带有或不带有OP-TEE)
- u-boot.stm32 : 带有STM32映像头的U-Boot二进制文件,由TF-A加载
- 对于 Basic boot chain (SPL用作FSBL)
- u-boot-spl.stm32 : 带有STM32映像头的SPL二进制文件,由ROM代码加载
- u-boot.img : 具有uImage标头的U-Boot二进制文件,由SPL加载
用于使用gdb进行调试的文件包括
- u-boot : U-Boot的elf文件
- spl/u-boot-spl : SPL的elf文件
References
<securetransclude src="ProtectedTemplate:PublicationRequestId" params="12893 | 2019-08-01 |"></securetransclude>