文章目录
- 什么是Bootloader
- U-Boot的引入
- 归纳
- 为什么要移植Bootloader
- Bootloader特征
- 厂商和自己产品的区别
- 移植Bootloader准备
- 硬件层面
- 软件层面
- 第一阶段的功能
- 第二阶段功能
- 获取U-Boot源码
- 本地打补丁
- 编译U-Boot并烧写更新
- Das uboot 源码压缩包下载页面
- SPL
- 什么是SPL
- 移植SPL过程
- 移植u-boot.stm32
什么是Bootloader
Bootloader是由boot(启动)loader(加载)这两部分组成,引导加载程序是一个程序,负责加载内核和设置一些内核参数,其中使用可选的内核参数和存储磁盘(称为initrd:rd:ramdisk)加载Linux内核。
Linux内核是Linux操作系统的核心,它加载后立即启动init(初始化的缩写)过程或init替代品。例如systemd。Linux初始存储磁盘提供了一个临时存储空间,用于在可以装入实际的根文件系统之前将关键文件加载到内存中。
在BIOS(基本输入/输出系统)较旧计算机上,引导加载程序驻留在MBR(主导记录中),它占据磁盘上的前512字节,但是较新的UEFI(统一扩展固件接口)计算机将其存储在一个特殊的分区,称为EFI系统分区。
在成功执行POST(开机自检)后,BIOS或UEFI将引导加载程序加载,POST是在计算机或其他数字电子设备开机后立即执行的自检过程。
U-Boot的引入
Das U-Boot
Universal Boot Loader , 通常缩写为 U-Boot; 是德国 DENX 小组开发的用于多种嵌入式 CPU 的bootloader 程序, 嵌入式设备中使用的一种开源主引导程序, 用于打包引导设备运行的指令系统内核。 它可用于许多计算机体系结构, 包括 68k, ARM, Blackfin, MicroBlaze, MIPS, Nios, SuperH, PPC, RISC-V和 x86。
归纳
引导加载程序是至关重要的软件, 负责加载 Linux 内核和 Linux 初始 RAM 磁盘。 Linux 用户可以从几种不同的引导程序中进行选择, 每种都有各自的优缺点。
为什么要移植Bootloader
Bootloader是在操作系统运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Bootloader特征
- Bootloader是硬件启动时执行的引导程序,是运行操作系统的前提
- Bootloader是在操作系统内核或用户应用程序运行之前运行的一段代码;
- 在嵌入式系统中,整个系统的初始化和加载任务一般由Bootloader来完成;
- 对硬件进行相应的初始化和设定,最终为操作系统准备好环境。
厂商和自己产品的区别
移植Bootloader准备
硬件层面
电源电路正常, 焊接正常, 供电正常。
晶振电路正常, 焊接正常, 供电正常。
CPU 电路无误, 焊接正常, 供电正常。DDR 电路无误, 焊接正常, 供电正常。
串口电路无误, 焊接正常, 供电正常, 用于观察现象。
存储电路无误, 焊接正常, 供电正常, 用于存储内核文件系统应用等数据。
软件层面
第一阶段的功能
1硬件设备初始化
1.1 设置异常向量
1.2CPU进入SVC模式
1.3设置控制寄存器地址
1.4关闭看门狗
1.5关闭中断
1.6初始化时钟
1.7关闭MMU,cache
1.8初始化RAM控制寄存器
2.加载U-Boot第二阶段代码到RAM空间
3.设置好栈
4.跳转到第二阶段代码入口
第二阶段功能
1.初始化本阶段使用的硬件设备
2.检测系统内存映射
3.执行bootcmd命令
3.1 将内核从Flash读取到RAM中(nand)
3.2为内核设置启动参数(bootargs)
3.3调用内核(bootm)
获取U-Boot源码
下载
本地打补丁
添加u-boot文件和补丁文件到任意目录
执行以下命令
patch --dry-run -p1 < ../100ask_stm32mp157_pro-uboot-2020.1-stm32mp-r1.patch
编译U-Boot并烧写更新
在顶层输入命令
make
结果如下
开发板断电, 连接好 usb otg 接口至电脑 usb 接口, 设置启动方式为 usb 启动模式, 然后上电。
电脑端使用 STM32CubeProgrammer 烧写工具打开 Buildroot_Emmc_TrustUbootBootloader.tsv
配置文件, 选择 Binaries path 为资料光盘 02_ImagesFlashlayout 路径, 请留意如下红框所标
提示是否一致, 软件是否和 usb 下载模式已经连接成功。
开发板和软件提示连接成功以后, 点击 Download 按钮, 开始下载, 下载成功后有如下提示, 关闭电源,
移除 usb otg 线, 设置启动方式为 emmc 启动, 打开电源即可看到更新。
Das uboot 源码压缩包下载页面
SPL
什么是SPL
●与 NOR 闪存不同, 许多引导源未直接映射到内存。
●片上 ROM 或其他机制将二进制文件加载到 SRAM 中。
– 该 SRAM 通常很小, 有时为 4 KiB 或更小。
– ROM 尚不能将我们加载到主系统 RAM 中, 因为初始化太复杂, 必须由 U-Boot 处理。
●SPL(二级程序加载程序) 是从 U-Boot 源生成的小型二进制文件, 它适合 SRAM, 并将主 U-Boot 加载
到系统 RAM 中。
●通过一组并行的 makefile 配置符号 CONFIG_SPL_I2C_SUPPORT, CONFIG_SPL_NAND_SUPPORT 等进行配
置。
– 使用了正常的 CONFIG 符号, 但不能控制 SPL 和主 U-Boot 之间的差异。
– SPL 还严重依赖于工具链垃圾回收。
STM32MP157 是复杂的处理器, 开发板上电/复位后, 首先运行 CPU 内部的 ROM 引导程序,
ROM 引导程序是固化在芯片内部, 用户无法更改, ROM 主要的作用就是配置看门狗 设置 CPU 时钟, 为下一个引导程序做准备, 检查引导源以获取下一个引导加载程序( SPL), 并将下一个引导程序代码移入内存以运行, 内部 ROM 从特定位置读取到 SPL 程序后会自动初始化一些基本外设初始化片上 DDR(片上 DDR 指的是CPU 外部内存芯片), 之后继续执行 u-boot 阶段来初始化更多外设和引导内核启动。
STM32MP157 处理器内存地址表其中系统内部 RAM 大小只有 256KB 不能运行完整的
u-boot, 所以需要通过 ROM 先执行 SPL 初始化 DDR 来运行完整的 u-boot 镜像。
如下图所示
移植SPL过程
- 初始化最小系统 DDR 晶振
- 初始化 DEBUG 串口设备
2.1 查看原理图 获取串口设备 Pin Number
2.2 设置 Pin Number 为特定模式
2.3 配置设备树 - 编译烧写运行
移植u-boot.stm32
- 初始化最小系统 DDR 晶振
- 初始化 DEBUG 串口设备
6.1 查看原理图 获取串口设备 Pin Number
6.2 设置 Pin Number 为特定模式
6.3 配置设备树 - 编译烧写运行