1. 课程导入与工程全景
在嵌入式 Linux 产品开发中,处理器上电后到操作系统接管之间,存在一段极其关键却又容易被忽视的“启动工程”。它决定了板卡能否在几百毫秒内稳定地把控制权交给内核,也决定了后续驱动、文件系统乃至应用能否正常工作。TI Sitara 系列处理器(AM335x、AM437x、AM57xx 等)广泛应用于工业 HMI、电力终端、医疗设备、车载网关等场景,其启动链路涉及 ROM Code、SPL、U-Boot、设备树、内核与根文件系统多个阶段。本课程围绕“U-Boot 与 BSP 启动工程”展开,帮助你把零散的启动知识串成一条可调试、可移植、可量产的工程主线。
一、Sitara 家族与启动工程的定位
Sitara 是 TI 面向工业与嵌入式市场的一类 ARM 处理器统称。AM335x 基于 Cortex-A8,主频常见 600MHz~1GHz,集成 PRU-ICSS、双千兆以太网、LCD 控制器,是 BeagleBone Black、工业网关的经典平台;AM437x 升级到 Cortex-A9,增加 Quad-SPI、更丰富的外设与安全启动能力;AM57xx 则是 Cortex-A15 + C66x DSP + PRU 的异构多核架构,面向机器视觉、工业通信等高性能场景。三者虽然性能不同,但启动哲学一致:芯片内部固化的 ROM Code 先运行,按启动介质顺序加载第一级引导程序,再由它初始化 DDR 等关键资源,最终把 U-Boot 和 Linux 内核拉起来。
U-Boot 在这条链路中扮演“引导加载器 + 板级初始化 + 镜像加载器”三重角色:它负责配置时钟、DDR、引脚复用,加载设备树与内核,传递启动参数,并提供命令行用于调试与烧录。BSP(Board Support Package)则是围绕具体板卡的一整套软件包,包含 U-Boot 板级配置、内核设备树、驱动补丁、文件系统与构建脚本。可以说,U-Boot 是启动的执行者,BSP 是启动的“施工图与材料清单”,两者缺一不可。
二、典型产品开发场景
以一台基于 AM335x 的工业 HMI 为例:硬件团队完成原理图与 PCB 后,软件团队需要让板子“跑起来”。第一步通常是从 TI 官网获取 Processor SDK,安装交叉编译工具链;第二步基于 BeagleBone Black 或 EVM 的 defconfig 建立自定义板级配置;第三步修改 DDR 参数与引脚复用,确保 SPL 能正确初始化内存;第四步调整 U-Boot 环境变量,指定内核、设备树与根文件系统的加载地址和启动命令;第五步编译内核与设备树,制作根文件系统;最后通过 SD 卡或 UART 烧录验证。整个过程不是线性的,而是“改配置—编译—烧录—看串口—再改”的迭代循环。
在这个过程中,最常遇到的启动故障包括:SPL 阶段卡死(多为 DDR 参数错误)、U-Boot 找不到内核(多为分区或加载地址错误)、内核启动后无控制台输出(多为设备树串口配置错误)、根文件系统挂载失败(多为 bootargs 中 root= 参数错误)。掌握这些故障与启动阶段的对应关系,是调试效率的分水岭。
三、本课程的知识地图
后续章节将沿着“原理—环境—移植—调试—量产”的主线展开。你会先理解 ROM Code 如何通过 SYSBOOT 引脚选择启动介质,再动手配置 SPL 的 DDR 初始化参数;随后深入 U-Boot 的 board_init_f、board_init_r 流程,学会添加自定义板级文件;接着掌握设备树的 pinmux、时钟与节点覆盖方法;最后完成从 SD 卡启动到 eMMC 量产烧录的完整闭环。每一章都会给出可操作的配置片段、命令与判断依据,而不是停留在概念层面。
四、关键概念速查
| 术语 | 含义 | 在启动中的位置 |
|---|---|---|
| ROM Code | 芯片出厂固化的引导代码 | 上电后最先执行,探测启动介质 |
| SPL / MLO | 二级程序加载器,体积小 | 初始化 DDR、时钟,加载 U-Boot |
| U-Boot | 通用引导加载器 | 板级初始化、加载内核与设备树 |
| DTS/DTB | 设备树源文件与二进制 | 内核解析硬件拓扑,匹配驱动 |
| BSP | 板级支持包 | 贯穿 U-Boot、内核、文件系统 |
| bootargs | 内核启动参数 | 由 U-Boot 传给内核,含 root= 等 |
理解这张全景图后,你会发现启动工程并不是“一堆零散配置”,而是一条有明确阶段、明确输入输出、明确失败特征的链路。接下来,我们从最底层的 ROM Code 开始,逐段拆解这条链路。