目录
tf-a-stm32mp157d-atk-serialboot.stm32
tf-a-stm32mp157d-atk-trusted.stm32
准备烧录文件
tf-a-stm32mp157d-atk-serialboot.stm32
用于初始化USB、DDR等外设,DDR外设初始化完成后可运行uboot。
u-boot.stm32
uboot会初始化EMMC、NAND。
tf-a-stm32mp157d-atk-trusted.stm32
编译出来的TF-A。
.tsv文件
STM32CubeProgrammer 脚本文件,如何使用上面三个文件,应该放到哪个地方,如果烧写的话要烧写到EMMC的哪个地址区域。
.tsv语法
详解:https://wiki.st.com/stm32mpu/wiki/STM32CubeProgrammer_flashlayout
tsv语法要求只能用TAB键,不能用空格!
#:整行注释
域 | 作用 |
---|---|
Opt | 选项字段,可以设置为“-”、“P”、“D”或“E” |
Id | 会根据这个id来决定烧写分区 |
Name | 分区名字 |
Type | 制定烧写的类型,仅uboot使用 |
Device | 指定烧写的设备类型与编号,比如 emmc0、emmc1、nand0 等,如果 opt 为‘-’,那么此字段就为 none |
offset | 分区的起始位置,如果为“boot1”表示 EMMC 的第一个分区,如果为“boot2”就表示 EMMC 第二个分区。如果是数字就表示需要偏移的字节数。 |
Binary | 要烧录的文件 |
Opt域
Opt 是第一个项,此选项通过‘-’、‘P’、‘D’和‘E’这四个字符定义操作方法,首选的是‘-’和‘P’。
'-':none,也就是空选项,分区或者设备无需修改,如果Device域为none,那么Opt强制为‘-’。
'P':向分区或者设备烧写固件。
'E':空分区或设备,表示对应的分区或设备不更新,相关的 Id 项会被跳过。
'D':删除分区或设备。
'PE':不更新,也就是指定某个分区或者设备不需要烧写固件,这样就可以单独只更新 tf-a、uboot、kernel 或者 rootfs。
'PD':删除并更新,也可以写作 DP。
'PDE':删除并且保持为空,也可以写作 PED/DPE/DEP/EPD/EDP。
Id域
STM32CubeProgrammer通过Id域来确定烧写方法,会通过Id域来识别下一个要烧写到设备里面的二进制文件:
ROM或者FSBL:二进制文件要加载到RAM中
SSBL(uboot):二进制文件要烧写到Flash中
Id范围:
范围 | 分区 |
---|---|
0x01~0x0F | 带有 STM32 头部信息的 Boot 分区,如 SSBL、FSBL、其他(TEE 或 M4 固件) |
0x10~0xF0 | 不带头部的用户编程分区,如 uimage、dtb、rootfs、vendorfs、userfs |
Id含义:
Id | 分区 |
---|---|
0x00 | 内部使用,用户不能使用此 ID! |
0x01 | FSBL(第一阶段拷贝),ROM 代码使用,会加载到 RAM 中 |
0x03 | SSBL,FSBL 使用,加载到 RAM 中 |
0x04 | 把FSBL烧写到boot1里面 |
0x05 | 把FSBL烧写到boot2里面 |
0x06 | SSBL烧写到Flash |
0x21 | Linux内核设备树 |
0x22 | 根文件系统 |
0xF1~0xFD | 虚拟分区,内部使用 |
0xF1 | 命令获取阶段 |
0xF2 | OTP |
0xF3 | SSP |
0xF4 | PMIC NVM |
0xFE | 操作结束 |
0xFF | 复位 |
Name域
Name 域为一段字符串,也就是目标内存段的名字。
Type域
Type域仅仅用于uboot,用来选择需要更新的Flash区域:
SD 卡或者 EMMC 设备对应 GPT 分区。
原始的Flash设备,如NAND、NOR等对应MTD分区。
SD/EMMC和NAND/NOR所支持的Type类型:
Type | GPT | GPT | MTD | MTD | MTD |
---|---|---|---|---|---|
Type | SD | EMMC | NAND | NOR | RAM |
Binary | √ | √ | √ | √ | √ |
Binary(N) | ssbl | ||||
FileSystem | √ | √ | √ | √ | dtb |
System | √ | √ | UBI | UBI | kernel |
Rawimage | √ | user data | √ | √ |
Binary:原始的二进制文件。
FileSystem:linux 文件系统,为 ext2/ext4/fat 格式。
System:Linux 内核。
Device域
烧到哪里去,Device域指定Uboot设备树定义的设备和索引(从0开始),不同的设备其设备名字和索引不同:
mmc+索引:如 mmc0、mmc1、mmc2 等,对应 SD 卡或 EMMC。比如 SD 卡和 EMMC分别接到 MP1 的 SDMMC1 和 SDMMC2 接口上,那么 SD 卡和 EMMC 分别为 mmc0 和 mmc1。
nor+索引:如 nor0,对应 NOR 或者 QUADSPI Flash。
mmc+索引:如 nand0,对应连接到 FMC 总线上的并行 NAND Flash。
spi-nand+索引:如 spi-nand0,对应连接到 QSPI 上的串行 NAND Flash。
none:RAM,也就是将固件加载到 RAM 里面,仅允许启动阶段使用,而且 Type 域要为 Binary,Offset 域要为 0,Opt 域为‘-’。
ram+索引:如 ram0,烧写服务讲固件加载到 RAM 中运行。
Offset域
Offset 就是偏移,偏移的字节数,支持的值如下:
boot1:EMMC 的第一个启动区域分区。
boot2:EMMC 的第二个启动区域分区。
数字:具体的偏移值,单位为字节。
Binary域
STM32CubeProgrammer 软件要使用的二进制文件,烧写文件的路径。
#flashlayoout.tsv
#Opt Id Name Type Device Offset Binary
- 0x01 fsbl1-boot Binary none 0x0 tf-a-stm32mp157d-atk-serialboot.stm32
- 0x03 ssbl-boot Binary none 0x0 u-boot.stm32
P 0x04 fsbl1 Binary mmc1 boot1 tf-a-stm32mp157d-atk-trusted.stm32
P 0x05 fsbl2 Binary mmc1 boot2 tf-a-stm32mp157d-atk-trusted.stm32
将上面4个文件放到同一文件夹下,注意:文件夹名字一定是要英文!!!
烧录文件
拨码开关设置000
连接USB-OTG
3.复位开发板
4.打开STM32CubeProgrammer,点击“+”,选择“Open File”,或者直接选择“Open File”
5.找到要烧录的tsv文件,打开
6.选择USB
7.点击“刷新”,会出现“USB1”,再点击“Connect”进行连接到开发板
8.把STM32CubeProgrammer 界面托长,露出“Browse”,点击“Browse”
9.选择烧录文件的路径,点击“选择”
10.点击“Download”
11.烧录完成,点击“确定”
12.拨码开关设置为010,复位开发板
查看TF-A烧录时间
复位开发板后,可以在串口调试助手上可以看到TF-A的烧录时间,但是这个时间有问题,这个时间是编译生成tf-a-stm32mp157d-atk-trusted.stm32文件的时间