iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第三部分 开发板固件烧写
第七章 设置启动模式(必看)
7.1 uboot模式
在确认电源、串口控制台等连接好以后,按下开发板上的开关按键,启动开发板,串口控制台会打印 u-boot 启动信息(用户手册第六章有串口软件以及串口控制台软件的安装和使用方法)。读秒的过程中如果输入任何值,将进入uboot 模式,在 PC 的串口上可以看到类似下图所示的系统启动的信息。为了和 Ubuntu、Win7 的命令行区分,在文档的后面,我们统一将“在超级终端的命令行里面输入命令”的过程叫做“进入超级终端的 uboot 模式,输入命令”。
7.2 设置拨码开关
STM32MP157 有三个 BOOT 引脚:BOOT0~BOOT2,这三个 BOOT 引脚通过拉高/拉低来设置从哪种设备启动,虽然在实物图上我们设置了四位开关,但实际上只有三位拨码开关,分别为SW1、SW2、SW3,当拨码开关拨到on,开关导通,对应的BOOT被3.3V电压拉高,显示状态为1,相反当拨码开关拨到off,开关断开,对应的BOOT被拉低,显示状态为0。
下面为STM32MP157我们以后要用到的三种状态:
拨码开关编号 | 1 | 2 | 3 | 4 |
EMMC 启动 | 0 | 1 | 0 | 0 |
USB 烧写 | 0 | 0 | 0 | 0 |
TF卡启动 | 1 | 0 | 1 | 0 |
7.3 镜像说明
我们以最小系统的镜像为例,来讲镜像之中每一个文件的作用。镜像文件的文件树如下图所示:
7.3.1 tsv配置文件
首先要讲解的是.tsv配置文件,该文件是STM32CubeProgrammer 的脚本文件,确定要烧写到 EMMC 和TF卡的哪个地址区域存放路径如下图所示:
我们以EMMC的配置文件为例,使用命令“vim emmc.tsv”进入该文件,可以看到该文件的格式如下图,每一个内容间隔为一个TAB键,建议大家以后在修改的时候在我们写好的基础上直接改,以免格式出错,或者使用文本编辑软件来辅助修改。
下面我们将对每一个字段进行详细的讲解,所参考的官方文档连接如下: https://wiki.stmicroelectronics.cn/stm32mpu/wiki/STM32CubeProgrammer_flashlayout
字段 | 字段对应的作用 |
Opt | 选项字段 |
Id | 会根据这个 id 来决定烧写分区 |
Name | 分区名字 |
Type | 制定烧写的类型,仅 uboot 使用。 |
Device | 指定烧写的设备类型与编号 |
Offset | 分区的起始位置 |
Binary | 要烧录的文件 |
- Opt字段
Opt 是第一个项,此选项通过‘-’、‘P’、‘D’和‘E’这四个字符定义操作方法.
‘-’:none,也就是空选项,分区或者设备无需修改,如果 Device 域为 none,那么 Opt 强制为‘-’。
‘P’:向分区或者设备烧写固件。
‘E’:空分区或设备,表示对应的分区或设备不更新,相关的 Id 项会被跳过。
‘D’:删除分区或设备。
允许的组合选项如下所
‘-’:空选型。
‘P’:更新分区或设备,也就是向分区或设备烧写固件。
‘PE’:不更新,也就是指定某个分区或者设备不需要烧写固件,这样我们就可以单独 只更新 tf-a、uboot、kernel 或者 rootfs。
‘PD’:删除并更新,也可以写作 DP。
‘PDE’:删除并且保持为空,也可以写作 PED/DPE/DEP/EPD/EDP。
- Id字段
STM32CubeProgrammer 通过 Id 域来确定烧写方法,会通过 Id 域来识别下一个要烧写到设备里面的二进制文件:
ROM 或者 FSBL:二进制文件要加载到 RAM 中
SSBL(uboot):二进制文件要烧写到 Flash 中。
范围 | 分区 |
0x01~0x0F | 带有 STM32 头部信息的 Boot 分区,如 SSBL、FSBL、其他(TEE 或 M4 固件) |
0x10~0xF0 | 不带头部的用户编程分区,如 uiamge、dtb、rootfs、vendorfs、userfs |
其中 0X01 和 0X03 这两个 ID 是给 FSBL 和 SSBL 留着的,它们会被加载到 RAM 中。一些默认的 Id 含义如下表所示:
Id | 分区 |
0x00 | 内部使用,用户不能使用此 ID! |
0x01 | FSBL(第一阶段拷贝),ROM 代码使用,会加载到 RAM 中 |
0x03 | SSBL,FSBL 使用,加载到 RAM 中 |
0xF1~0xFD | 虚拟分区,内部使用 |
0xF1 | 命令获取阶段。 |
0xF2 | OTP |
0xF3 | SSP |
0xF4 | PMIC NVM |
0xFE | 操作结束 |
0xFF | 复位 |
- Name字段
这是一个字符串描述符,它指示目标存储段
- Type字段
-
GPT
MTD
类型
SD卡
e • MMC
NAND闪存
NOR闪存
内存
Binary
X
X
X
X
X
Binary(N)
文件
FileSystem
X
X
X
X
dtb
System
x
x
UBI
UBI
kernel
Rawimage
X
user data
X
X
由于我们的开发板的存储为EMMC类型,所以我们只在下面列出了EMMC 下的 Type 域含义:
Binary:原始的二进制文件。
FileSystem:linux 文件系统,为 ext2/ext4/fat 格式。
System:Linux 内核。
- Device字段
Device 域指定 Uboot 设备树定义的设备和索引(从 0 开始),不同的设备其设备名字和索引不同。我们只是列出了EMMC的设备和索引。
mmc+索引:如 mmc0、mmc1、mmc2 等,对应 SD 卡或 EMMC。比如 SD 卡和 EMMC分别接到 MP1 的 SDMMC1 和 SDMMC2 接口上,那么 SD 卡和 EMMC 分别为 mmc0 和 mmc1。
- Offset字段
Offset 就是偏移,支持的值如下:
boot1:EMMC 的第一个启动区域分区。
boot2:EMMC 的第二个启动区域分区。
数字:具体的偏移值,单位为字节。
(7)Binary字段
也就是我们要烧写到开发板的二进制文件。
7.3.2 tf-a镜像文件
如下图所示,烧写会用到两个tf-a的二进制文件,这里的tf-a镜像文件是由TF-A的源码编译来的,具体的编译过程请查看“第十一章 编译TF-A”。
tf-a-stm32mp157a-itop-serialboot.stm32文件在使用STM32CubeProgrammer进行USB烧写的时候起作用,而tf-a-stm32mp157a-itop-trusted.stm32文件才是真正要烧写到EMMC的文件。
7.3.3 u-boot.stm32
可以看到这里存在三个u-boot镜像,这三个uboot的作用是不一样的,就和上一小节之中的tf-a文件相同,在otg-uboot.stm32文件是用来进行辅助烧写的,而tf_u-boot.stm32文件和emmc_u-boot.stm32文件是真正烧写到TF卡和emmc里面的,这三个uboot文件不能搞乱,如果我们以后对uboot源码进行了修改,那么只需要将修改后编译出来的u-boot.stm文件替换掉uboot目录下对应的镜像即可。具体的uboot编译对应的章节为“第十二章 编译uboot”。
7.3.4 bootfs.ext4
bootfs.ext4文件存放的是内核和设备树,即uImage文件和.dtb文件。具体设备树和内核的编译以及.ext4文件的制作在“第十二章 编译Linux内核”。
7.3.5 rootfs.ext4
rootfs.ext4对应的为文件系统,文件系统的制作可以参考“第十五章 制作最小Linux系统”。