STM32MP135 TF-A源码移植教程 – ST官方源码详解(第二章)

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
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32MP135 TF-A源码移植教程 – ST官方源码详解(第二章)

    发表回复