stm32mp1 tf-a编译 v2.8.6

记录下自己编译tf-a的过程,6.0目前市面上的教程文档还比较少,正点原子的教程是4.x版本,有些新特性不支持

首先是安装sdk部分,这个内容可以参考st官网进行配置

STM32MP1 Developer Package - stm32mpu

别忘了source一下你sdk目录的

/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

下面介绍一下stm32mp1编译需要的一些文件

bl2:这里需要编译出tf-a.stm32即可,其设备树已位于其bin镜像的后面

        另外这里需要编译出一个serialboot版本,用于cubeprogrammer的烧录

fw_config:位于fip包里,用于表述fip包内部的情况以及ddr等信息此为设备树格式,dts文件位于tf-a的fdts的fw-config.dts

bl32.bin:bl32阶段的固件,可选optee以及sp_min 这里我们选spmin。

bl33:uboot的bin文件

        此外还需要bl33里的dtb文件,即uboot的设备树文件

下面开始正式的试图编译tf-a

首先解压文件 tar xvf en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz

随后进入里面的文件夹mv arm-ostl-linux-gnueabi/ ~/temp

可以看到其里面文件结构如下,这里先进入tf-a源码

先解压里面的压缩包

然后进入解压好的文件打补丁

for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

会看到如下图所示的输出,此时补丁就打好了

说一下里面几个文档的位置

fdts:存放用于tf-a的dtb,以及存放fwconfig的dtb文件(以fw——config为后缀)

创建自己的设备树,我的板子是正点原子的板子,芯片为stm32mp157daa

但是为了验证我自己的板子的固件,这里采用mp157d-dk1作为蓝本

将自己板子的设备树文件放入,包含dts文件,dtsi文件以及fwconfig.dts

这里省略了设备树文件怎么编写,主要记录一套可行的编译过程

随后开始编译:

首先这里按照官网要求试图编译一下sp_min

make  PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \
    AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157d-fc.dtb bl32 dtbs

可以看到有报错:relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC

根据他的要求,我们添加CFLAGS="$CFLAGS -fPIC"

make  PLAT=stm32mp1 ARCH=aarch32 CFLAGS="$CFLAGS -fPIC" ARM_ARCH_MAJOR=7 \
    AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157d-fc.dtb bl32 dtbs

这里注意要先clean

make PLAT=stm32mp1 ARCH=aarch32 CFLAGS="$CFLAGS -fPIC" ARM_ARCH_MAJOR=7 AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157d-fc.dtb clean

make PLAT=stm32mp1 CORSS_COMPILE=arm-ostl-linux-gnueabi- ARCH=aarch32 CFLAGS="$CFLAGS -fPIC" ARM_ARCH_MAJOR=7 AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157d-fc.dtb dtbs bl32
这里能顺利通过编译

在build stm32mp1 release fdts里可以看到编译的设备树文件

bl32即sp——min已成功出现

下面开始编译tf-a本体以及其serialboot文件

因为我用的是sd卡作为boot设备,

尝试以下命令:

make CORSS_COMPILE=arm-ostl-linux-gnueabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \
    DTB_FILE_NAME=stm32mp157d-fc.dtb STM32MP_SDMMC=1

可以看到有生成文件

接下来我们尝试生成serialboot文件

make CORSS_COMPILE=arm-ostl-linux-gnueabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \
    DTB_FILE_NAME=stm32mp157d-fc.dtb STM32MP_USB_PROGRAMMER=1 STM32MP_SDMMC=1

可以看到正常生成了文件

编译结果的测试:

首先介绍cubeprogrammer

其需要一个基于tf-a的serialboot,用于启动fip-boot。

随后通过fip-boot的uboot像flash里刷数据

而构建fip.bin需要以下内容:

make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \
    AARCH32_SP=sp_min \
    DTB_FILE_NAME=stm32mp157c-ev1.dtb \
    BL33=<u-boot_directory>/u-boot-nodtb.bin \
    BL33_CFG=<u-boot_directory>/u-boot.dtb \
    fip

可以看到需要bl33以及bl33的bin,这里我们并没有,所以使用另外的渠道进行刷写

这里借用了正点原子官方的包,其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    mmc0    0x4400    tf-a-stm32mp157d-fc.stm32
P    0x05    fsbl2    Binary    mmc0    0x44400    tf-a-stm32mp157d-fc.stm32
PE    0x06    metadata1    Binary    mmc0    0x84400    metadata.bin
PE    0x07    fip-a    FIP    mmc0    0x000C4400    fip.bin
PE    0x21    boot    System    mmc0    0x00280000    bootfs.ext4
PE    0x22    rootfs    FileSystem    mmc0    0x04280000    rootfs.ext4
 

出现报错,正点原子旧版本的boot无法刷fip文件,修改到如下所示

#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    mmc0    0x4400    tf-a-stm32mp157d-fc.stm32
P    0x05    fsbl2    Binary    mmc0    0x44400    tf-a-stm32mp157d-fc.stm32

随后成功刷入

连接serial进行测试:

切换拨码开关到101

可以看到输出结果并不完全,可能是设备树存在错误,但编译流程大体是正确的

进一步的debug和调试:为了找到为什么会出现这个问题,进行问题的探究

首先从设备树上找,这里因为正点原子提到是从ev1作为蓝本,我们首先编译一个ev1固件

观察到可以知道主要的原因还是pmic没更改,这里我们按照网上通用的教程将pmic删除

并在根节点下加入以下内容:

vddcore: regulator-vddcore {

        compatible = "regulator-fixed";

        regulator-name = "vddcore";

        regulator-min-microvolt = <1200000>;

        regulator-max-microvolt = <1350000>;

        regulator-off-in-suspend;

        regulator-always-on;

    };

    vdd: regulator-vdd {

        compatible = "regulator-fixed";

        regulator-name = "vdd";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-off-in-suspend;

        regulator-always-on;

    };

   

    v3v3: regulator-v3v3 {

        compatible = "regulator-fixed";

        regulator-name = "v3v3";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-off-in-suspend;

        regulator-always-on;

    };

       

    vdd_usb: regulator-vdd-usb {

        compatible = "regulator-fixed";

        regulator-name = "vdd_usb";

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

        regulator-off-in-suspend;

        regulator-always-on;

    };

随后更改sd卡的配置,根据教程

&sdmmc1 { pinctrl-names = "default"; pinctrl-0 = <&sdmmc1_b4_pins_a>; disable-wp; st,neg-edge; bus-width = <4>; vmmc-supply = <&vdd_sd>; status = "okay"; };

随后重写编译

编译出来还是报错

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

文章将会持续更新,一方面记录我的操作过程以便复现,另一方面也供大家参考。

本人已购买官方dk1主板,还有自己绘制的主板,等板子到了会对比哪里出问题

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值