从《README》了解u-boot

简介: 从《README》了解u-boot

了解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 _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

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

相关文章
|
API 开发工具 git
git常用的API以及每个的应用场景
【4月更文挑战第5天】Git是流行的分布式版本控制系统,用于代码管理,提供丰富的API。本文概述了Git常用API,如`git init`(初始化仓库)、`git add`(添加到暂存区)、`git commit`(提交)、`git remote add origin`(添加远程仓库)、`git pull`和`push`(同步远程仓库)、`git branch`(分支管理)以及`git checkout`(切换分支或恢复文件)。了解和熟练使用这些API能提升开发效率和代码质量,更多Git功能可参考官方文档。
931 0
|
安全 API 数据安全/隐私保护
smtp用户名,验证身份的名称是什么?
SMTP用户名是验证身份的标识,用于证明有权使用SMTP服务器发送邮件。它通常与邮箱地址关联,如`example@example.com`。配合smtp密码,二者组成身份验证的钥匙。安全使用这些信息至关重要,避免在不安全环境中输入,以保障邮件发送的安全和顺利。AokSend提供安全的发信服务,支持smtp/api接口,确保高触达发信。
|
Web App开发 关系型数据库 应用服务中间件
|
算法 Java Go
运行时管理GO与Java的概要对比
【5月更文挑战第17天】本文介绍Go、Python和Java的运行时机制各异。Go是编译型语言,其runtime负责内存管理、GC和协程调度,强调性能和低延迟。Java的JVM兼顾跨平台和性能,使用字节码和JIT编译,其GC策略复杂且高效。三种语言在设计和优化上各有侧重,适用不同场景。
504 3
|
机器学习/深度学习 人工智能 编译器
【AI系统】Auto-Tuning 原理
本文探讨了在多样化硬件平台上部署深度神经网络(DNN)时,传统算子库面临的挑战及解决方案。随着硬件平台的多样化和快速迭代,手动编写高性能算子库变得日益困难。文中介绍了基于TVM的三种自动调优系统——AutoTVM、Ansor和Meta Scheduler,它们通过自动生成高性能算子,有效解决了传统方法的局限性,提高了DNN在不同硬件平台上的执行效率。
844 1
|
机器学习/深度学习 自然语言处理 算法
【论文解读】文本分类上分利器:Bert微调trick大全
【论文解读】文本分类上分利器:Bert微调trick大全
1249 0
【论文解读】文本分类上分利器:Bert微调trick大全
|
编解码 资源调度
功率谱密度(PSD)及其在无线通信中的应用
功率谱密度(PSD)及其在无线通信中的应用
2653 4
|
Oracle 关系型数据库 Unix
关系型数据库Oracle设置环境变量:
【7月更文挑战第22天】
2320 4
|
开发工具
如何修改Vscode查看源代码管理版本变动文件的查看方式
这篇文章介绍了如何在VSCode中通过源代码管理插件修改查看源代码版本变动文件的方式,提供了树形视图和列表视图两种查看方法,并说明了如何通过设置选项来切换查看方式,帮助用户根据自己的喜好更高效地查看和管理代码变动。
如何修改Vscode查看源代码管理版本变动文件的查看方式
|
安全 Linux C语言
【FreeRTOS】系统移植:资料下载(二)
【FreeRTOS】系统移植:资料下载
933 0