STM32MP157A之TF-A移植

(一)TF-A移植步骤

基于 Arm 的可信固件 Trusted Firmware-A,简称 TF-A。它是一个开源软件,运行在一个硬件隔离的安全环境中并提供安全服务。(ARMV7后才引入这种方式引导内核启动,以前都是spl的方式)。

2.1》导入源码

1)打开系统源码,进入TF-A的源码目录下,该目录下以 patch 结尾的文件为 ST 官方提供的补丁文件;tf-a-stm32mp-2.2.r1-r0.tar.gz 为标准 tf-a 源码包。
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0
在这里插入图片描述

2)解压源码包,并且进入解压后的源码目录下
tar -xvf tf-a-stm32mp-2.2.r1-r0.tar.gz
cd tf-a-stm32mp-2.2.r1/

在这里插入图片描述

******注意:接下来所有的操作都将在此目录下,不要走错了地方。
3)将 ST 官方补丁文件打到 tf-a 源码中:
for p in ls -1 ../*.patch; do patch -p1 < $p; done
在这里插入图片描述

4)导入交叉编译工具链
source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
$CC --version
在这里插入图片描述

2.2》增加板级相关文件

1)添加设备树文件
cp fdts/stm32mp15xx-dkx.dtsi fdts/stm32mp15xx-fsmp1x.dtsi
cp fdts/stm32mp157a-dk1.dts fdts/stm32mp157a-fsmp1a.dts
2)修改上层目录下的 Makefile.sdk 编译脚本在 TFA_DEVICETREE 配置项中添加 stm32mp1 57a-fsmp1a
vim …/Makefile.sdk
添加的内容:
TFA_DEVICETREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32m p157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp 157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1

1)修改 fdts/stm32mp157a-fsmp1a.dts 将 #include “stm32mp15xx-dkx.dtsi” 修改为 #include “stm32mp15xx-fsmp1x.dtsi”
vim fdts/stm32mp157a-fsmp1a.dts
2)编译源码
make -f $PWD/…/Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE=‘1’ all
在这里插入图片描述

3)编译完成后会在上级 build/trusted 目录得到如下文件:
ls …/build/trusted/
在这里插入图片描述

tf-a-stm32mp157a-fsmp1a-trusted.stm32 就是编译生成的TF-A镜像

2.3》烧录TF-A镜像和u-boot镜像

1)插入SD卡,连接到ubuntu
2)查看分区
ls /dev/sd*
在这里插入图片描述

3)进入TF-A的镜像目录
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/build/trusted
4)执行烧录指令,这里只烧录TF-A部分
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync
5)进入u-boot的镜像目录
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/build-trusted
6)执行烧录指令,这里只烧录u-boot部分
sudo dd if=u-boot-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb3 conv=fdatasync
7)启动开发板 。
将拨码开关设置为 SD 卡启动方式,将SD卡插入开发板卡槽。连接J-link工具,打开Xshell。重新上电。
在这里插入图片描述

这个错误产生的原因是电源初始化错误,需重新调整电源相关配置

2.4》调整设备树电源

1)回到TF-A源码目录:
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/tf-a-stm32mp-2.2.r1
2)去掉原有电源管理内容,修改 fdts/stm32mp15xx-fsmp1x.dtsi 文件
vim fdts/stm32mp15xx-fsmp1x.dtsi
将文件中 i2c4 节点相关内容整体删除,删除内容如下:
&i2c4 {
pinctrl-names = “default”, “sleep”;
pinctrl-0 = <&i2c4_pins_a>;
pinctrl-1 = <&i2c4_pins_sleep_a>;
i2c-scl-rising-time-ns = <185>;
i2c-scl-falling-time-ns = <20>;
clock-frequency = <400000>;
status = “disabled”;
/内容太长此处省略/
watchdog {
compatible = “st,stpmic1-wdt”;
status = “disabled”;
};
};
};
3)修改 fdts/stm32mp15xx-fsmp1x.dtsi 文件,删除如下内容:
vim fdts/stm32mp15xx-fsmp1x.dtsi
删除内容如下:
&cpu0{
cpu-supply = <&vddcore>;
};
&cpu1{
cpu-supply = <&vddcore>;
};
4)添加固定电源配置
修改 fdts/:stm32mp15xx-fsmp1x.dtsi
vim fdts/stm32mp15xx-fsmp1x.dtsi
固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):
vin: vin {
compatible = “regulator-fixed”;
regulator-name = “vin”;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-always-on;
};
v3v3: regulator-3p3v {
compatible = “regulator-fixed”;
regulator-name = “v3v3”;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-boot-on;
};
v1v8_audio: regulator-v1v8-audio {
compatible = “regulator-fixed”;
regulator-name = “v1v8_audio”;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
regulator-boot-on;
};
v3v3_hdmi: regulator-v3v3-hdmi {
compatible = “regulator-fixed”;
regulator-name = “v3v3_hdmi”;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-boot-on;
};

v1v2_hdmi: regulator-v1v2-hdmi {
	compatible = "regulator-fixed";
	regulator-name = "v1v2_hdmi";
	regulator-min-microvolt = <1200000>;
	regulator-max-microvolt = <1200000>;
	regulator-always-on;
	regulator-boot-on;
};
vdd: regulator-vdd {
	compatible = "regulator-fixed";
	regulator-name = "vdd";
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-always-on;
	regulator-boot-on;
};
vdd_usb: regulator-vdd-usb {
	compatible = "regulator-fixed";
	regulator-name = "vdd_usb";
	regulator-min-microvolt = <3300000>;
	regulator-max-microvolt = <3300000>;
	regulator-always-on;
	regulator-boot-on;
};

};
5)重新编译源码
make -f $PWD/…/Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE=‘1’ all
6)烧写后,再启动。u-boot不用重新烧录了,只需要重新烧录TF-A
进入TF-A的镜像目录
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/build/trusted
执行烧录指令,这里只烧录TF-A部分
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync

7)启动开发板

在这里插入图片描述

2.5》eMMC移植

参考原理图可知 eMMC 使用的是 SDMMC2 总线,当前所使用的设备树文件中没有 SDMMC2 的支持,所以需要增加相关内容才能正常驱动 eMMC。
1)回到TF-A源码目录:
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/tf-a-stm32mp-2.2.r1

2)增加 SDMMC2 节点信息
修改 fdts/stm32mp15xx-fsmp1x.dtsi 增加 SDMMC2 的信息
vim fdts/stm32mp15xx-fsmp1x.dtsi
在原有 sdmmc1 节点下增加 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”;
};
1)测试
重新编译
make -f $PWD/…/Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE=‘1’ all
烧写后,再启动。u-boot不用重新烧录了,只需要重新烧录TF-A
进入TF-A的镜像目录
/home/linux/fs_mp157a/kernel/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0/build/trusted
执行烧录指令,这里只烧录TF-A部分
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync
4)启动开发板------多了MMC:1
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_52531759/article/details/131834708