文章目录
前言
在uboot的学习中,本人移植跟随着嵌入式大佬们的教学编译构建,一直不知其所以然,看过官方uboot中的README之后,深有感触。所以本文记录翻译的官方README作为回顾
提示:以下是本篇文章正文内容,下面案例可供参考
一、uboot简介
这个目录包含U-Boot的源代码,U-Boot是一个引导加载程序,它用来引导PowerPC、ARM、MIPS和其他几种处理器的嵌入式开发板,可以安装在引导ROM中,用于初始化和测试硬件或下载和运行应用程序代码。
二、状态
一般来说,在开发板Makefile存在配置选项的所有板都经过了一定程度的测试,可以被认为是“工作的”。事实上,它们中的许多都在生产系统中使用。如果出现问题,请查看CHANGELOG文件,以找出谁贡献了特定的配置。此外,在整个U-Boot源代码中还散布着各种维护者文件,以确定负责各种板和子系统的人员或公司。注意:截至2010年8月,在实际的U-Boot源代码树中不再有CHANGELOG文件;但是,它可以从Git日志动态创建。
使用:make CHANGELOG
在哪可以获得帮助
u-boot@lists.denx.de
https://lists.denx.de/pipermail/u-boot
https://marc.info/?l=u-boot
在哪可以获得源码
https://source.denx.de/u-boot/u-boot.git
https://source.denx.de/u-boot/u-boot
https://ftp.denx.de/pub/u-boot/
ftp://ftp.denx.de/pub/u-boot/
三、目录层次结构
/arch Architecture-specific files (特定架构文件)
/arc Files generic to ARC architecture (ARC通用架构文件)
/arm Files generic to ARM architecture (ARM通用架构文件)
/m68k Files generic to m68k architecture (m68k通用架构文件)
/microblaze Files generic to microblaze architecture (microblaze 通用架构文件)
/mips Files generic to MIPS architecture (MIPS通用架构文件)
/nds32 Files generic to NDS32 architecture (NDS32通用架构文件)
/nios2 Files generic to Altera NIOS2 architecture (Altera NIOS2通用架构文件)
/powerpc Files generic to PowerPC architecture (PowerPC通用架构文件)
/riscv Files generic to RISC-V architecture (RISC-V通用 架构文件)
/sandbox Files generic to HW-independent "sandbox" (HW-independent"sandbox"通用文件)
/sh Files generic to SH architecture (SH通用架构文件)
/x86 Files generic to x86 architecture (X86通用架构文件)
/xtensa Files generic to Xtensa architecture (Xtensa通用架构文件)
/api Machine/arch-independent API for external apps (跟硬件解耦的api给应用层)
/board Board-dependent files (跟板子相关的文件)
/boot Support for images and booting (支持镜像和启动)
/cmd U-Boot commands functions (uboot命令和功能)
/common Misc architecture-independent functions (通用函数)
/configs Board default configuration files (板子默认的配置文件)
/disk Code for disk drive partition handling (磁盘驱动器分区处理代码)
/doc Documentation (a mix of ReST and READMEs) (文档(rest和readme的混合))
/drivers Device drivers (设备驱动)
/dts Makefile for building internal U-Boot fdt. (Makefile用于构建内部的uboot FDT)
/env Environment support (环境支持)
/examples Example code for standalone applications, etc. (独立的应用示例代码)
/fs Filesystem code (cramfs, ext2, jffs2, etc.) (文件系统代码)
/include Header Files (头文件)
/lib Library routines generic to all architectures (给所有架构的通用库例程)
/Licenses Various license files (各种许可证文件)
/net Networking code (网络代码)
/post Power On Self Test (开机自检)
/scripts Various build scripts and Makefiles (各种构建脚本和Makefiles)
/test Various unit test files (各种单元测试文件)
/tools Tools to build and sign FIT images, etc. (用于构建和签署FIT镜像等)
四、软件配置
配置通常使用C预处理器定义完成;这背后的基本原理是尽可能避免死代码。
配置变量有两类:
Configuration_OPTIONS_:
它们由用户选择,名称以“CONFIG_”开头。
Configuration_SETTINGS_:
这些取决于硬件等,如果你不知道自己在做什么,就不应该被干预;它们的名称以“CONFIG_SYS_”开头。
以前,所有的配置都是手工完成的,包括手工创建符号链接和编辑配置文件。最近,U-Boot添加了Linux内核使用的Kbuild基础结构,允许您使用***“make menuconfig”***命令来配置构建。
处理器架构和主板类型的选择:
对于所有支持的板,有现成的默认配置可用;只需键入***“make <board_name>_defconfig”***。
示例:对于TQM823L模块类型:
cd u-boot
make TQM823L_defconfig
注意:如果你正在寻找一个板的默认配置文件,你肯定曾经在那里,但现在丢失了,检查文件doc/README。废弃的名单里面显示不再支持的板。
沙箱环境:
U-Boot可以使用“沙箱”在Linux主机上运行。这允许功能开发而不是板或架构特定于在本地平台上进行。
沙盒也被用来做一些U-Boot的测试
了解更多详情在 doc/arch/sandbox.rst。
单板初始化流程:
这是单板的期望启动流程。这应该适用于两者SPL和U-Boot正确(即它们都遵循相同的规则)。
注意:“SPL”代表“二级程序加载器”,本文件稍后将对此进行更详细的解释。
目前,SPL大多使用单独的代码路径,但每个函数的函数名和角色是相同的。某些板或架构可能不符合此要求。至少大多数使用CONFIG_SPL_FRAMEWORK的ARM板都符合这一点。
执行通常从特定于体系结构的(并且可能的CPU-specific)start.S文件开始,例如:
-arch/arm/cpu/armv7/start.S
- arch/powerpc/cpu/mpc83xx/start.S
- arch/mips/cpu/start.S
从那里这三个函数被调用;目的和下面描述了这些函数的限制。
lowlevel_init():
board_init_f():
board_init_r():
lowlevel_init():
目的:必要的init允许执行到达board_init_f()
没有global_data或BSS
没有堆栈(ARMv7可能有,但很快就会删除)
必须不设置SDRAM或使用控制台
必须只执行最低限度的操作,以便继续执行board_init_f()
这几乎是不需要的
从这个函数正常返回
board_init_f():
目的:设置机器准备运行board_init_r():
即SDRAM和串行UART
Global_data可用
堆栈在SRAM中
BSS不可用,因此不能使用全局/静态变量,只能使用堆栈变量和global_data
Non-SPL-specific指出:
调用dram_init()来设置DRAM。如果在SPL中已经这样做了,则什么都做不了
PL-specific指出:您可以根据需要使用自己的版本覆盖整个board_init_f()函数。
在极端情况下可以在这里调用preloader_console_init()
应该设置SDRAM,并且使UART工作所需的任何东西都不需要清除BSS,它将由crto完成。
对于某些架构上的特定场景,可以*提供早期的BSS(通过CONFIG_SPL_EARLY_BSS,通过在进入board_init_f()之前移动BSS的清除),但不鼓励这样做。相反, 强烈建议在架构任何代码更改或添加时,不依赖于board_init_f()期间BSS的可用性,以保持整个代码库的兼容性和一致性,如本自述文件的其他部分所示。
必须从这个函数正常返回(不要直接调用board_init_r())
这里BSS被清除了。对于SPL,如果定义了CONFIG_SPL_STACK_R,那么此时堆栈和global_data将被重新定位到下面CONFIG_SPL_STACK_R_ADDR。对于非spl, U-Boot被重新定位到在内存的顶部运行。
board_init_r():
目的:主执行,通用代码
global_data可用
SDRAM可用
BSS可用,所有静态/全局变量都可以使用执行最终继续main_loop()
Non-SPL-specific指出:
U-Boot被重新定位到内存的顶部,现在从那里运行。
SPL-specific指出:
如果定义了CONFIG_SPL_STACK_R,则堆栈在SDRAM中是可选的
CONFIG_SPL_STACK_R_ADDR点可以在这里调用到SDRAM preloader_console_init()—通常这是通过选择CONFIG_SPL_BOARD_INIT然后提供包含此调用的spl_board_init()函数来完成的
加载U-Boot或(猎鹰模式)Linux
可选的配置
配置视板子和CPU类型而定;所有这些信息保存在一个配置文件中”include/configs/<board_name>.h”。
示例:对于TQM823L模块,所有配置设置都在“include/configs/TQM823L.h”。
许多选项完全按照相应的Linux内核配置选项命名。这样做的目的是为了以后更容易构建配置工具。
ARM平台总线类型(CCI):
CoreLink Cache Coherent Interconnect (CCI)是ARM总线,提供两个多核cpu集群之间的完全缓存一致性,以及设备和I/0主机的I/0一致性
CONFIG_SYS_FSL_HAS_CCI400
定义用于具有缓存相干互连CCN-400的Soc
CONFIG_SYS_FSL_HAS_CCN504
CCN-504为具有高速缓存相干互连CCN-504的Soc定义
需要配置的选项如下:
- CPU Type: Define exactly one, e.g. CONFIG_MPC85XX.
- Board Type: Define exactly one, e.g. CONFIG_MPC8540ADS.
- 剩余配置项详解很多具体请查看soc厂家或者uboot官方的配置详情
总结
uboot学习地址:https://docs.u-boot.org/en/latest/
文章中翻译uboot下载地址https://source.denx.de/u-boot/u-boot/-/tree/v2024.04?ref_type=tags