STM32MP157 tf-a2.6移植


参考母板是STM32MP157D-DK1开发板,移植开发板为100ASK_STM32MP157_V11。

  1. STM32MP157 tf-a2.6 optee3.16 u-boot2021.10 linux5.15移植
  2. STM32MP157启动流程
  3. STM32MP157 tf-a2.6移植
  4. STM32MP157 optee3.16移植
  5. STM32MP157 u-boot2021.10移植
  6. STM32MP157 linux5.15移植
  7. STM32MP157 buildroot-2022.02.5构建根文件系统

1. 初次编译

解压之前准备好的源码,并打好补丁文件。可以参考README.HOW_TO.txt文件,里面说了怎么解压和打补丁,并且还说了如何编译。

#解压源码
$ tar -xvf 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

解压好源码,我们在源码目录执行以下命令完成编译。DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware是TF-A编译结果存放的目录,如果不设置就会在上一级产生deploy目录存放编译结果,同级目录下生成的build目录存放编译中间文件。

#设置编译器
$ source ../../../../toolchain/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
#设置FIP目录
$ export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts
#编译
$ make -f $PWD/../Makefile.sdk DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware -j12 all
$ make -f $PWD/../Makefile.sdk -j12 all

由于官方源码支持很多开发板,我们只留参考母板STM32MP157D-DK1,删除其他开发板。修改Makefile.sdk文件,让其只编译STM32MP157D-DK1。只需删除TF_A_DEVICETREE_xxxx变量中非stm32mp157d-dk1的开发板即可,然后删除FIP_artifacts/arm-trusted-firmware目录下的所有文件从新编译。

2. 移植

2.1 添加自己的板子

进入fdts拷贝stm32mp157d-dk1.dtsstm32mp157d-dk1-fw-config.dtsstm32mp157d-100ask.dtsstm32mp157d-100ask-fw-config.dts,拷贝stm32mp15xx-dkx.dtsistm32mp15xx-100ask.dtsi,拷贝stm32mp15-ddr3-2x4Gb-1066-binG.dtsistm32mp15-ddr3-2x2Gb-1066-binG.dtsi,完成移植所有的文件创建。

$ cd fdts
$ cp stm32mp157d-dk1.dts stm32mp157d-100ask.dts
$ cp stm32mp157d-dk1-fw-config.dts stm32mp157d-100ask-fw-config.dts
$ cp stm32mp15xx-dkx.dtsi stm32mp15xx-100ask.dtsi
$ cp stm32mp15-ddr3-2x4Gb-1066-binG.dtsi stm32mp15-ddr3-2x2Gb-1066-binG.dtsi

做简单的修改然后进行编译,修改stm32mp157d-100ask.dts文件

13 #include "stm32mp15xx-dkx.dtsi"
//改为
13 #include "stm32mp15xx-100ask.dtsi"

17 model = "STMicroelectronics STM32MP157D-DK1 Discovery Board";
18 compatible = "st,stm32mp157d-dk1", "st,stm32mp157";
//改为
17 model = "STMicroelectronics STM32MP157D-100ASK Discovery Board";
18 compatible = "st,stm32mp157d-100ask", "st,stm32mp157";

修改stm32mp15xx-100ask.dtsi文件

9 #include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
//改为
9 #include "stm32mp15-ddr3-2x2Gb-1066-binG.dtsi"

Makefile.sdk文件中添加自己的板子,在TF_A_DEVICETREE_opteeTF_A_DEVICETREE_trustedTF_A_DEVICETREE_emmcTF_A_DEVICETREE_sdcardTF_A_DEVICETREE_uartTF_A_DEVICETREE_usb中添加自己的板子stm32mp157d-100ask,然后编译。下面是因为uboot没有我们的板子,要生成FIP找不到文件,FIP已经生成了我们板子的文件。
在这里插入图片描述

2.2 修改设备树

移植过程设备树也不是一次性就修改好的,是需要反复修改运行解决问题。特别是TF-A的移植,因为TF-A的SP-MIN是要和U-Boot打包在一起的,需要U-Boot的移植。但是这里我们就一次性对设备树进行修改,无法重现移植过程。

2.2.1 修改串口Uart

100ASK_STM32MP157_V11开发板的串口和参考母板的串口都使用的是uart4,但是用的引脚不同。在stm32mp157d-100ask.dts文件中引用pinctrl节点,在其下追加uart4_pins_d整个节点。

//在stm32mp157d-100ask.dts文件最后追加如下代码
&pinctrl {
	uart4_pins_d: uart4-3 {
		pins1 {
			pinmux = <STM32_PINMUX('A', 11, AF6)>; /* UART4_RX */
			bias-disable;
		};
		pins2 {
			pinmux = <STM32_PINMUX('A', 12, AF6)>; /* UART4_TX */
			bias-disable;
			drive-push-pull;
			slew-rate = <0>;
		};
	};
};

修改uart4对引脚的配置,把uart4_pins_a改为uart4_pins_d

//修改stm32mp15xx-100ask.dtsi文件
&uart4 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart4_pins_a>;
	status = "okay";
};
//改为
&uart4 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart4_pins_d>;
	status = "okay";
};

2.2.2 修改时钟

由于我们参考的官方母板采用的是有源晶振,100ASK_STM32MP157_V11开发板采用了无源晶振。上图是官方晶振原理图,下图为100ASK_STM32MP157_V11开发板原理图。
在这里插入图片描述

在这里插入图片描述

//删除stm32mp15xx-100ask.dtsi文件如下代码
&clk_hse {
	st,digbypass;
};

2.2.3 修改电源

由于我们参考的官方母板使用了STPMIC1电源管理芯片,但是100ASK_STM32MP157_V11开发板没有使用电源管理芯片,使用的是固定电源。我们需要删除STPMIC1相关的东西,然后添加一些固定电源域完善设备树。

//修改stm32mp15xx-100ask.dtsi文件

/ {
	memory@c0000000 {
		device_type = "memory";
		reg = <0xc0000000 0x20000000>;
	};

	vin: vin {
		compatible = "regulator-fixed";
		regulator-name = "vin";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-always-on;
	};

	//此处添加以下这些固定电源域
	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;
	};
};

&i2c4 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c4_pins_a>;
	i2c-scl-rising-time-ns = <185>;
	i2c-scl-falling-time-ns = <20>;
	clock-frequency = <400000>;
	status = "okay";
/* 删除这部分注释代码
	pmic: stpmic@33 {
		compatible = "st,stpmic1";
		reg = <0x33>;
		interrupts-extended = <&exti_pwr 55 IRQ_TYPE_EDGE_FALLING>;
		interrupt-controller;
		#interrupt-cells = <2>;
		status = "okay";

		regulators {
			// 此处代码已省略
		};
	};
*/
};

/* 删除以下这些节点
&v1v2_hdmi {
	// 此处代码已省略
};

&v1v8_audio {
	// 此处代码已省略
};

&v3v3 {
	// 此处代码已省略
};

&v3v3_hdmi {
	// 此处代码已省略
};

&vdd {
	// 此处代码已省略
};

&vdda {
	// 此处代码已省略
};

&vddcore {
	// 此处代码已省略
};

&vdd_ddr {
	// 此处代码已省略
};

&vdd_usb {
	// 此处代码已省略
};

&vref_ddr {
	// 此处代码已省略
};

&vtt_ddr {
	// 此处代码已省略
};
*/

修改完电源,ST官方比较推荐使用自家的的电源管理芯片,并没有考虑到我们这种用法。他提供的源码固定电源域的个数是2,我们加上原来vin是五个固定电源域,所以需要修改源码。

//修改plat/st/stm32mp1/stm32mp1_def.h

650 /* 2 FIXED */
651 #define PLAT_NB_FIXED_REGS		U(2)
//改为
650 /* 2 FIXED */
651 #define PLAT_NB_FIXED_REGS		U(6)

2.2.4 修改DDR

内存的修改使用STM32CubeMX生成的设备树,打开STM32CubeMX,新建一个STM32MP157A-DK1开发板的一个工程,点击System view找到DDR单击,目标板是两个16位组成32位所以选择位宽32bits,选择大小4Gb,点击Project Manager选择项目存储位置,然后生成代码。复制生成代码到stm32mp15-ddr3-2x2Gb-1066-binG.dtsi中,注意最后一行包含一个头文件。这里直接附上修改好的代码。

/*
 * Copyright (C) 2015-2018, STMicroelectronics - All Rights Reserved
 *
 * SPDX-License-Identifier:	GPL-2.0+	BSD-3-Clause
 *
 */

/*
 * File generated by STMicroelectronics STM32CubeMX DDR Tool for MPUs
 * DDR type: DDR3 / DDR3L
 * DDR width: 32bits
 * DDR density: 4Gb
 * System frequency: 533000kHz
 * Relaxed Timing Mode: false
 * Address mapping type: RBC
 *
 * Save Date: 2022.08.28, save Time: 00:42:46
 */

#define DDR_MEM_NAME	"DDR3-DDR3L 32bits 533000kHz"
#define DDR_MEM_SPEED	533000
#define DDR_MEM_SIZE	0x20000000

#define DDR_MSTR 0x00040401
#define DDR_MRCTRL0 0x00000010
#define DDR_MRCTRL1 0x00000000
#define DDR_DERATEEN 0x00000000
#define DDR_DERATEINT 0x00800000
#define DDR_PWRCTL 0x00000000
#define DDR_PWRTMG 0x00400010
#define DDR_HWLPCTL 0x00000000
#define DDR_RFSHCTL0 0x00210000
#define DDR_RFSHCTL3 0x00000000
#define DDR_RFSHTMG 0x0081008B
#define DDR_CRCPARCTL0 0x00000000
#define DDR_DRAMTMG0 0x121B2414
#define DDR_DRAMTMG1 0x000A041C
#define DDR_DRAMTMG2 0x0608090F
#define DDR_DRAMTMG3 0x0050400C
#define DDR_DRAMTMG4 0x08040608
#define DDR_DRAMTMG5 0x06060403
#define DDR_DRAMTMG6 0x02020002
#define DDR_DRAMTMG7 0x00000202
#define DDR_DRAMTMG8 0x00001005
#define DDR_DRAMTMG14 0x000000A0
#define DDR_ZQCTL0 0xC2000040
#define DDR_DFITMG0 0x02060105
#define DDR_DFITMG1 0x00000202
#define DDR_DFILPCFG0 0x07000000
#define DDR_DFIUPD0 0xC0400003
#define DDR_DFIUPD1 0x00000000
#define DDR_DFIUPD2 0x00000000
#define DDR_DFIPHYMSTR 0x00000000
#define DDR_ODTCFG 0x06000600
#define DDR_ODTMAP 0x00000001
#define DDR_SCHED 0x00000C01
#define DDR_SCHED1 0x00000000
#define DDR_PERFHPR1 0x01000001
#define DDR_PERFLPR1 0x08000200
#define DDR_PERFWR1 0x08000400
#define DDR_DBG0 0x00000000
#define DDR_DBG1 0x00000000
#define DDR_DBGCMD 0x00000000
#define DDR_POISONCFG 0x00000000
#define DDR_PCCFG 0x00000010
#define DDR_PCFGR_0 0x00000000
#define DDR_PCFGW_0 0x00000000
#define DDR_PCFGQOS0_0 0x02100C03
#define DDR_PCFGQOS1_0 0x00800100
#define DDR_PCFGWQOS0_0 0x01100C03
#define DDR_PCFGWQOS1_0 0x01000200
#define DDR_PCFGR_1 0x00000000
#define DDR_PCFGW_1 0x00000000
#define DDR_PCFGQOS0_1 0x02100C03
#define DDR_PCFGQOS1_1 0x00800040
#define DDR_PCFGWQOS0_1 0x01100C03
#define DDR_PCFGWQOS1_1 0x01000200
#define DDR_ADDRMAP1 0x00080808
#define DDR_ADDRMAP2 0x00000000
#define DDR_ADDRMAP3 0x00000000
#define DDR_ADDRMAP4 0x00001F1F
#define DDR_ADDRMAP5 0x07070707
#define DDR_ADDRMAP6 0x0F0F0707
#define DDR_ADDRMAP9 0x00000000
#define DDR_ADDRMAP10 0x00000000
#define DDR_ADDRMAP11 0x00000000
#define DDR_PGCR 0x01442E02
#define DDR_PTR0 0x0022AA5B
#define DDR_PTR1 0x04841104
#define DDR_PTR2 0x042DA068
#define DDR_ACIOCR 0x10400812
#define DDR_DXCCR 0x00000C40
#define DDR_DSGCR 0xF200011F
#define DDR_DCR 0x0000000B
#define DDR_DTPR0 0x38D488D0
#define DDR_DTPR1 0x098B00D8
#define DDR_DTPR2 0x10023600
#define DDR_MR0 0x00000840
#define DDR_MR1 0x00000000
#define DDR_MR2 0x00000208
#define DDR_MR3 0x00000000
#define DDR_ODTCR 0x00010000
#define DDR_ZQ0CR1 0x00000038
#define DDR_DX0GCR 0x0000CE81
#define DDR_DX1GCR 0x0000CE81
#define DDR_DX2GCR 0x0000CE81
#define DDR_DX3GCR 0x0000CE81

#include "stm32mp15-ddr.dtsi"

2.2.5 修改EMMC

100ASK_STM32MP157_V11开发板设计有EMMC,dk1开发板只有SD card,需要添加EMMC设备。

//在stm32mp15xx-100ask.dtsi文件中添加如下代码
&sdmmc2 {
        pinctrl-names = "default";
        pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
        non-removable;
        no-sd;
        no-sdio;
        st,neg-edge;
        bus-width = <8>;
        vmmc-supply = <&v3v3>;
        vqmmc-supply = <&v3v3>;
        mmc-ddr-3_3v;
        status = "okay";
};

3. 编译下载

3.1 编译

由于TF-A的SP-MIN是被TF-A的BL2加载并运行的,STM32MP157使用了FIP将BL32(SP-MIN)和BL33(U-Boot)打包在一起,我们需要复制一份U-Boot改成自己的开发板。

#进入FIP目录下的u-boot目录
$ cd ../../FIP_artifacts/u-boot/
#复制U-boot
$ cp u-boot-stm32mp157d-dk1-trusted.dtb u-boot-stm32mp157d-100ask-trusted.dtb
#返回TF-A源码目录
$ cd ../../tf-a-stm32mp-v2.6-stm32mp1-r1-r0/tf-a-stm32mp-v2.6-stm32mp1-r1/
#编译
$ make -f $PWD/../Makefile.sdk DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware -j12 all

可以看到optee还是原来的错误,但是tfa已经没有错误了,在FIP_artifacts/fip目录中生成了fip-stm32mp157d-100ask-trusted.bin
在这里插入图片描述

3.2 下载

参考stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15/images/stm32mp1/flashlayout_st-image-weston目录中的烧录脚本,我们串行启动TF-A进行调试。在FIP_artifacts目录中新建一个FlashLayout存放烧写脚本,烧写的时候可以复制整个FIP_artifacts到主机,也可以共享文件夹。新建FlashLayout_emmc_stm32mp157d-100ask-trusted.tsv脚本,注意烧写脚本的分割符只能用Tab符号,脚本的规则可以去官网WiKi详细了解。

#Opt	Id		Name		Type		IP		Offset		Binary
-		0x01	fsbl-boot	Binary		none	0x0			arm-trusted-firmware/tf-a-stm32mp157d-100ask-usb.stm32
-		0x03	fip-boot	FIP			none	0x0			fip/fip-stm32mp157d-100ask-trusted.bin

用STM32CubeProg打开烧写脚本,注意二进制文件把目录设置FIP_artifacts目录,设置好板子并连接OTG和串口,点击下载。板子一直重启,那是因为U-boot不对。从串口打印信息上可以看到BL2把BL32(SP-MIN)启动起来,SP-MIN正常运行,最终U-Boot启动。
在这里插入图片描述
在这里插入图片描述

4. 总结

我们只要顺着源码设计者的思路,去添加或修改,事情就会变得简单。修改我们自己代码能解决的问题,最好不行去修改源码,这样可能导致其它板子异常。这些代码只启动板子,其他功能问题并没有解决。

学习笔记仅供参考,欢迎指正错误,如有侵权请及时联系。移植源码获取:

git clone https://github.com/Sonboy97/arm-ostl-linux-gnueabi.git
版本:9ae04fa8dbea4c984243179d1faa6e39cd18d2dd
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonboy哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值