第09章 TF-A移植
编译ST官方TF-A
新建 my-tfa文件夹
mkdir ~/linux/atk-mp1/my-tfa
将6.1.2小节准备好的ST官方的TF-A源码拷贝到 my-tfa 目录。
cp -r ~/linux/atk-mp1/tf-a/* ~/linux/atk-mp1/my-tfa
cd ~/linux/atk-mp1/my-tfa

修改Makefile.sdk
将Makefile.sdk中的交叉编译器指定为 arm-none-linux-gnueabihf-

进入TF-A源码中的 tf-a-stm32mp-2.2.r1,编译
~/linux/atk-mp1/my-tfa/tf-a-stm32mp-2.2.r1
make -f ../Makefile.sdk all
编译成功后,在 Makefile.sdk 同级目录(即my-tfa)中会生成 build 文件夹
cd ~/linux/atk-mp1/my-tfa/build

在 trusted 目录下有个刚刚编译出来的 tf-a-stm32mp157d-ev1-trusted.stm32,将它烧录到开发板中。
可以看到无法运行,因为这是ST官方的TF-A,我们需要移植。
TF-A移植
新建自己开发板对应的设备树
创建板子对应设备树
板子设备树路径:tf-a-stm32mp-2.2.r1/fdts
cd ~/linux/atk-mp1/my-tfa/tf-a-stm32mp-2.2.r1/fdts
正点原子是基于ST官方的EVK板设计的,因此要参考 stm32mp157d-ev1.dts 这个设备树 。我们拷贝一份 stm32mp157d-ev1.dts,重命名为 stm32mp157d-atk.dts。
cp stm32mp157d-ed1.dts stm32mp157d-atk.dts
用vscode打开 stm32mp157d-atk.dts 可以看到引用了头文件 stm32mp157d-ed1.dts。

主要工作都是在 stm32mp157d-ed1.dts,因此拷贝一份 stm32mp157d-ed1.dts,重命名为 stm32mp157d-atk.dts。
cp stm32mp157d-ed1.dts stm32mp157d-atk.dtsi
用vscode打开 stm32mp157d-atk.dtsi,并进行如下修改。
将第12行的 #include "stm32mp15xx-edx.dtsi" 修改为 #include "stm32mp157d-atk.dtsi"
编译
在 Makefile.sdk 里添加 stm32mp157d-atk.dts 到编译列表,即在TFA_DEVICETREE 配置项中添加“stm32mp157d-atk”。

修改完后保存退出,编译TF-A
cd tf-a-stm32mp-2.2.r1
make -f ../Makefile.sdk all
修改设备树电源管理
ST官方电源管理使用I2C接口的PMIC芯片,成本高。
正点原子使用的是分离电源,所以要去掉PMIC的配置。
修改 stm32mp157d-atk.dtsi 文件
1、删:删除ST官方的电源芯片描述信息
第54行 pmic: stpmic@33设备树表示的是PMIC芯片的描述信息,需要删掉这一整个节点,即删除54到281行
删除完后&i2c4节点信息仅如下

2、改:修改设备的电源描述信息
将17行vin节点的内容删掉

在vin节点原位置添加如下代码
vddcore: regulator-vddcore {
compatible = "regulator-fixed";
regulator-name = "vddcore";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1350000>;
regulator-off-in-suspend;
regulator-always-on;
};
v3v3: regulator-3p3v {
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;
};
修改TF卡和EMMC设备树
找到&sdmmc1节点,修改成如下
&sdmmc1 {
pinctrl-names = "default";
pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>;
st,neg-edge;
broken-cd;
bus-width = <4>;
vmmc-supply = <&v3v3>;
status = "okay";
};
找到&sdmmc2节点,修改成如下
&sdmmc2 {
pinctrl-names = "default";
pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
non-removable;
st,neg-edge;
bus-width = <8>;
vmmc-supply = <&v3v3>;
vqmmc-supply = <&v3v3>;
status = "okay";
};
修改USB OTG设备树
1、改:找到&usbotg_hs节点,修改成如下
&usbotg_hs {
phys = <&usbphyc_port1 0>;
phy-names = "usb2-phy";
usb-role-switch;
status = "okay";
};
2、增:在 &usbotg_hs 后面增加一个 &usbphyc 节点,内容如下
&usbphyc {
status = "okay";
};
编译测试
编译
修改Makefile.sdk的TFA_DEVICETREE ,只保留stm32mp157d-atk,即只编译stm32mp157d-atk.dts

修改完保存退出,编译
cd tf-a-stm32mp-2.2.r1
make -f ../Makefile.sdk all
烧写测试
烧写完可以根据TF-A
使用新的核心板烧录
略
stm32mp157d-atk-serialboot.stm32 编译方法
修改Makefile.sdk的EXTRA_OEMAKE_SERIAL如下

保存后编译
cd tf-a-stm32mp-2.2.r1
make -f ../Makefile.sdk clean
make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all
编译成功会在 build/serialboot 目录下生成 tf-a-stm32mp157d-atk-serialboot.stm32
cd ~/linux/atk-mp1/my-tfa/build/serialboot
ls tf-a-stm32mp157d-atk-serialboot.stm32 -l
将编译好的 tf-a-stm32mp157d-atk-serialboot.stm32 和tf-a-stm32mp157d-atk-trusted.stm32 烧录到板子
