【linux开发-驱动】-STM32MP157启动相关
前言:
STM32单片机是直接将程序下载到内部的Flash,上电以后直接运行内部Flash中的程序。
STM32MP157 内部没用供用户使用的 Flash,系统都是存放在外部 Flash 里面的,比如 EMMC,因此 STM32MP157 上电以后需要从外部 Flash 加载程序到内存中。
一、STM32MP157启动模式
支持从多种设备启动,比如EMMC、SD、NAND、NOR、USB、UART 等。
STM32MP157 有三个 BOOT引脚:BOOT0~BOOT2,这三个 BOOT 引脚通过拉高/拉低来设置从哪种设备启动。
BOOT2 | BOOT1 | BOOT0 | 启动模式 | 描述 |
0 | 0 | 0 | UART/USB | -USART2/3/6、UART4/5/6/7/8 -USB接口 |
0 | 0 | 1 | 串行NOR | 串行NOR或者QUADSPI |
0 | 1 | 0 | EMMC | 连接到SDMMC2上的EMMC设备 |
0 | 1 | 1 | 并行NAND | 连接到 FMC 上的并行 SLC NAND |
1 | 0 | 0 | MCU | 启动内部的 M4 内核 |
1 | 0 | 1 | SD | 连接到 SDMMC1 上的 SD 卡。 |
1 | 1 | 0 | UART/USB | 和 000 效果一样,从 UART/USB 启动 |
1 | 1 | 1 | 串行NAND | 连接到 QUADSPI 上的串行 NAND |
二、STM32MP1 启动流程
ROM 代码会读取 BOOT0~BOOT2 这三个引脚电平,获取启动模式信息,
比如读取到是从 EMMC 启动的,那么 ROM 代码就会从 EMMC 中读取相关程序。
2.1内部ROM代码
内部 ROM 代码支持如下功能:
①、Secure boot(安全启动),不管是串行启动还是从 Flash 设备启动。
②、Engineering boot(工程启动?),当 BOOT2~BOOT0 设置为 100 的时候,我们就可以通
过 STLINK 访问 A7 或者 M4 内核。一般是通过此方法来调试 M4 内核代码。
③、Secondary core boot(第二个内核启动),复位以后,STM32MP157 的每个 A7 内核都会
启动,并且运行相同的指令。
2.2安全启动
当我们设置好 BOOT2~BOOT0,选择从外部 Flash,比如 EMMC、NAND 或 NOR 等启动
的时候就会进入安全启动流程。
STM32MP157 的安全启动流程比较复杂。
2.3串行启动
当我们设置 BOOT2~BOOT0 为串行启动,也就是从 USB 或 UART 启动的时候就会进入此
模式。当选择串行启动以后 ROM 代码就会并行扫描所有可以启动的 UART 以及 USB OTG 接
口。当扫描到某个活动的串行接口以后,ROM 代码就会使用此串行接口,并且忽略掉其他的串
行接口。
1、USB 启动
内部 ROM 代码支持 USB OTG 启动,我们一般使用 STM32CubeProgrammer 软件通过 USB
OTG 接口来向 STM32MP1 烧写系统
2、UART 启动
如果要送 UART 启动,也就是通过 UART 烧写系统,那么只能使用 USART2、USART3
UART4、UART5、USART6、UART7 或 UART8,此时串口工作模式为:1 位起始位、8 位数据
位、偶校验、1 位停止位、波特率 115200。
三、 STM23MP1 Linux 系统启动过程
1、ROM代码
1、ROM代码会初始化基本的时钟。
2、从选定的启动设备中加载FSBL代码
3、启动FSBL代码
2、FSBL
1、完成整个时钟树初始化。
2、初始化DDR。
3、从选定的驱动设备中加载SSBL代码
4、启动SSBL代码
3、SSBL
1、从外部存储设备或者网络中加载
Linux系统
2、通过启动画面向用户反馈启动过程
3、启动Linux内核
4、linux内核
1、Linux内核初始化
2、挂载根文件系统
3、启动用户空间的init程序
5、linux用户空间
用户空间,也就是根文件系统里面