How to Add a New Flatform
OPTEE开发的第一步是增加所使用SoC的支持。这里分两种情况,一种是已经有同类SoC的支持,只是做一些差异化配置,OPTEE叫做platform flavor;一种则是一个全新的platform。学会怎么增加一个platform,platform flavor自然不在话下。
增加一个全新的platform的支持,需要在[OPTEE root path]/core/arch/arm(riscv)/下新建一个以plat-作为prefix的文件夹,例如plat-my_soc_name,或者plat-my_orgnization_name。目录下的主要文件为:
1
conf.mk sub.mk platform_config.h main.c
- conf.mk
这个文件主要包含两个内容,一个是OPTEE的配置选项, 另一个是编译选项。
配置选项有两种写法,开发者可以根据需求选择方式。- CFG_SOMETHING ?= DEFAULT_VALUE // may be overridden by external setup
- $(call force,CFG_SOMETHING,SPECIFIED_VALUE) // can’t be modified
配置选项主要有下面这些:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
PLATFORM_FLAVOR // default platform flavor CFG_TEE_CORE_NB_CORE // number of cores CFG_GENERIC_BOOT // seems not used CFG_WITH_ARM_TRUSTED_FW // shall be set to y if using armv8 CFG_WITH_LPAE // long descriptor translation format. shall be y if armv8 CFG_NUM_THREADS // shall >= CFG_TEE_CORE_NB_CORE for efficiency CFG_CRYPTO_WITH_CE // set to y to use cropto-extention CFG_GIC // default use gic v2 if arm CFG_ARM_GICV3 // set to y to enable arm gic v3 CFG_CORE_ASLR // address space layout randomization CFG_CORE_PREALLOC_EL0_TBLS // set to y if you gonna map large amount of memory to TA CFG_CORE_RODATA_NOEXEC // page aligned so system can easy set MMU properties to non-executable CFG_WITH_STACK_CANARIES // add stack guards before/after stacks and periodically check them CFG_TZDRAM_START // start of OPTEE Core seucre memory CFG_TZDRAM_SIZE // size of OPTEE Core seucre memory CFG_SHMEM_START // start of non-secure static SHM CFG_SHMEM_SIZE // size of non-secure static SHM CFG_SECURE_DATA_PATH // enable secure data path CFG_8250_UART CFG_16550_UART CFG_PL011 // choose one if your SoC use one of them. Otherwise, write a new one
OPTEE还有很多optional的配置,作为基础配置,上面列的这些应该比较全了。
编译选项目前主要就是include core/arch/arm/cpu/xxx.mk。貌似没有更多选项。 - platform_config.h
这个文件是创建一个platform必须的,可以拿现有项目中的作为参考。 比如core/arch/arm/plat-hikey中的一些选项。1 2 3 4 5 6 7 8
STACK_ALIGNMENT // cache line aligned TEE_RAM_START // set to CFG_TZDRAM_START DRAM0_BASE // ddr base address which optee can access DRAM0_SIZE // size of ddr which optee can access UART BASE ADDRESS UART BAUDRATE UART CLK IN HZ // used to caculate the divider GIC BASE ADDRESS
和platform flavor相关的一些配置也可以放在platform_config.h里,如果很多,建议分成另外一个文件,比如platform_config_flavor_xxx.h,然后在platform_config.h中include。
- sub.mk
当OPTEE的编译脚本根据指定的PLATFORM=my_platform找到相应的core/arch/arm/plat-my_platform目录后,sub.mk就会被include。它里面一般包含以下内容:- 编译当前PLATFORM和PLATFORM_FLAVOR需要的source file
- 头文件路径
- subdir,当然subdir下也要有相应的sub.mk
- main.c
大概是OPTEE的开发者约定把该platform的入口函数定义在main.c中,因为该文件由sub.mk加入编译,其实可以命名为你想要的名字。该文件中需要实现的function可能如下:- IO space, DDR space等的注册
- GIC的初始化
- UART初始化和注册
- 其他相关硬件的初始化
这样创建好目录,写好以上四个文件,OPTEE基本上就可以在SoC上运行了。
This post is licensed under CC BY 4.0 by the author.