官方推荐使用VMWare15+Ubuntu18.04,之前自己做一些开发使用的VMWare+Ubuntu20.04,懒得重新安装,后续踩坑再填。
在Windows下需要安装STM32CubeMX、STM32CubeIDE(这两个用来配置和编写MCU代码)和STM32Programmer(烧录工具)。这三个软件需要java环境,所以还需要安装java。在此不做叙述。
U-Boot类似于电脑的BIOS,入口是上电自动启动,唯一出口是加载系统镜像,在U-Boot内还可以进行一些内核的启动配置,如启动介质参数,网络配置参数等。
通常在内核中会固化一块片内ROM和一个SYSRAM,启动时,片内ROM的BL1(BootLoader1,第一阶段启动文件)部分先加载到核内RAM中(也有设计将此部分烧写在U-Boot的头部位置),然后判断自己在主存中还是启动设备(静态内存)Booting Device中,如果是后者,就将整个U-Boot搬运到SDRAM中,之后跳转到BL2中,加载驱动、命令行等。最后,将整个OS加载到SDRAM中,再跳转到OS部分执行。
在STM32MP157中,除了linux开发常见的三大板块:U-Boot、Kernel & DTB、Rootfs以外,还有一个涉及到系统安全的TF-A部分,正点原子教程中对此部分仅涉及到了移植教程,对内部的实现方式无额外解读。此部分先略过。
【1】FSBL:
全称为 First stage boot loader,也就是第一阶段启动文件。一般是 TF-A 镜像,可以换成自己编写的程序,SYSRAM的地址空间;0X2FFC0000~0X2FFFFFFF,FSBL起始地址:0X2FFC2400,但是前端会带有256KB的头部信息,所以替换成自己的程序时,起始地址为:0X2FFC2500,整个FSBL大小不能超过247KB。
【2】SSBL:第二阶段启动文件,一般是U-Boot,有的系统还会需要设备树(.dtb)文件,此部分在片外的DDR中运行,所以不需要担心空间问题。
【3】默认外部晶振:
24MHz,在自己设计板子时用到,尽量不要更改。(ROM代码自动检测,可以为8,10,12,14,16,20,24,25,26,28,32,36,40,48,默认为24)
【4】串口启动:
使用UART烧写系统,只能使用串口2,3,4,5,6,7,8这几个串口,自己画板子的时候最好按照这样设计,并使用推荐引脚。
【5】Flash设备启动要求:
EMMC:
boot1、 boot2、 RPMB 这三个分区代销是固定的,用户不能修改, boot1、 boot2 分区存在的意义就是用于引导系统。
ST 会使用 EMMC 的 boot1 和 boot2 这两个分区作为 FSBL,但是同一时间只有一个有效,
ROM 代码会加载有效的哪个 FSBL。ROM 代码使用单 bit 模式来操作 EMMC, 默认情况下 ROM
代码使用连接到 SDMMC2 上的 EMMC
SD卡:
SD 卡也包含两个 FSBL,但是 SD 卡没有 boot1 和 boot2 这样的物理分区。 ROM 代码默认
尝试加载第一个 FSBL,如果第一个 FSBL 加载失败,那么 ROM 代码就会加载第二个 FSBL。第一个 FSBL 的起始地址为0X4400,第二个 FSBL 的起始地址为 0X44400
【6】TF-A头部信息:
TF-A 编译生成二进制 bin 文件,需要在前面添加一段头部信息,这段头部信息也包含了鉴权内容。这段信息在编译 ST 官方提供的 TF-A 或者 Uboot 的时候会自动添加,编写 A7 裸机的时候需要自己使用 stm32image 工具在 bin 文件前面添加头部信息。STM32image工具为linux下运行,在使用前需要编译,然后对指定文件添加。
【7】整体的系统启动流程: