Bootloader移植(STM32MP157)

17 篇文章 1 订阅

文章目录


什么是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源码

韦东山老师Git仓库

在这里插入图片描述
下载

本地打补丁

添加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过程

  1. 初始化最小系统 DDR 晶振
  2. 初始化 DEBUG 串口设备
    2.1 查看原理图 获取串口设备 Pin Number
    2.2 设置 Pin Number 为特定模式
    2.3 配置设备树
  3. 编译烧写运行

移植u-boot.stm32

  1. 初始化最小系统 DDR 晶振
  2. 初始化 DEBUG 串口设备
    6.1 查看原理图 获取串口设备 Pin Number
    6.2 设置 Pin Number 为特定模式
    6.3 配置设备树
  3. 编译烧写运行
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluepad

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值