STM32MP1启动流程
1.启动模式
STM32MP1等SOC支持从多种设备中启动,如EMMC、SD、NAND、NOR、USB、UART等。其中USB、UART是作为烧录进行启动的。
STM32MP1内部ROM中存储有一段出厂代码来进行判断从哪种设备中启动,上电后这段代码会被执行,这段代码空间不开放给用户。
这段代码通过判断MP1中BOOT0~BOOT2这三个引脚的高低电平来判断在哪种设备启动,硬件原理图可参考如下。SOC也可以遍历各个启动设备,如果有则在该设备中启动,则可以省掉该部分电路。
MP1引脚电平对应启动设备如下:
MP1引脚可进行复用,BOOT引脚也可以进行复用。在出厂ROM中的代码已经设定好启动引脚,如果想修改启动引脚,则需要修改OTP,因此不建议复用BOOT引脚。
什么是OTP?
在嵌入式系统中,OTP(One-Time Programmable)是一种重要的存储技术。它通常用于存储固件、配置信息或密钥等数据,其主要特点是:
- 一次性可编程
- 定义:OTP 存储器只能在制造后进行一次编程,数据一旦写入便无法更改或删除。这与可擦除可编程只读存储器(EEPROM)或闪存(Flash)不同,后者可以多次写入和擦除。
- 应用领域
- 固件存储:在某些嵌入式设备中,OTP 被用来存储设备的固件或初始配置。这些数据在出厂时被写入,之后不会被修改。
- 安全性:OTP 存储器常用于存储加密密钥、设备身份等敏感信息。由于其数据不可更改,增加了数据的安全性,降低了被篡改的风险。
- 电子产品:许多消费电子、汽车电子和工业设备中广泛使用 OTP 存储器来实现安全认证和数据保护。
- 物理特性
- 制造过程:OTP 存储器通常在半导体制造过程中被编程。它的设计允许在生产时写入数据,之后的任何操作都不会改变这些数据。
- 成本效益:与其他可重复编程存储器相比,OTP 存储器的成本通常较低,因为它的结构更简单,不需要复杂的擦除和重写机制。
- 优势与劣势
- 优势:
- 数据安全性高:一旦写入,数据不可篡改。
- 成本低:相对于其他类型的存储器,其制造和使用成本通常更低。
- 劣势:
- 数据不可更改:一旦数据写入,无法修改,限制了其灵活性。
- 写入过程不可逆:写入失败会导致数据丢失,无法恢复。
- 与其他存储技术的比较
- EEPROM 和 Flash 存储:这些存储器可以多次写入和擦除,适合需要频繁更新的数据存储。相对而言,OTP 更适合用于静态数据。
总结
OTP 存储器在嵌入式系统中扮演着重要角色,尤其是在需要高安全性和低成本的应用场景。尽管它的灵活性较差,但在许多情况下,无法更改的数据特性使其成为一个理想的选择。
2.启动流程
2.1 功能介绍
MP1启动后首先会执行保存在ROM中的一段代码来判断从哪种设备启动,除此之外,该代码还有其它功能:
- Secure boot :安全启动,即一般的启动模式。
- Engineering boot :可通过STLINK访问A7或M4内核。一般通过该方法调试M4内核。
- Secondary core boot :用于配置第二个内核启动。启动后,MP1双核A7实际上只有一个核Core0在运行ROM程序,另一个核Core1在执行死循环,只用Core1接收到Core0发送的信号后才回运行。如果不进行第二个核启动,则可认为是单核设备。
- RMA boot :全称为Return Merchandise Authorization Boot,是一种与设备保修和维护相关的启动机制,主要用于嵌入式系统和网络设备。这种机制允许设备在返回制造商或维修中心时以特定方式启动,以便进行故障排除、修复或恢复。
- 低功耗唤醒 。
- 提供安全相关服务 。
2.2 启动流程
内部ROM流程图如下所示:
主要流程如下:
- 是不是CPU0运行?
- 检查复位原因。
- 是否是因为Standby导致的退出?
- 是否为RMA启动?
- 是否为ENGI启动?
- 进行冷启动,在flash中载入系统并进行鉴权。
2.3 安全启动
FSBL: 全称为 First stage boot loader,也就是第一阶段启动文件。
SSBL: 全称为 Second stage boot loader,也就是第二阶段启动文件 。
在MP1选定外部启动设备宏,则进入安全启动流程,基本步骤如下:
- 在flash中载入FSBL镜像文件,对于MP1来说,一般为TF-A。
- 对FSBL加载的镜像进行鉴权(此时DDR未初始化没在MP1内部RAM中运行)。
- 如果鉴权成功,则运行FSBL中固件。
2.4 串行启动
当从USB或UART启动时会进入该模式,ROM中的代码会循环扫描可以启动的UART或USB OTG接口,当扫描到一个活动的端口后或MP1便选定该端口,忽略掉其它设备。
- USB启动
ROM内部代码支持USB OTG启动。需注意ROM中的晶振频率已经设置,要是修改需要修改OTP。
- UART启动
约定的串口模式为串口工作模式为: 1 位起始位、 8 位数据位、偶校验、 1 位停止位、波特率 115200。
启动的UART也已经约定好,需保持与ROM中一致。
3.Flash设备启动要求
Linux系统不像MCU,编译完成通过只有一个bin文件烧录即可。
Linux编译出来为一个镜像文件,还需要其它代码来进行辅助,传统Linux需要三部分:uboot、kernel、rootfs。
对于MP1来说,还需要TF-A、TEE、vendorfs等。
以上所有文件组成最终的系统镜像,将镜像烧录到Flash中,根据不同的文件类型,则放置到Flash中不同的位置。MP1官方建议的位置如下:
EMMC和NAND Flash的主要区别是什么?
NAND Flash需要外部控制器来控制其读写操作,而eMMC则采用内置控制器,可以更加方便地实现读写操作和数据管理。此外,eMMC还可以作为内置存储器使用,由于其内置控制器的作用,可以实现快速的读写操作。
4.头文件信息
ROM启动时会先读取FSBL代码,一般是TF-A或者uboot的SPL。但是编译生成的二进制不能直接用,需要加入一段头部信息,其中包含全部鉴权内容。具体格式如下:
5.启动过程
MP1启动Linux流程如下:
- 系统启动为一个链式结构:ROM Code -> FSBL -> SSBL -> Linux kernel -> rootfs。FSBL及其后面每一个环节都对镜像进行鉴权,指导设备正确启动。
- FSBL中初始化时钟树、外部RAM控制器(即DDR),在内部RAM中运行;SSBL中代码运行在DDR中,完成的功能更为丰富。