先埋个坑,记录一下学习tf-a设备树编写的过程
首先是现有的资料,正点原子给出了linux版本4.x的一个针对正点原子mp157daa1开发板的移植教程,确实可用,但其只给了怎么做,没有具体阐述为什么和如何改,这里试图探索一下具体怎么改。
FW_CONFIG 可以理解为用于bl2 tf-a 的
用于查找后续启动偏移的文件
这里我的理解:这里说此文件是用设备树格式,但是此文件并不是tf-a里面的设备树,此文件更像一个给bl2解析fip.bin用的一个表
此特性替换了以前硬件编码的查找,即后续启动镜像地址组织更加容易更改
这里继续说一些他的注意事项:
这个文件的组织形式比较单一,包含三个东西:首地址,大小和id。主要是说明镜像地址和ddr
这个文件是独立于tf-a的设备树的,其位于tfa源码fdts文件夹内,内容示例如下:
#define DDR_SIZE 0x20000000 /* 512MB */
#include "stm32mp15-fw-config.dtsi"
可见只包含了对ddr——size的声明和一个stm32mp15通用的fwconfig
下面分析一下stm32mp15-fw-config.dtsi:
#ifndef DDR_SIZE
#error "DDR_SIZE is not defined"
#endif
这里是刚才dk-fwconfig里定义的
然后是根据是否选择optee来进行一些条件编译
#ifdef AARCH32_SP_OPTEE
/* OP-TEE secure memory: located at DDR top */
#define DDR_SEC_SIZE STM32MP_DDR_S_SIZE
#define DDR_SEC_BASE (STM32MP_DDR_BASE + (DDR_SIZE - DDR_SEC_SIZE))
#define DDR_NS_SIZE (DDR_SEC_BASE - DDR_NS_BASE)
#else /* !AARCH32_SP_OPTEE */
#define DDR_NS_SIZE DDR_SIZE
#endif /* AARCH32_SP_OPTEE */
里面的一些定义可以在plat/st/stm32mp1/include/plat_tbbr_img_def.h 找到
这里我删除了使用optee部分的代码,假设我们使用sp_min
/ {
dtb-registry {
compatible = "fconf,dyn_cfg-dtb_registry";
hw-config {
load-address = <0x0 STM32MP_HW_CONFIG_BASE>;
max-size = <STM32MP_HW_CONFIG_MAX_SIZE>;
id = <HW_CONFIG_ID>;
};
nt_fw {
load-address = <0x0 STM32MP_BL33_BASE>;
max-size = <STM32MP_BL33_MAX_SIZE>;
id = <BL33_IMAGE_ID>;
};
tos_fw {
load-address = <0x0 STM32MP_BL32_BASE>;
max-size = <STM32MP_BL32_SIZE>;
id = <BL32_IMAGE_ID>;
};
tos_fw-config {
load-address = <0x0 STM32MP_BL32_DTB_BASE>;
max-size = <STM32MP_BL32_DTB_SIZE>;
id = <TOS_FW_CONFIG_ID>;
};
};
st-mem-firewall {
compatible = "st,mem-firewall";
memory-ranges = <
DDR_NS_BASE DDR_NS_SIZE TZC_REGION_S_NONE TZC_REGION_NSEC_ALL_ACCESS_RDWR>;
};
};
其中 id可以看下表:
#define FW_CONFIG_ID U(1)
#define HW_CONFIG_ID U(2)
#define GPT_IMAGE_ID U(3)
#define ENC_IMAGE_ID U(6)
#define BL32_EXTRA1_IMAGE_ID U(8)
#define BL32_EXTRA2_IMAGE_ID U(9)
#define FWU_METADATA_IMAGE_ID U(12)
#define BKUP_FWU_METADATA_IMAGE_ID U(13)
#define TOS_FW_CONFIG_ID U(16)
#define STM32MP_CONFIG_CERT_ID U(17)