网站首页 > 技术教程 正文
了解u-boot的方式有很多种,以下从U-boot官方文档README学习。
概括
U-Boot是基于PowerPC、ARM、MIPS 和其他几个处理器的嵌入式板的引导加载程序,可以安装在引导 ROM 中,用于初始化和测试硬件或下载和运行应用代码。U-Boot 的开发与 Linux 息息相关:部分源代码来源于 Linux 源代码树,我们有一些共同的头文件,并专门提供了支持 Linux 镜像的引导。
已经注意使该软件易于配置和扩展。例如,所有监控命令都使用相同的调用接口实现,因此添加新命令非常容易。此外,您可以动态加载和运行它,而不是将很少使用的代码(例如硬件测试实用程序)永久添加到监视器。
目录层次结构
/arch 体系结构特定文件
->/arc ARC 架构通用的文件
->/arm ARM 体系结构通用的文件
->/avr32 文件通用 AVR32 架构
->/blackfin 文件通用到 Analog Devices Blackfin 架构
->/m68k 通用到 m68k 架构的文件
->/microblaze 文件通用 microblaze 架构
->/mips 文件通用 MIPS 架构
->/nds32 文件通用 NDS32 架构
->/nios2 对 Altera NIOS2 体系结构通用的文件
->/openrisc 文件通用 OpenRISC 架构
->/powerpc 通用到 PowerPC 体系结构的文件
->/sandbox 与硬件无关的“沙盒”通用的文件
->/sh 对 SH 架构通用的文件
->/sparc 对 SPARC 体系结构通用的文件
->/x86 对 x86 体系结构通用的文件
/api Machine/arch 独立于外部应用程序的 API
/board 电路板相关文件
/common 杂项架构独立功能
/configs 板默认配置文件
/disk 磁盘驱动器分区处理代码
/doc 文档(不要期望太多)
/drivers 常用设备驱动
/dts 包含用于构建内部 U-Boot fdt 的 Makefile。
/examples 独立应用程序的示例代码等。
/fs 文件系统代码(cramfs、ext2、jffs2 等) /include 头文件
/lib 对所有体系结构通用的库例程
/Licenses 各种许可证文件
/net 网络代码
/post 开机自检
/scripts 各种构建脚本和 Makefile
/test 各种单元测试文件
/tools 用于构建 S-Record 或 U-Boot 映像等的工具。
软件配置
配置通常使用 C 预处理器定义完成;其背后的基本原理是尽可能避免死代码。
有两类配置变量:
- Configuration OPTIONS:
这些可由用户选择,名称以CONFIG_开头。 - Configuration SETTINGS:
这些取决于硬件等,如果您不知道自己在做什么,则不应干预;他们的名字以CONFIG_SYS_开头。
以前,所有配置都是手动完成的,包括手动创建符号链接和编辑配置文件。最近,U-Boot 添加了 Linux 内核使用的 Kbuild 基础架构,允许您使用“make menuconfig”命令来配置您的构建。
处理器架构和板卡类型的选择
对于所有受支持的板,都有现成可用的默认配置;只需键入make <board_name>_defconfig。
示例:对于 TQM823L 模块类型:
- cd u-boot //进入u-boot根目录
- make TQM823L_defconfig
注意:如果您正在寻找您确定曾经存在但现在丢失的板的默认配置文件,请检查文件 doc/README.scrapyard 以获取不再支持的板的列表。
板初始化流程:
这是板的预期启动流程。这应该适用于 SPL 和 U-Boot(即它们都遵循相同的规则)。
注意:“SPL”代表“Secondary Program Loader”,本文件后面将对此进行更详细的说明。
目前,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()
- 没有 global_data 或 BSS
- 没有堆栈(ARMv7 可能有一个,但很快就会被删除)
- 不得设置 SDRAM 或使用控制台
- 必须只做最低限度的工作以允许继续执行board_init_f()
- 这几乎不需要
- 从此函数正常返回
board_init_f()
- 目的:设置机器准备运行 board_init_r(), 即 SDRAM 和串行 UART
- global_data 可用
- 堆栈在 SRAM 中
- BSS 不可用,因此不能使用全局/静态变量,只能使用堆栈变量和 global_data
非 SPL 特定说明:
- 调用 dram_init() 来设置 DRAM。如果已经在 SPL 中完成,这将无能为力
SPL 特定说明:
- 您可以根据需要使用您自己的版本覆盖整个 board_init_f() 函数。
- preloader_console_init() 可以在这里极端调用
- 应该设置 SDRAM,以及使 UART 工作所需的任何东西
- 这些不需要清除 BSS,由 crt0.S 完成
- 必须从此函数正常返回(不要直接调用 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()
非 SPL 特定说明:
- U-Boot 被重新定位到内存的顶部,现在从那里运行。
SPL 特定说明:
- 如果定义了CONFIG_SPL_STACK_R 并且CONFIG_SPL_STACK_R_ADDR 指向 SDRAM,则堆栈可以选择在 SDRAM 中
- 可以在这里调用 preloader_console_init() - 通常这是通过定义CONFIG_SPL_BOARD_INIT 然后提供包含此调用的 spl_board_init() 函数来完成的
- 加载 U-Boot 或(in falcon mode)Linux
- 上一篇: VScode中集成esp8266/32开发环境详解
- 下一篇: 嵌入式系统,内存不够用了怎么办?
猜你喜欢
- 2025-07-06 深度操作系统 Deepin V23 安装最新的 linux 内核
- 2025-07-06 10.开发板与 Windows 共享文件 openwrt入门经典教程
- 2025-07-06 技术帖 | 飞凌嵌入式T113-i开发板的休眠及唤醒操作
- 2025-07-06 Linux文件系统制作与裁剪(linux 文件切割)
- 2025-07-06 Linux系统的移植和裁剪(linux移植lvgl)
- 2025-07-06 瑞芯微RK3568J如何“调节主频”,实现功耗降低?一文教会您!
- 2025-07-06 16.应用程序软件包测试 openwrt入门经典教程
- 2025-07-06 「技术干货」一文搞懂怎么使用Linux内核模块
- 2025-07-06 ELF 1技术贴|如何支持exFAT和NTFS格式
- 2025-07-06 笔记-利用本地配置文件Actions云编译Openwrt
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)