记录下自己编译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主板,还有自己绘制的主板,等板子到了会对比哪里出问题