【STM32MP135 - ST官方源码移植】第二章:TF-A源码移植教程

STM32MP135 TF-A源码移植教程

  • 一、创建build.sh编译脚本
    • (1)解压tf-a的源码压缩包
    • (2)打补丁,获取stm32mp135的源码
    • (3)设计编译脚本build.sh
      • 1、进入tf-a源码:
      • 2、创建build.sh脚本文件
      • 3、编辑build.sh脚本
  • 二、修改TF-A源码
    • 1、创建设备树
    • 2、修改源码:fdts/stm32mp135d-mini.dts
      • (1)修改pinctrl头文件路径
      • (2)修改model和compatible属性
      • (3)删除不需要用到的uart节点
      • (4)修改设备树电源管理
      • (5)修改EMMC设备
      • (6)删除时钟
      • stm32mp135d-mini.dts 源码
    • 3、修改源码:fdts/stm32mp13-pinctrl-mini.dtsi
      • (1)删除PMIC的IIC节点
      • (2)补充EMMC节点
      • (3)删除不需要用到的uart节点
      • stm32mp13-pinctrl-mini.dtsi 源码
    • 4、修改源码:fdts/stm32mp135d-mini-fw-config.dts
      • stm32mp135d-mini-fw-config.dts 源码
    • 5、修改源码:drivers/st/clk/clk-stm32mp13.c
      • clk-stm32mp13.c 修改的部分源码
  • 三、修改Makefile.sdk*
      • Makefile.sdk 源码

一、创建build.sh编译脚本

(1)解压tf-a的源码压缩包

源码压缩包的文件路径:/home/alientek/mp13x_pro/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.06.15/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-v2.6-stm32mp1-r1-r0
在这里插入图片描述

终端输入指令:

tar -xvf tf-a-stm32mp-v2.6-stm32mp1-r1-r0.tar.xz

解压完成:
在这里插入图片描述

(2)打补丁,获取stm32mp135的源码

终端输入指令:

cd tf-a-stm32mp-v2.6-stm32mp1-r1
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

在这里插入图片描述

打补丁完成:
在这里插入图片描述

(3)设计编译脚本build.sh

1、进入tf-a源码:

终端输入指令:

 cd tf-a-stm32mp-v2.6-stm32mp1-r1/

在这里插入图片描述

2、创建build.sh脚本文件

终端输入指令:

touch build.sh
chmod 777 build.sh

在这里插入图片描述

3、编辑build.sh脚本

终端输入指令:

vim build.sh

输入以下内容:

#!/bin/sh
# script-name: build.sh
# version: 1.0
# date: 2023-06-15
# author: wangjianquan

#删除上层目录的编译文件
rm ../build/ ../deploy/ -rf

#运行编译
make -f ../Makefile.sdk all

在这里插入图片描述

保存文件,按下键盘的Esc键,输入:wq!

二、修改TF-A源码

1、创建设备树

源码文件目录:tf-a-stm32mp-v2.6-stm32mp1-r1/fdts
终端执行命令:

cp stm32mp135d-dk.dts stm32mp135d-mini.dts
cp stm32mp13-pinctrl.dtsi stm32mp13-pinctrl-mini.dtsi
cp stm32mp135d-dk-fw-config.dts stm32mp135d-mini-fw-config.dts

解释:这里是以stm32mp135d-dk板子的官方源码为模板进行的移植,文件名中含有"mini"字样的都是我们接下来要进行源码处理的文件,也就是我们开发板的DIY源码!

2、修改源码:fdts/stm32mp135d-mini.dts

(1)修改pinctrl头文件路径

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:使我们新建的pinctrl文件在设备树中生效。

(2)修改model和compatible属性

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:model属性在tf-a启动时会被调用显示在串口输出打印消息里,调用文件:plat/st/stm32mp1/bl2_plat_setup.c;compatible属性用于platfrom的匹配,这个属性调用的文件数量较多,这里不一一列举,自行在源码文件夹中搜索。

(3)删除不需要用到的uart节点

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:板子是靠uart4进行串口通信的,其它串口我们可以预留到别的功能上!这里不建议大家使用别的uart进行串口通信,因为st官方设计的源码里面指定是使用uart4的,如果你换了别的uart,会加大你对源码修改的工作量。

(4)修改设备树电源管理

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述

解释:ST官方提供专用的PMIC(型号:STPMIC1A)成本太高,我设计的开发板里没有用到这个玩意,我也不建议大家去使用,毕竟1000片起订1.9美元/片!STPMIC1A 是一个 IIC 器件,所以也会存在IIC节点,这里我们直接删除。ST官方提供的tf-a、optee、uboot、linux kernel中都有关于这个PMIC使用的设备树配置,接下来的教程里,在设备树中我们都将涉及到取消与这个PMIC相关的配置的操作。

(5)修改EMMC设备

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:ST官方的源码里没有使用到sdmmc2(TF卡),所以这里补充上了sdmmc2的节点,这里没什么好说的。

(6)删除时钟

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:我的开发板上用到了有源晶振来代替从mp135芯片上获取的时钟分频,所以注释掉这个节点了,你可以试着注释掉这个节点,如果启动tf-a的时候报错了再恢复这个节点就行。

stm32mp135d-mini.dts 源码

// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright (C) STMicroelectronics 2022 - All Rights Reserved
 * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
 */

/dts-v1/;

#include <dt-bindings/clock/stm32mp13-clksrc.h>
#include "stm32mp135.dtsi"
#include "stm32mp13xd.dtsi"
#include "stm32mp13-ddr3-1x4Gb-1066-binF.dtsi"
#include "stm32mp13-pinctrl-mini.dtsi"

/ {
	model = "STM32MP135D-MINI Discovery Board";
	compatible = "st,stm32mp135d-mini", "st,stm32mp135";

	aliases {
		serial0 = &uart4;
	};

	chosen {
		stdout-path = "serial0:115200n8";
	};

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

	vddcore: regulator-vddcore {
        compatible = "regulator-fixed";
        regulator-name = "vddcore";
        regulator-min-microvolt = <1250000>;
        regulator-max-microvolt = <1250000>;
        regulator-off-in-suspend;
        regulator-always-on;
	};

	vddcpu: regulator-vddcpu {
		compatible = "regulator-fixed";
		regulator-name = "vddcpu";
		regulator-min-microvolt = <1350000>;
		regulator-max-microvolt = <1350000>;
        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: regulator-vdd {
		compatible = "regulator-fixed";
		regulator-name = "vdd";
		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;
	};
};

&bsec {
	board_id: board_id@f0 {
		reg = <0xf0 0x4>;
		st,non-secure-otp;
	};
};

&clk_hse {
	st,digbypass;
};

&cpu0 {
	cpu-supply = <&vddcpu>;
};

&hash {
	status = "okay";
};

&iwdg2 {
	timeout-sec = <32>;
	status = "okay";
};

&pwr_regulators {
	vdd-supply = <&vdd>;
	vdd_3v3_usbfs-supply = <&vdd_usb>;
};

&rcc {
	st,clksrc = <
		CLK_MPU_PLL1P
		CLK_AXI_PLL2P
		CLK_MLAHBS_PLL3
		CLK_CKPER_HSE
		CLK_RTC_LSE
		CLK_SDMMC1_PLL4P
		CLK_SDMMC2_PLL4P
		CLK_STGEN_HSE
		CLK_USBPHY_HSE
		CLK_I2C4_HSI
		CLK_USBO_USBPHY
		CLK_I2C12_HSI
		CLK_UART2_HSI
		CLK_UART4_HSI
	>;

	st,clkdiv = <
		DIV(DIV_AXI, 0)
		DIV(DIV_MLAHB, 0)
		DIV(DIV_APB1, 1)
		DIV(DIV_APB2, 1)
		DIV(DIV_APB3, 1)
		DIV(DIV_APB4, 1)
		DIV(DIV_APB5, 2)
		DIV(DIV_APB6, 1)
		DIV(DIV_RTC, 0)
	>;

	st,pll_vco {
		pll1_vco_1300Mhz: pll1-vco-1300Mhz {
			src = < CLK_PLL12_HSE >;
			divmn = < 2 80 >;
			frac = < 0x800 >;
		};

		pll2_vco_1066Mhz: pll2-vco-1066Mhz {
			src = < CLK_PLL12_HSE >;
			divmn = < 2 65 >;
			frac = < 0x1400 >;
		};

		pll3_vco_417_8Mhz: pll2-vco-417_8Mhz {
			src = < CLK_PLL3_HSE >;
			divmn = < 1 33 >;
			frac = < 0x1a04 >;
		};

		pll4_vco_600Mhz: pll2-vco-600Mhz {
			src = < CLK_PLL4_HSE >;
			divmn = < 1 49 >;
		};
	};

	/* VCO = 1300.0 MHz => P = 650 (CPU) */
	pll1:st,pll@0 {
		compatible = "st,stm32mp1-pll";
		reg = <0>;

		st,pll = < &pll1_cfg1 >;

		pll1_cfg1: pll1_cfg1 {
			st,pll_vco = < &pll1_vco_1300Mhz >;
			st,pll_div_pqr = < 0 1 1 >;
		};
	};

	/* VCO = 1066.0 MHz => P = 266 (AXI), Q = 266, R = 533 (DDR) */
	pll2:st,pll@1 {
		compatible = "st,stm32mp1-pll";
		reg = <1>;

		st,pll = < &pll2_cfg1 >;

		pll2_cfg1: pll2_cfg1 {
			st,pll_vco = < &pll2_vco_1066Mhz >;
			st,pll_div_pqr = < 1 1 0 >;
		};
	};

	/* VCO = 417.8 MHz => P = 209, Q = 24, R = 209 */
	pll3:st,pll@2 {
		compatible = "st,stm32mp1-pll";
		reg = <2>;

		st,pll = < &pll3_cfg1 >;

		pll3_cfg1: pll3_cfg1 {
			st,pll_vco = < &pll3_vco_417_8Mhz >;
			st,pll_div_pqr = < 1 16 1 >;
		};
	};

	/* VCO = 600.0 MHz => P = 50, Q = 10, R = 100 */
	pll4:st,pll@3 {
		compatible = "st,stm32mp1-pll";
		reg = <3>;

		st,pll = < &pll4_cfg1 >;

		pll4_cfg1: pll4_cfg1 {
			st,pll_vco = < &pll4_vco_600Mhz >;
			st,pll_div_pqr = < 11 59 5 >;
		};
	};
};

&rng {
	status = "okay";
};

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

&sdmmc2 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_b4_b7_pins_a &sdmmc2_clk_pins_a>;
    non-removable;
    st,neg-edge;
	mmc-ddr-3_3v;
 	no-1-8-v;
    bus-width = <8>;
    vmmc-supply = <&v3v3>;
    vqmmc-supply = <&v3v3>;
    status = "okay";
};

&uart4 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart4_pins_a>;
	status = "okay";
};

3、修改源码:fdts/stm32mp13-pinctrl-mini.dtsi

(1)删除PMIC的IIC节点

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:在设备树中删除了PMIC电源管理芯片的相关节点,这里做同步处理。

(2)补充EMMC节点

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:在设备树中补充了EMMC2节点,这里做同步处理。

(3)删除不需要用到的uart节点

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码

在这里插入图片描述
解释:在设备树中删除了uart初始化的节点信息,这里做同步处理。

stm32mp13-pinctrl-mini.dtsi 源码

// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
 * Author: Alexandre Torgue <alexandre.torgue@st.com>
 */
#include <dt-bindings/pinctrl/stm32-pinfunc.h>

&pinctrl {
	sdmmc1_b4_pins_a: sdmmc1-b4-0 {
		pins {
			pinmux = <STM32_PINMUX('C', 8, AF12)>, /* SDMMC1_D0 */
				 <STM32_PINMUX('C', 9, AF12)>, /* SDMMC1_D1 */
				 <STM32_PINMUX('C', 10, AF12)>, /* SDMMC1_D2 */
				 <STM32_PINMUX('C', 11, AF12)>, /* SDMMC1_D3 */
				 <STM32_PINMUX('D', 2, AF12)>; /* SDMMC1_CMD */
			slew-rate = <1>;
			drive-push-pull;
			bias-disable;
		};
	};

	sdmmc1_clk_pins_a: sdmmc1-clk-0 {
		pins {
			pinmux = <STM32_PINMUX('C', 12, AF12)>; /* SDMMC1_CK */
			slew-rate = <1>;
			drive-push-pull;
			bias-disable;
		};
	};

	sdmmc2_b4_pins_a: sdmmc2-b4-0 {
		pins {
			pinmux = <STM32_PINMUX('B', 14, AF10)>, /* SDMMC2_D0 */
				 <STM32_PINMUX('B', 15, AF10)>, /* SDMMC2_D1 */
				 <STM32_PINMUX('B', 3, AF10)>, /* SDMMC2_D2 */
				 <STM32_PINMUX('B', 4, AF10)>, /* SDMMC2_D3 */
				 <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
			slew-rate = <1>;
			drive-push-pull;
			bias-pull-up;
		};
	};

	sdmmc2_b4_b7_pins_a: sdmmc2-b4-b7-0 {
		pins {
			pinmux = <STM32_PINMUX('F', 0, AF10)>, /* SDMMC2_D4 */
				 <STM32_PINMUX('B', 9, AF10)>, /* SDMMC2_D5 */
				 <STM32_PINMUX('C', 6, AF10)>, /* SDMMC2_D6 */				 
				 <STM32_PINMUX('C', 7, AF10)>; /* SDMMC2_D7 */
			slew-rate = <1>;
			drive-push-pull;
			bias-pull-up;
		};
	};

	sdmmc2_clk_pins_a: sdmmc2-clk-0 {
		pins {
			pinmux = <STM32_PINMUX('E', 3, AF10)>; /* SDMMC2_CK */
			slew-rate = <1>;
			drive-push-pull;
			bias-pull-up;
		};
	};

	uart4_pins_a: uart4-0 {
		pins1 {
			pinmux = <STM32_PINMUX('D', 6, AF8)>; /* UART4_TX */
			bias-disable;
			drive-push-pull;
			slew-rate = <0>;
		};
		pins2 {
			pinmux = <STM32_PINMUX('D', 8, AF8)>; /* UART4_RX */
			bias-pull-up;
		};
	};
};

4、修改源码:fdts/stm32mp135d-mini-fw-config.dts

stm32mp135d-mini-fw-config.dts 源码

// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright (c) 2022, STMicroelectronics - All Rights Reserved
 */

#define DDR_SIZE	0x20000000 /* 512MB */
#include "stm32mp13-fw-config.dtsi"

解释:跟ST的开发板使用了同样的DDR,这里不需要什么改动。

5、修改源码:drivers/st/clk/clk-stm32mp13.c

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码
在这里插入图片描述
解释:在设备树中我们注释了clk节点,这里做对应的处理!

clk-stm32mp13.c 修改的部分源码

static void clk_oscillator_check_bypass(struct stm32_clk_priv *priv, int idx,
					bool digbyp, bool bypass)
{
	struct clk_oscillator_data *osc_data = clk_oscillator_get_data(priv, idx);
	struct stm32_clk_bypass *bypass_data = osc_data->bypass;
	uintptr_t address;

	if (bypass_data == NULL) {
		return;
	}

	address = priv->base + bypass_data->offset;
	if ((mmio_read_32(address) & RCC_OCENR_HSEBYP) &&
	    (!(digbyp || bypass))) {
		// panic();
	}
}

三、修改Makefile.sdk*

←(左侧):已修改的tf-a源码
→(右侧):未修改的tf-a源码
在这里插入图片描述

解释:编译我们为板子重新设计的设备树。
在这里插入图片描述

解释:修改编译器为arm-none-linux-gnueabihf。
在这里插入图片描述
解释:关闭tf-a的关联编译。

Makefile.sdk 源码

# Set default path
SRC_PATH ?= $(PWD)
BLD_PATH ?= $(SRC_PATH)/../build
DEPLOYDIR ?= $(SRC_PATH)/../deploy

BL32_DEPLOYDIR     ?= $(DEPLOYDIR)/bl32
FWCONFIG_DEPLOYDIR ?= $(DEPLOYDIR)/fwconfig

# Configure default TF-A features
TF_A_ENABLE_DEBUG_WRAPPER ?= 0

# Set default TF-A config
TF_A_CONFIG ?=  optee emmc sdcard usb

# Default TF-A overall settings to null
TF_A_BINARY ?=
TF_A_DEVICETREE ?=
TF_A_MAKE_TARGET ?=
TF_A_EXTRA_OPTFLAGS ?=

# Default TF-A metadata template
TF_A_METADATA_JSON ?= $(SRC_PATH)/plat/st/stm32mp1/default_metadata.json

# Init default config settings
TF_A_DEVICETREE_optee ?= stm32mp135d-mini
TF_A_EXTRA_OPTFLAGS_optee ?= AARCH32_SP=optee
TF_A_BINARY_optee ?= tf-a
TF_A_MAKE_TARGET_optee ?= dtbs

# Init default config settings
#TF_A_DEVICETREE_trusted ?= stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
#TF_A_EXTRA_OPTFLAGS_trusted ?= AARCH32_SP=sp_min
#TF_A_BINARY_trusted ?= tf-a
#TF_A_MAKE_TARGET_trusted ?= bl32 dtbs

# Init default config settings
TF_A_DEVICETREE_emmc ?=  stm32mp135d-mini
TF_A_EXTRA_OPTFLAGS_emmc ?= STM32MP_EMMC=1 PSA_FWU_SUPPORT=1
TF_A_BINARY_emmc ?= tf-a
TF_A_MAKE_TARGET_emmc ?= all

# Init default config settings
#TF_A_DEVICETREE_nand ?=  stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
#TF_A_EXTRA_OPTFLAGS_nand ?= STM32MP_RAW_NAND=1 STM32MP_FORCE_MTD_START_OFFSET=0x00200000
#TF_A_BINARY_nand ?= tf-a
#TF_A_MAKE_TARGET_nand ?= all

# Init default config settings
#TF_A_DEVICETREE_nor ?=  stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
#TF_A_EXTRA_OPTFLAGS_nor ?= STM32MP_SPI_NOR=1 PSA_FWU_SUPPORT=1 STM32MP_FORCE_MTD_START_OFFSET=0x00080000
#TF_A_BINARY_nor ?= tf-a
#TF_A_MAKE_TARGET_nor ?= all

# Init default config settings
TF_A_DEVICETREE_sdcard ?=  stm32mp135d-mini
TF_A_EXTRA_OPTFLAGS_sdcard ?= STM32MP_SDMMC=1 PSA_FWU_SUPPORT=1
TF_A_BINARY_sdcard ?= tf-a
TF_A_MAKE_TARGET_sdcard ?= all

# Init default config settings
TF_A_DEVICETREE_uart ?=  stm32mp135d-mini
TF_A_EXTRA_OPTFLAGS_uart ?= STM32MP_UART_PROGRAMMER=1
TF_A_BINARY_uart ?= tf-a
TF_A_MAKE_TARGET_uart ?= all

# Init default config settings
TF_A_DEVICETREE_usb ?=  stm32mp135d-mini
TF_A_EXTRA_OPTFLAGS_usb ?= STM32MP_USB_PROGRAMMER=1
TF_A_BINARY_usb ?= tf-a
TF_A_MAKE_TARGET_usb ?= all


# Reset default variables
LDFLAGS =
CFLAGS =
CPPFLAGS =
CC =
CPP =
AS =
AR =
LD =
NM =
# Define default make options
EXTRA_OEMAKE ?=  PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 CROSS_COMPILE=arm-none-linux-gnueabihf- DEBUG=1 LOG_LEVEL=40   

# Display TF-A config details
define tf-configs
	echo "  $(1)" ; \
	echo "    with device tree : $(if $(TF_A_DEVICETREE),$(TF_A_DEVICETREE),$(TF_A_DEVICETREE_$(1)))" ; \
	echo "    extra optionflags: $(if $(TF_A_EXTRA_OPTFLAGS),$(TF_A_EXTRA_OPTFLAGS),$(TF_A_EXTRA_OPTFLAGS_$(1)))" ; \
	echo "    binary basename  : $(if $(TF_A_BINARY),$(TF_A_BINARY),$(TF_A_BINARY_$(1)) (TF_A_BINARY_$(1)))" ; \
	echo "    tf-a build target: $(if $(TF_A_MAKE_TARGET),$(TF_A_MAKE_TARGET),$(TF_A_MAKE_TARGET_$(1)))" ;
endef

# Configure TF-A make rules
define tf-rules
tf-$(1): $2
	@mkdir -p $(BLD_PATH)/$(1)
	@$(foreach dt, $(if $(TF_A_DEVICETREE),$(TF_A_DEVICETREE),$(TF_A_DEVICETREE_$(1))), \
		$(MAKE) $(EXTRA_OEMAKE) -C $(SRC_PATH) \
			BUILD_PLAT=$(BLD_PATH)/$(1) \
			DTB_FILE_NAME=$(dt).dtb \
			$(if $(TF_A_EXTRA_OPTFLAGS),$(TF_A_EXTRA_OPTFLAGS),$(TF_A_EXTRA_OPTFLAGS_$(1))) \
			$(if $(TF_A_MAKE_TARGET),$(TF_A_MAKE_TARGET),$(TF_A_MAKE_TARGET_$(1))) \
			$(foreach soc, stm32mp15  stm32mp13 ,$(if $(findstring $(soc),$(dt)),$(shell echo $(soc) | tr a-z A-Z)=1,)) ; \
	)
endef

# Configure TF-A deploy rules
define deploy-rules
deploy-$(1): tf-$(1)
	@mkdir -p $(DEPLOYDIR)
	@mkdir -p $(DEPLOYDIR)/debug
	@$(foreach dt, $(if $(TF_A_DEVICETREE),$(TF_A_DEVICETREE),$(TF_A_DEVICETREE_$(1))), \
		if [ -f $(BLD_PATH)/$(1)/$(2)-$(dt).stm32 ]; then \
			cp -f $(BLD_PATH)/$(1)/$(2)-$(dt).stm32 $(DEPLOYDIR)/$(2)-$(dt)-$(1).stm32 ; \
			if [ "$(TF_A_ENABLE_DEBUG_WRAPPER)" = "1" ] ; then \
				stm32wrapper4dbg -s $(BLD_PATH)/$(1)/$(2)-$(dt).stm32 -d $(DEPLOYDIR)/debug/debug-$(2)-$(dt)-$(1).stm32 ; \
			fi ; \
		fi ; \
		if [ -f $(BLD_PATH)/$(1)/bl32.bin ] ; then \
			mkdir -p $(BL32_DEPLOYDIR) ; \
			cp -f $(BLD_PATH)/$(1)/bl32.bin $(BL32_DEPLOYDIR)/$(2)-bl32$(strip $(foreach soc, stm32mp15  stm32mp13 ,$(if $(findstring $(soc),$(dt)),-$(soc),))).bin ; \
			if [ -f $(BLD_PATH)/$(1)/fdts/$(dt)-bl32.dtb ]; then \
				cp -f $(BLD_PATH)/$(1)/fdts/$(dt)-bl32.dtb $(BL32_DEPLOYDIR)/ ; \
			fi ; \
			if [ -f $(BLD_PATH)/$(1)/bl32/bl32.elf ]; then \
				mkdir -p $(BL32_DEPLOYDIR)/debug ; \
				mv -f $(BLD_PATH)/$(1)/bl32/bl32.elf $(BL32_DEPLOYDIR)/debug/$(2)-bl32$(strip $(foreach soc, stm32mp15  stm32mp13 ,$(if $(findstring $(soc),$(dt)),-$(soc),))).elf ; \
			fi ; \
		fi ; \
		if [ -f $(BLD_PATH)/$(1)/fdts/$(dt)-fw-config.dtb ]; then \
			mkdir -p $(FWCONFIG_DEPLOYDIR) ; \
			cp -f $(BLD_PATH)/$(1)/fdts/$(dt)-fw-config.dtb $(FWCONFIG_DEPLOYDIR)/$(dt)-fw-config-$(1).dtb ; \
		fi ; \
		if [ -f $(BLD_PATH)/$(1)/bl2/bl2.elf ] ; then \
			cp -f $(BLD_PATH)/$(1)/bl2/bl2.elf $(DEPLOYDIR)/debug/$(2)-bl2-$(1).elf ; \
		fi ; \
		if [ -f $(BLD_PATH)/$(1)/bl32/bl32.elf ] ; then \
			cp -f $(BLD_PATH)/$(1)/bl32/bl32.elf $(DEPLOYDIR)/debug/$(2)-bl32-$(1).elf ; \
		fi ; \
	)
endef

# Set dependencies list for building all
DEPS = $(addprefix deploy-,$(TF_A_CONFIG))
#DEPS += fip
DEPS += metadata

help:
	@echo
	@echo "TF-A configuration:"
	@echo "  TF_A_CONFIG = $(TF_A_CONFIG)"
	@echo "Config details:"
	@$(foreach config, $(TF_A_CONFIG), $(call tf-configs,$(config)))
	@echo
	@echo "Note that each TF-A configuration settings can be updated through overall or specific config var:"
	@echo "  TF_A_DEVICETREE"
	@echo "  TF_A_EXTRA_OPTFLAGS"
	@echo "  TF_A_BINARY"
	@echo "  TF_A_MAKE_TARGET"
	@echo
	@echo "TF-A features configuration:"
	@echo "  TF_A_ENABLE_DEBUG_WRAPPER = $(TF_A_ENABLE_DEBUG_WRAPPER) ('1' to generate tf-a for debugging)"
	@echo
	@echo "TF-A folder configuration:"
	@echo "  SRC_PATH  = $(SRC_PATH)"
	@echo "  BLD_PATH  = $(BLD_PATH)"
	@echo "  DEPLOYDIR = $(DEPLOYDIR)"
	@echo "  BL32_DEPLOYDIR     = $(DEPLOYDIR)/bl32"
	@echo "  FWCONFIG_DEPLOYDIR = $(DEPLOYDIR)/fwconfig"
	@echo
	@echo "FIP configuration:"
	@echo "  Do not forget to set FIP deploydir folders (such as FIP_DEPLOYDIR_ROOT) to provide path to needed binaries"
	@echo
	@echo "METADATA configuration:"
	@echo "  TF_A_METADATA_JSON = $(TF_A_METADATA_JSON)"
	@echo
	@echo "Available targets:"
	@echo "  all      : build TF-A binaries for defined config(s)"
	@echo "  fip      : build FIP binaries"
	@echo "  metadata : build the TF-A metadata binary"
	@echo "  stm32    : build TF-A stm32 binaries"
	@echo "  clean    : clean build directories from generated files"
	@echo

all: $(DEPS)

host_tools:
	@$(MAKE) --no-print-directory -C $(SRC_PATH)/tools/stm32image

# Set TF-A make rules
$(foreach config, $(TF_A_CONFIG), $(eval $(call tf-rules,$(config),host_tools)))

# Set TF-A deploy rules
$(foreach config, $(TF_A_CONFIG), $(eval $(call deploy-rules,$(config),$(if $(TF_A_BINARY),$(TF_A_BINARY),$(TF_A_BINARY_$(config))))))

fip: $(addprefix deploy-,$(TF_A_CONFIG))
	for config in $(TF_A_CONFIG) ; do \
		if [ "$$config" = "trusted" ]; then \
			FIP_DEPLOYDIR_TFA=$(BL32_DEPLOYDIR) FIP_DEPLOYDIR_FWCONF=$(FWCONFIG_DEPLOYDIR) FIP_DEVICETREE="$(if $(TF_A_DEVICETREE),$(TF_A_DEVICETREE),$(TF_A_DEVICETREE_trusted))" FIP_CONFIG="trusted" FIP_BL32_CONF="tfa" fiptool-stm32mp ; \
		fi ; \
		if [ "$$config" = "optee" ]; then \
			FIP_DEPLOYDIR_TFA=$(BL32_DEPLOYDIR) FIP_DEPLOYDIR_FWCONF=$(FWCONFIG_DEPLOYDIR) FIP_DEVICETREE="$(if $(TF_A_DEVICETREE),$(TF_A_DEVICETREE),$(TF_A_DEVICETREE_optee))" FIP_CONFIG="optee" FIP_BL32_CONF="optee" fiptool-stm32mp ; \
		fi ; \
	done

stm32: $(addprefix deploy-,$(TF_A_CONFIG))

metadata:
	@mkdir -p $(DEPLOYDIR)
	$(SRC_PATH)/tools/fwu_gen_metadata/fwumd_tool.py jsonparse "$(TF_A_METADATA_JSON)" -b $(DEPLOYDIR)/metadata.bin

clean:
	@for config in $(TF_A_CONFIG) ; do \
		echo "Removing $(BLD_PATH)/$$config ..." ; \
		rm -rf $(BLD_PATH)/$$config ; \
	done
	@echo "Removing $(DEPLOYDIR) ..."
	@rm -rf $(DEPLOYDIR)
	@echo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTP协议,带你了解HTTP协议

目录 1、HTTP 协议介绍 2、HTTP 协议的工作过程 HTTP 协议的工作过程可以分为以下几个步骤&#xff1a; 3、Fiddler 抓包工具介绍 3.1 抓包工具的使用 3.2 抓包结果 3.3 抓包工具原理 4、HTTP 协议格式总览 5、HTTP 请求&#xff08;Request&#xff09; 5.1 认识 URL…

C#中List<T>的排序相关的使用方法总结

C#中List<>的排序相关的使用方法 list的排序一般使用Sort和LINQ的Orderby方法&#xff0c;本文主要介绍其如何使用。 &#x1f32e;1.Sort和实现Comparable接口 此方式需要类去实现IComparable接口 public class OrderTest {[Test]public void OraderTest(){List<E…

MySQL优化--undo log和redo log的区别

首先我们需要知道两个概念 缓冲池&#xff08;buffer pool&#xff09;:主内存中的一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删改查操作时&#xff0c;先操作缓冲池中的数据&#xff08;若缓冲池没有数据&#xff0c;则从磁盘加载并缓存…

(写自己语言的练手级应用)JSON(JavaScript Object Notation) 产生式(BNF)

写自己的开发语言时&#xff0c;很多人都会拿JSON当第一个练习对象 开源net json FJSON 解析工具https://dbrwe.blog.csdn.net/article/details/107611540?spm1001.2014.3001.5502 <json> :: <object> | <array> <object> :: "{" [ <me…

操作系统 复习-计算题

一. 计算题&#xff08;共5题&#xff0c;100分&#xff09; 1.(计算题) 假设有4个进程需要在单CPU上运行&#xff0c;它们的执行时间如下表所示&#xff1a; 进程ID执行时间P18P25P32P44 现在我们需要按照抢占式优先级调度算法来安排这些进程的执行顺序。其中&#xff0c;进…

python代码加密方案

为何要对代码加密&#xff1f; python的解释特性是将py编译为独有的二进制编码pyc 文件&#xff0c;然后对pyc中的指令进行解释执行&#xff0c;但是pyc的反编译却非常简单&#xff0c;可直接反编译为源码&#xff0c;当需要将产品发布到外部环境的时候&#xff0c;源码的保护尤…

基于机器学习的内容推荐算法及其心理学、社会学影响闲谈

基于机器学习的内容推荐算法目前在各类内容类APP中使用的非常普遍。在购物、时尚、新闻咨询、学习等领域&#xff0c;根据用户的喜好&#xff0c;进行较为精准的用户画像与内容推荐。此类算法不但可以较为准确的分析用户的特征&#xff0c;如年龄、性别等&#xff0c;还能通过长…

特征点Features2D类介绍

文章目录 Features2D类介绍1. cv::AgastFeatureDetector2. cv::AKAZE3. cv::BRISK4. cv::FastFeatureDetector5. cv::GFTTDetector6. cv::KAZE7. cv::MSER8. cv::SimpleBlobDetector9. cv::StarDetector10. cv::SIFT11. cv::SURF12. cv::FastFeatureDetector13. cv::AgastFeatu…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

【c语言】 -- 详解数组篇

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习数据的存储。 让我们开启c语言学…

考虑微网新能源经济消纳的共享储能优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C#异步详解

异步编程是指在程序执行过程中&#xff0c;不需要等待某个操作完成&#xff0c;就可以继续执行后续的代码。比如我们开发了一个web页面中有一个上传文件功能&#xff0c;我们上传文件时使用异步操作&#xff0c;就不用等待文件的上传时间&#xff0c;可以先在网页上进行其他操作…

JAVA_HOME变量的详细配置(图文)

用到Java项目的时候&#xff0c;有时候要用到Java_home&#xff0c;这个需要在系统配置中配置一下。如何操作呢&#xff1f;以下为详细的图文步骤。 1&#xff09;打开环境变量的窗口 2&#xff09;打开新建系统变量 3&#xff09;编辑JAVA_HOME 在变量名后输入JAVA_HOME,找到…

Ui自动化测试如何上传文件

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

centos直接部署express

centos直接部署express 以下是在CentOS上部署Express应用程序的一般步骤&#xff1a; 1.安装Node.js 在CentOS系统上安装Node.js。可以使用以下命令安装Node.js&#xff1a; sudo yum install nodejs2.安装npm 安装完Node.js后&#xff0c;还需要安装npm&#xff08;Node.…

Python爬虫被封ip解决方案

在使用 Python 程序进行网络爬虫开发时&#xff0c;可能因以下原因导致被封 IP 或封禁爬虫程序&#xff1a; 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次&#xff0c;从而对目标网站造成较大的负担和压力&#xff0c;这种行为容易引起目标网站的注意并被封禁…

数据结构-队列

数据结构之队列 队列的概念顺序队列循环队列 顺序循环队列的ADT定义1、简单结构体定义2、初始化3、队列的清空4、计算队列的长度5、判断队列是否为空6、插入新的元素7、元素的删除8、遍历输出队列内的所有元素 链队列的ADT定义1、链队列简单结构体定义2、初始化链队列3、判断链…

神秘的临时对象

下面的程序输出什么&#xff1f;为什么&#xff1f; 程序意图&#xff1a; 在 Test() 中以 0 作为参数调用 Test(int i) 将成员变量 mi 的初始值设置为 0 运行结果&#xff1a; 成员变量 mi 的值为随机值 构造函数是一个特殊的函数 是否可以直接调用&#xff1f; 是否可以…

LVS+KeepAlived高可用负载均衡集群

LVSKeepAlived高可用负载均衡集群 1. 高可用群集的相关知识1.普通群集2.高可用群集(HA)3.Keepalived及其工作原理4.Keepalived体系主要模块及其作用5.健康检查方式&#xff08;学名&#xff1a;探针&#xff09; 二、脑裂的形成和解决1.产生脑裂的常见原因及解决方法2.脑裂预防…

谈找工作线上途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉勾网 猎聘网站智联招聘网站后记 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait…