你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP157 Linux系统移植开发篇5:Trusted Firmware-A移植

[复制链接]
STMCU小助手 发布时间:2022-10-1 17:13
Trusted Firmware-A简介
嵌入式高速发展的今天,大量的嵌入式设备使用了Arm为核心的芯片。我们会接触到越来越多的嵌入式设备,一个问题油然而生:数量如此巨大的嵌入式设备的安全性如何?目前针对嵌入式安全的技术和标准可谓千姿百态,除了必要的硬件安全技术,与之配套的安全软件也是必不可少的一部分。今天我们要介绍的是基于Arm 的可信固件Trusted Firmware-A,简称TF-A。它是一个开源软件,运行在一个硬件隔离的安全环境中并提供安全服务。

实验目的

完成TF-A的基本功能实现TF-A引导u-boot启动。

实验平台
华清远见开发环境,FS-MP1A平台

实验步骤
本实验基于tf-a-stm32mp-2.2版本,然后添加意法半导体提供的补丁文件。在意法半导体官方的tf-a中移植我们自己的tf-a。

导入源码
如果之前已经建立了源码目录,并且导入了源码包,即可跳过本小节。

建立源码目录

linux@ubuntu:$ cd ~

linux@ubuntu:$ mkdir FS-MP1A

将下的
en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz压缩包,导入到ubuntu下的${HOME}/FS-MP1A目录下。

dcc9e67b2da15ad3080564ba0ce85686.png

解压缩源码包

linux@ubuntu:$ tar xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz

解压完成后得到“
stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”目录

a07925a6cdba653197398737d7a1f33e.png

进入tf-a目录下

linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/tf-a-stm32mp-2.2.r1-r0

b1925479f5f7032bd642c0e7925a0eeb.png

该目录下以patch结尾的文件为ST官方提供的补丁文件;
tf-a-stm32mp-2.2.r1-r0.tar.gz为标准tf-a源码包。

解压标准tf-a源码包

linux@ubuntu:$ tar -xvf tf-a-stm32mp-2.2.r1-r0.tar.gz

解压完成后得到tf-a-stm32mp-2.2.r1目录

ec7545fd90a80b0850f8c20f0ebf300e.png

进入tf-a源码目录下:

linux@ubuntu:$ cd tf-a-stm32mp-2.2.r1

92727223ee74497c209ad332f12172a9.png

将ST官方补丁文件打到tf-a源码中:

linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

TF卡分区
要对TF卡进行烧录,需要先将TF接入到ubuntu系统中。

查看TF卡分区

linux@ubuntu:$ ls /dev/sd*

1f7cff27b5de5df12594179310302f7c.png

由上图所示只有“/dev/sdb1”一个分区则需要重新进行分区。

首先删除原有分区

linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos

如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。

5630530bf7ece0e136e270f55686873b.png

卸载设备

linux@ubuntu:$ umount /dev/sdb1

卸载完成后重新执行删除分区命令

linux@ubuntu:$ sudo parted -s /dev/sdb mklabel msdos

对tf进行重新分区

linux@ubuntu:$ sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g

289aa9007979553c4f755541a38da41d.png

注意:最后-p /dev/sdb参数中的/dev/sdb需要按照实际ubuntu中的tf节点为准,否则可能发生不可预料的后果。

建立自己的平台配置工具链
1.导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

验证开发工具是否安装正确,显示版本信息如下图所示。

linux@ubuntu:$ $CC --version

171178c16e44d43e951a9217a7b0969f.png

2.增加板级相关文件
进入到tf-a源码目录

  1. linux@ubuntu:$ cd ~/FS-MP1A/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
复制代码


添加设备树文件
  1. linux@ubuntu:$ cp fdts/stm32mp15xx-dkx.dtsi fdts/stm32mp15xx-fsmp1x.dtsi

  2. linux@ubuntu:$ cp fdts/stm32mp157a-dk1.dts fdts/stm32mp157a-fsmp1a.dts
复制代码

修改上层目录下的Makefile.sdk编译脚本在TFA_DEVICETREE配置项中添加stm32mp157a-fsmp1a

  1. TFA_DEVICETREE ?= stm32mp157a-fsmp1a stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1
复制代码


修改
fdts/stm32mp157a-fsmp1a.dts将

#include "stm32mp15xx-dkx.dtsi"

修改为

#include "stm32mp15xx-fsmp1x.dtsi"

3.编译源码
执行如下指令编译trusted:

linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all

编译成功后,最后显示内容(部分截图)如下:

810381fb5fcb18d53e0a6d5766e16851.png

编译完成后会在上级build/trusted目录得到如下文件:

linux@ubuntu:$ ls ../ build/trusted

0e5aa85e603d38ac85f0231e458d9e8c.png

linux@ubuntu:$ cd ../ build/trusted

4.固件烧写
由于在移植过程中会多次烧写固件并且会导致正常tf-a无法启动,因此推荐使用TF卡启动的方式来验证。

tf-a需要使用trusted 格式的u-boot镜像启动,具体的编译方法可参考《U-boot移植》章节中的“生成Trusted镜像”小节。

将TF接入ubuntu系统后,查看TF卡分区

linux@ubuntu:$ ls /dev/sd*

9c41603b86fa7d7e31156830913a942f.png

/dev/sdb为TF卡设备。如果该设备下只有/dev/sdb1一个分区则重新分区。

执行如下指令烧写u-boot:

  1. linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync

  2. linux@ubuntu:$ sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync

  3. linux@ubuntu:$ sudo dd if=u-boot-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb3 conv=fdatasync
复制代码


其中前两条命令“
tf-a-stm32mp157a-fsmp1a-trusted.stm32”为本章节编译得到的,第三条命令中的“u-boot-stm32mp157a-fsmp1a-trusted.stm32”则为《U-boot移植》章节中的“生成Trusted镜像”小节得到。

5.启动开发板
将拨码开关设置为SD卡启动方式:

2UCFJDO7{]BFKMV_Z[CWKGS.png

将制作好的TF卡插入开发板,上电后会出现如下错误提示:

69751434cbb1a501e7db4eb5fd67ff94.png

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

调整设备树电源配置
由于官方参考板DK1采用电源管理芯片做电源管理,而FS-MP1A采用分离电路作为电源管理,本例需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容

1.去掉原有电源管理内容
DK1参考板电源管理芯片挂在I2C4上,而FS-MP1A并未使用I2C4总线,所以直接将I2C4相关内容完全删除即可。

修改
fdts/stm32mp15xx-fsmp1x.dtsi文件

将文件中i2c4节点相关内容整体删除,删除内容如下:

  1. &i2c4 {

  2. pinctrl-names = "default", "sleep";

  3. pinctrl-0 = <&i2c4_pins_a>;

  4. pinctrl-1 = <&i2c4_pins_sleep_a>;

  5. i2c-scl-rising-time-ns = <185>;

  6. i2c-scl-falling-time-ns = <20>;

  7. clock-frequency = <400000>;

  8. status = " okay";

  9. secure-status = "okay";

  10. /*内容太长此处省略*/

  11. watchdog {

  12. compatible = "st,stpmic1-wdt";

  13. status = "disabled";

  14. };

  15. };

  16. };
复制代码


修改
fdts/stm32mp15xx-fsmp1x.dtsi文件,删除如下内容:

  1. &cpu0{

  2. cpu-supply = <&vddcore>;

  3. };

  4. &cpu1{

  5. cpu-supply = <&vddcore>;

  6. };
复制代码


2.添加固定电源配置
修改fdts/:文件

固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容(红色字体为需要添加的内容):

  1. vin: vin {

  2. compatible = "regulator-fixed";

  3. regulator-name = "vin";

  4. regulator-min-microvolt = <5000000>;

  5. regulator-max-microvolt = <5000000>;

  6. regulator-always-on;

  7. };

  8. v3v3: regulator-3p3v {

  9. compatible = "regulator-fixed";

  10. regulator-name = "v3v3";

  11. regulator-min-microvolt = <3300000>;

  12. regulator-max-microvolt = <3300000>;

  13. regulator-always-on;

  14. regulator-boot-on;

  15. };

  16. v1v8_audio: regulator-v1v8-audio {

  17. compatible = "regulator-fixed";

  18. regulator-name = "v1v8_audio";

  19. regulator-min-microvolt = <1800000>;

  20. regulator-max-microvolt = <1800000>;

  21. regulator-always-on;

  22. regulator-boot-on;

  23. };

  24. v3v3_hdmi: regulator-v3v3-hdmi {

  25. compatible = "regulator-fixed";

  26. regulator-name = "v3v3_hdmi";

  27. regulator-min-microvolt = <3300000>;

  28. regulator-max-microvolt = <3300000>;

  29. regulator-always-on;

  30. regulator-boot-on;

  31. };

  32. v1v2_hdmi: regulator-v1v2-hdmi {

  33. compatible = "regulator-fixed";

  34. regulator-name = "v1v2_hdmi";

  35. regulator-min-microvolt = <1200000>;

  36. regulator-max-microvolt = <1200000>;

  37. regulator-always-on;

  38. regulator-boot-on;

  39. };

  40. vdd: regulator-vdd {

  41. compatible = "regulator-fixed";

  42. regulator-name = "vdd";

  43. regulator-min-microvolt = <3300000>;

  44. regulator-max-microvolt = <3300000>;

  45. regulator-always-on;

  46. regulator-boot-on;

  47. };

  48. vdd_usb: regulator-vdd-usb {

  49. compatible = "regulator-fixed";

  50. regulator-name = "vdd_usb";

  51. regulator-min-microvolt = <3300000>;

  52. regulator-max-microvolt = <3300000>;

  53. regulator-always-on;

  54. regulator-boot-on;

  55. };

  56. };
复制代码


3.重新编译源码
linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all

4.烧写后启动
重新烧写后启动现象如下:

bf0c0c031f8012e3d4620113760779a4.png

可以看到现在已经可以启动到u-boot了

eMMC移植
参考原理图可知eMMC使用的是SDMMC2总线,当前所使用的设备树文件中没有SDMMC2的支持,所以需要增加相关内容才能正常驱动eMMC。

1f88a42ea175a92984ddf26953aad7d2.png

由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:
64JXG%J1PV7V_TOSS2I~6EF.png

1.管脚定义
在u-boot中STM32MP1默认管脚定义在文件
arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:

查看后确认有SDMMC2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:

  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 {

  2. pins1 {

  3. pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */

  4. <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */

  5. <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */

  6. <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */

  7. <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */

  8. slew-rate = <1>;

  9. drive-push-pull;

  10. bias-pull-up;

  11. };

  12. pins2 {

  13. pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */

  14. slew-rate = <2>;

  15. drive-push-pull;

  16. bias-pull-up;

  17. };

  18. };
复制代码

2.增加SDMMC2节点信息
修改
fdts/stm32mp15xx-fsmp1x.dtsi增加SDMMC2的信息

在原有sdmmc1节点下增加sdmmc2的内容,添加内容可参考
arch/arm/dts/stm32mp15xx-edx.dtsi中sdmmc2的写法,内容如下:

  1. &sdmmc2 {

  2. pinctrl-names = "default";

  3. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;

  4. non-removable;

  5. st,neg-edge;

  6. bus-width = <8>;

  7. vmmc-supply = <&v3v3>;

  8. vqmmc-supply = <&v3v3>;

  9. status = "okay";

  10. };
复制代码

————————————————
版权声明:华清远见IT开放实验室


收藏 评论0 发布时间:2022-10-1 17:13

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版