本帖最后由 1203385078 于 2022-10-18 10:44 编辑
正点原子stm32mp157开发板linux5.15移植带optee 在stm32官网下载以下文件: en.FLASH-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz en.SOURCES-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz
解压en.FLASH-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz文件,可以看到stm32官方对分区的定义:
解压en.SOURCES-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17_tar.xz文件会得到源码文件。 解压安装en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz可以得到一些必要的工具,比如fiptool-stm32mp和fiptool。
注意:如果不安装使用en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz,使用gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz等arm-none-linux-gnueabihf编译,需要更改tfa、uboot等Makefile.sdk文件的编译器指定,这个正点原子的移植文档有说明,不做赘述。
本教程参考stm32官方wiki编译自定义设备树教程
解压源码后,我复制了一份到另一个目录,并使用git管理,方便查看修改记录,目录结构如下:
1. Tf-a 准备源码: tar xf tf-a-stm32mp-v2.6-stm32mp1-r1-r0.tar.xz cd tf-a-stm32mp-v2.6-stm32mp1-r1 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
准备设备树: cp stm32mp157d-ed1.dts stm32mp157d-stm32.dts cp stm32mp15xx-edx.dtsi stm32mp157d-stm32.dtsi cp stm32mp157d-ed1-fw-config.dts stm32mp157d-stm32-fw-config.dts
按照正点原子的教程修改tfa设备树,修改完成后, 再修改一个宏定义: tf-a-stm32mp-v2.6-stm32mp1-r1-r0/tf-a-stm32mp-v2.6-stm32mp1-r1/plat/st/stm32mp1/stm32mp1_def.h 中的 #define PLAT_NB_FIXED_REGS U(1) 改为 #define PLAT_NB_FIXED_REGS U(12) 这里12是随便写的,只要大于你的设备树电源regulator-fixed的个数就行。 执行以下命令编译: cd tf-a-stm32mp-v2.6-stm32mp1-r1 export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts make -f ../Makefile.sdk TF_A_DEVICETREE=stm32mp157d-stm32 TF_A_CONFIG="optee emmc nand nor sdcard uart usb" DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware stm32 metadata
注意:编译指令参数比官方多了一个metadata,是用来生成metadata.bin,要继续修改uboot和optee才能编译,直接编译会提示缺少一些文件,先跳过此处编译。
2. Uboot 准备源码: tar xf u-boot-stm32mp-v2021.10-stm32mp1-r1-r0.tar.xz cd u-boot-stm32mp-v2021.10-stm32mp1-r1 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
按照正点原子的教程修改设备树,修改完成后编译: cd u-boot-stm32mp-v2021.10-stm32mp1-r1
export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts
make -f ../Makefile.sdk UBOOT_CONFIG=trusted UBOOT_DEFCONFIG=stm32mp15_defconfig UBOOT_BINARY=u-boot.dtb FIP_CONFIG="optee" DEVICETREE="stm32mp157d-stm32" all
注意:请先等optee修改完成再编译。 3. Optee 解压文件: tar xf optee-os-stm32mp-3.16.0-stm32mp1-r1-r0.tar.xz cd optee-os-stm32mp-3.16.0-stm32mp1-r1 tar xfz ../fonts.tar.gz for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
修改设备树可以按照tfa修改。
补充:在optee-os-stm32mp-3.16.0-stm32mp1-r1-r0/optee-os-stm32mp-3.16.0-stm32mp1-r1/core/drivers/regulator/regulator_fixed.c 文件中 19 行改成: #define FIXED_REGULATOR_NAME_LEN 32 这个看名称是电源节点名称长度,默认的长度16不够,改成32,这个数值没什么特别的,你可以改成其他的。
编译: cd optee-os-stm32mp-3.16.0-stm32mp1-r1 export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts make -f ../Makefile.sdk CFG_EMBED_DTB_SOURCE_FILE=stm32mp157d-stm32 OPTEE_DRAMSIZE=0x40000000 DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/optee optee
说明:官方OPTEE_DRAMSIZE给的是0x20000000,我们的板子是1G的dram,所以应该写0x40000000。 可以编译tfa、uboot和optee了,注意这些是有顺序的,应该先编译optee,再tfa,最后uboot。
4. Kernel 准备源码: tar xfJ linux-5.15.24.tar.xz cd linux-5.15.24 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done make ARCH=arm multi_v7_defconfig fragment*.config
for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done yes '' | make ARCH=arm oldconfig
按照正点原子的教程修改内核设备树,修改完成后添加设备树到makefile文件,编译:
cd linux-5.15.24 make ARCH=arm -j4 uImage vmlinux dtbs LOADADDR=0xC2000040 make ARCH=arm -j4 modules
5. 烧写 在en.FLASH-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15.tar.xz中找到FlashLayout_emmc_stm32mp157d-ev1-optee.tsv文件,修改内容如下: #Opt Id Name Type IP Offset Binary - 0x01 fsbl-boot Binary none 0x0 arm-trusted-firmware/tf-a-stm32mp157d-stm32-usb.stm32 - 0x03 fip-boot FIP none 0x0 fip/fip-stm32mp157d-stm32-optee.bin P 0x04 fsbl1 Binary mmc1 boot1 arm-trusted-firmware/tf-a-stm32mp157d-stm32-emmc.stm32 P 0x05 fsbl2 Binary mmc1 boot2 arm-trusted-firmware/tf-a-stm32mp157d-stm32-emmc.stm32 P 0x06 metadata1 Binary mmc1 0x00080000 arm-trusted-firmware/metadata.bin P 0x07 metadata2 Binary mmc1 0x00100000 arm-trusted-firmware/metadata.bin P 0x08 fip-a FIP mmc1 0x00180000 fip/fip-stm32mp157d-stm32-optee.bin PED 0x09 fip-b FIP mmc1 0x00580000 none PED 0x0A u-boot-env Binary mmc1 0x00980000 none P 0x10 bootfs System mmc1 0x00A00000 boot/bootfs.ext4 P 0x11 rootfs FileSystem mmc1 0x04A00000 rootfs.ext4
文件系统rootfs可以用以前编译好的buildroot文件系统,内核文件按照正点原子的教程制作bootfs,tfa、uboot、optee编译后烧录的文件位置如下,由export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts指定:
Uboot设置启动参数: mmc: setenv bootcmd 'ext4load mmc 1:6 c2000000 uImage;ext4load mmc 1:6 c4000000 stm32mp157d-stm32.dtb;bootm c2000000 - c4000000' setenv bootargs 'console=tty1 console=ttySTM0,115200 root=/dev/mmcblk2p7 rootwait rw'
保存: saveenv
启动: uboot默认取消了boot指令,直接按复位即可
RGB屏幕依然无法正常显示,/sys/class/drm/ 目录下没有设备,但是触摸是可以的,HDMI接口可正常工作。
大致流程就是这样,可以对比stm32官方的wiki,一步一步的理解,设备树等文件如下: |