• (三)正点原子STM32MP135移植——optee移植


    一、概述

    OP-TEE 是一个开源工程,完整的实现了一个可信执行环境。 主要包括 Secure world OS(optee_os)、normal world client(optee_client)、test suite(optee_test/xtest)以及 Linux 驱动部分。

    OP-TEE 的全称是 Open-source Portable Trusted Execution Environment,其中 TEE(可信执行环境)是基于 trustzone 技术搭建的安全执行环境。该项目最初由意法半导体(ST)和爱立信发起,是一个专门的解决方案,后来由意法半导体拥有和维护。2014年,Linaro 开始与意法半导体合作,逐步将这个专有的 TEE 解决方案转换成一个开源的 TEE 解决方案。

    ARM 公司提出的 trustzone 技术是用一根安全总线(称为 NS 位)来判断系统当前处于 secure world 还是 non-secure world 状态,状态的切换由 ATF(ARM Trusted Firmware)来完成。

    二、编译官方代码

            进入到optee的目录,里面有这几个文件

    1.optee-os-stm32mp-3.19.0-stm32mp-r1-r0.tar.xz        源码压缩包

    2.fonts.tar.gz                                                                   老实讲我不知道这是啥

    3.Makefile.sdk

    4.README.HOW_TO.txt                                                官方给的使用说明

    5.series

    6.0001-3.19.0-stm32mp-r1.patch                                        补丁

    2.1 解压源码 、打补丁

    1. /* 解压源码 */
    2. tar xf optee-os-stm32mp-3.19.0-stm32mp-r1-r0.tar.xz
    3. /* 进入源码目录 */
    4. cd cd optee-os-stm32mp-3.19.0-stm32mp-r1/
    5. /* 解压不知名文件 */
    6. tar xf ../fonts.tar.gz
    7. /* 打补丁 */
    8. for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

    2.2 修改Makefile.sdk

            打开Makefile.sdk,把DEPLOYDIR目录改成这个:

    DEPLOYDIR ?= $(SRC_PATH)/../../FIP_artifacts/optee

            再把设备树改成这个:

    CFG_EMBED_DTB_SOURCE_FILE ?= stm32mp135f-dk

    2.3 配置编译环境

    1. /* 加载环境 */
    2. source /opt/st/stm32mp1/4.2.1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
    3. /* 配置环境变量 */
    4. export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts

    不要关了这个终端,它已经配置好了,关于这部分的配置,可以看上一篇关于TF-A的解释比较详细。

    2.4 编译

    make -f ../Makefile.sdk all

    最后提示我们:Missing u-boot-stm32mp135f-dk.dtb file in folder: '$FIP_DEPLOYDIR_UBOOT' or '$FIP_DEPLOYDIR_ROOT/u-boot'

    没有关系,这是因为还没有编译u-boot,optee、TF-A、u-boot最后会一起打包的,忽视这个警告即可

    三、移植

    3.1 复制官方文件

    1. /* 进入设备树目录 */
    2. cd core/arch/arm/dts/
    3. /* 复制文件 */
    4. cp stm32mp13-pinctrl.dtsi stm32mp13-pinctrl-atk.dtsi
    5. cp stm32mp135f-dk.dts stm32mp135-atk.dts

    打开stm32mp135-atk.dts文件,第一件事先把头文件修改了

    1. // #include "stm32mp13-pinctrl.dtsi"
    2. #include "stm32mp13-pinctrl-atk.dtsi"

    3.2 修改电源

    这里和TF-A基本移植,删掉i2c4节点,然后增加我们自己的电源描述

    首先找到i2c4这个节点,不要犹豫,把它全都删了,干干净净

    1. &i2c4 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&i2c4_pins_a>;
    4. i2c-scl-rising-time-ns = <185>;
    5. i2c-scl-falling-time-ns = <20>;
    6. clock-frequency = <400000>;
    7. status = "okay";
    8. pmic: stpmic@33 {
    9. compatible = "st,stpmic1";
    10. reg = <0x33>;
    11. status = "okay";
    12. st,wakeup-pin-number = <1>;
    13. st,notif-it-id = <0>;
    14. regulators {
    15. compatible = "st,stpmic1-regulators";
    16. buck1-supply = <&vin>;
    17. buck2-supply = <&vin>;
    18. buck3-supply = <&vin>;
    19. buck4-supply = <&vin>;
    20. ldo1-supply = <&vin>;
    21. ldo4-supply = <&vin>;
    22. ldo5-supply = <&vin>;
    23. ldo6-supply = <&vin>;
    24. vref_ddr-supply = <&vin>;
    25. pwr_sw1-supply = <&bst_out>;
    26. pwr_sw2-supply = <&v3v3_ao>;
    27. vddcpu: buck1 {
    28. regulator-name = "vddcpu";
    29. regulator-min-microvolt = <1250000>;
    30. regulator-max-microvolt = <1350000>;
    31. regulator-always-on;
    32. regulator-over-current-protection;
    33. lp-stop {
    34. regulator-suspend-microvolt = <1250000>;
    35. };
    36. lplv-stop {
    37. regulator-suspend-microvolt = <900000>;
    38. };
    39. lplv-stop2 {
    40. regulator-off-in-suspend;
    41. };
    42. standby-ddr-sr {
    43. regulator-off-in-suspend;
    44. };
    45. standby-ddr-off {
    46. regulator-off-in-suspend;
    47. };
    48. };
    49. vdd_ddr: buck2 {
    50. regulator-name = "vdd_ddr";
    51. regulator-min-microvolt = <1350000>;
    52. regulator-max-microvolt = <1350000>;
    53. regulator-always-on;
    54. regulator-over-current-protection;
    55. standby-ddr-off {
    56. regulator-off-in-suspend;
    57. };
    58. };
    59. vdd: buck3 {
    60. regulator-name = "vdd";
    61. regulator-min-microvolt = <3300000>;
    62. regulator-max-microvolt = <3300000>;
    63. regulator-always-on;
    64. st,mask-reset;
    65. regulator-over-current-protection;
    66. };
    67. vddcore: buck4 {
    68. regulator-name = "vddcore";
    69. regulator-min-microvolt = <1250000>;
    70. regulator-max-microvolt = <1250000>;
    71. regulator-always-on;
    72. regulator-over-current-protection;
    73. lplv-stop {
    74. regulator-suspend-microvolt = <900000>;
    75. };
    76. lplv-stop2 {
    77. regulator-suspend-microvolt = <900000>;
    78. };
    79. standby-ddr-sr {
    80. regulator-off-in-suspend;
    81. };
    82. standby-ddr-off {
    83. regulator-off-in-suspend;
    84. };
    85. };
    86. vdd_adc: ldo1 {
    87. regulator-name = "vdd_adc";
    88. regulator-min-microvolt = <3300000>;
    89. regulator-max-microvolt = <3300000>;
    90. standby-ddr-sr {
    91. regulator-off-in-suspend;
    92. };
    93. standby-ddr-off {
    94. regulator-off-in-suspend;
    95. };
    96. };
    97. unused1: ldo2 {
    98. regulator-name = "ldo2";
    99. };
    100. unused2: ldo3 {
    101. regulator-name = "ldo3";
    102. };
    103. vdd_usb: ldo4 {
    104. regulator-name = "vdd_usb";
    105. regulator-min-microvolt = <3300000>;
    106. regulator-max-microvolt = <3300000>;
    107. standby-ddr-sr {
    108. regulator-off-in-suspend;
    109. };
    110. standby-ddr-off {
    111. regulator-off-in-suspend;
    112. };
    113. };
    114. vdd_sd: ldo5 {
    115. regulator-name = "vdd_sd";
    116. regulator-min-microvolt = <3300000>;
    117. regulator-max-microvolt = <3300000>;
    118. regulator-boot-on;
    119. standby-ddr-sr {
    120. regulator-off-in-suspend;
    121. };
    122. standby-ddr-off {
    123. regulator-off-in-suspend;
    124. };
    125. };
    126. v1v8_periph: ldo6 {
    127. regulator-name = "v1v8_periph";
    128. regulator-min-microvolt = <1800000>;
    129. regulator-max-microvolt = <1800000>;
    130. standby-ddr-sr {
    131. regulator-off-in-suspend;
    132. };
    133. standby-ddr-off {
    134. regulator-off-in-suspend;
    135. };
    136. };
    137. vref_ddr: vref_ddr {
    138. regulator-name = "vref_ddr";
    139. regulator-always-on;
    140. standby-ddr-sr {
    141. regulator-off-in-suspend;
    142. };
    143. standby-ddr-off {
    144. regulator-off-in-suspend;
    145. };
    146. };
    147. bst_out: boost {
    148. regulator-name = "bst_out";
    149. };
    150. v3v3_sw: pwr_sw2 {
    151. regulator-name = "v3v3_sw";
    152. regulator-active-discharge = <1>;
    153. regulator-min-microvolt = <3300000>;
    154. regulator-max-microvolt = <3300000>;
    155. };
    156. };
    157. };
    158. };

    再找到scmi_regu节点,不要犹豫,删他个干净

    1. &scmi_regu {
    2. scmi_vddcpu: voltd-vddcpu {
    3. reg = ;
    4. voltd-supply = <&vddcpu>;
    5. };
    6. scmi_vdd: voltd-vdd {
    7. reg = ;
    8. voltd-supply = <&vdd>;
    9. };
    10. scmi_vddcore: voltd-vddcore {
    11. reg = ;
    12. voltd-supply = <&vddcore>;
    13. };
    14. scmi_vdd_adc: voltd-vdd_adc {
    15. reg = ;
    16. voltd-supply = <&vdd_adc>;
    17. };
    18. scmi_vdd_usb: voltd-vdd_usb {
    19. reg = ;
    20. voltd-supply = <&vdd_usb>;
    21. };
    22. scmi_vdd_sd: voltd-vdd_sd {
    23. reg = ;
    24. voltd-supply = <&vdd_sd>;
    25. };
    26. scmi_v1v8_periph: voltd-v1v8_periph {
    27. reg = ;
    28. voltd-supply = <&v1v8_periph>;
    29. };
    30. scmi_v3v3_sw: voltd-v3v3_sw {
    31. reg = ;
    32. voltd-supply = <&v3v3_sw>;
    33. };
    34. };

    然后再根节点下面,vin:vin节点后面或者随便哪里,添加我们的电源,至于哪个vin和v3v3_ao要不要应该无所谓把,笔者已经把它删了

    1. vddcore: vddcore {
    2. compatible = "regulator-fixed";
    3. regulator-name = "vddcore";
    4. regulator-min-microvolt = <1250000>;
    5. regulator-max-microvolt = <1250000>;
    6. regulator-off-in-suspend;
    7. regulator-always-on;
    8. };
    9. vddcpu: vddcpu {
    10. compatible = "regulator-fixed";
    11. regulator-name = "vddcpu";
    12. regulator-min-microvolt = <1350000>;
    13. regulator-max-microvolt = <1350000>;
    14. regulator-off-in-suspend;
    15. regulator-always-on;
    16. };
    17. v3v3: v3v3 {
    18. compatible = "regulator-fixed";
    19. regulator-name = "v3v3";
    20. regulator-min-microvolt = <3300000>;
    21. regulator-max-microvolt = <3300000>;
    22. regulator-off-in-suspend;
    23. regulator-always-on;
    24. };
    25. vdd: vdd {
    26. compatible = "regulator-fixed";
    27. regulator-name = "vdd";
    28. regulator-min-microvolt = <3300000>;
    29. regulator-max-microvolt = <3300000>;
    30. regulator-off-in-suspend;
    31. regulator-always-on;
    32. };
    33. vdd_usb: vdd_usb {
    34. compatible = "regulator-fixed";
    35. regulator-name = "vdd_usb";
    36. regulator-min-microvolt = <3300000>;
    37. regulator-max-microvolt = <3300000>;
    38. regulator-off-in-suspend;
    39. regulator-always-on;
    40. };

    3.3 删除其它

            usart1节点、wakeup_pin_5、tamp节点、ltdc节点、gpiob、gpiod、gpioe、gpioi,

    以及aliases节点下的serial1=&usart1。这些都可以删掉,不删掉应该也不大关系。然后根节点下model和compatible可以改成我们自己的板子的信息。

    3.4 追加hse

            在末尾追加一个节点

    1. &clk_hse {
    2. st,digbypass;
    3. };

    3.5 stm32mp13-pinctrl-atk.dtsi

            这个文件改不改都行,笔者直接不改也能跑,要改的话只剩一个usart4的就可以了

    四、编译

            先去Makefile.sdk里面,把设备树改成我们的板子

    CFG_EMBED_DTB_SOURCE_FILE ?= stm32mp135-atk

             还记得刚才打开没关闭的终端吗?如果关了,那就要重新设置环境变量了哦!回到2.3节的第二步,重新把环境变量设置好,然后编译

    make -f ../Makefile.sdk all

            可以看到 FIP_artifacts/optee多了三个文件:

    1.tee-header_v2-stm32mp135-atk.bin

    2.tee-pageable_v2-stm32mp135-atk.bin

    3.tee-pager_v2-stm32mp135-atk.bin

  • 相关阅读:
    一文搞懂数据仓库分层模型
    按字典序排序还是按长度排序
    12、FPGA程序的固化和下载
    Midjourney提示词-十二生肖唐装系列-2
    利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘
    企业架构LNMP学习笔记33
    基于Android和SSH的旅游自助系统APP设计
    Docker 自动化部署(实践)
    数据结构之线性表
    Oracle数据库使用PLSQL-Developer15导出导入Excel文件
  • 原文地址:https://blog.csdn.net/qq_42697289/article/details/133562637