• (二)正点原子STM32MP135移植——TF-A移植


    目录

    一、TF-A概述

    二、编译官方代码

    2.1 解压源码

    2.2 打补丁

    2.3 编译准备

    (1)修改Makfile.sdk

    (2)设置环境变量

    (3)编译

    三、移植

    3.1 复制官方文件

    3.2 修改电源

    3.3 修改TF卡和emmc

    3.4 添加clk_hse

    3.5 删除其他串口

    3.6 修改引脚

    四、编译


    一、TF-A概述

            总而言之,和安全相关,篇幅受限,不做详细介绍,可以参考其他博主的帖子,本帖只做移植教程

    二、编译官方代码

    2.1 解压源码

           这里面有一个压缩包,把它解压可以得到源码,根据版本不同,不要照搬,只要能解压出来就行

    tar xf tf-a-stm32mp-v2.8.6-stm32mp-r1-r0.tar.xz

    特别注意:有一个README.HOW_TO.txt这是官方写给我们的使用文档,完全可以按照里面的方法去编译

    2.2 打补丁

            官方的源码还是不能编译的,要先打补丁!!!

            先进入到源码目录,就是上一步解压出来的文件夹

    1. cd tf-a-stm32mp-v2.8.6-stm32mp-r1-r0.tar.xz
    2. for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

    2.3 编译准备

    (1)修改Makfile.sdk

            编译源码不使用源码目录下的Makefile,使用上一级目录的Makefile.sdk,先对他进行修改。

    DEPLOYDIR ?= $(SRC_PATH)/../../FIP_artifacts/arm-trusted-firmware

             Makefile.sdk第4行,把DEPLOYDIR目录指向FIP_artifacts下的arm-trusted-firmware,这样编译出来的文件会直接输出到arm-trusted-firmware文件夹,方便后面fiptool打包

    TF_A_DEVICETREE ?= stm32mp135f-dk

            Makefile.sdk第19行,把其他设备树都给删了,只留下135的板子,之后添加自己板子的时候也要在这里添加

    (2)设置环境变量

            打开一个终端,之后就不要关闭它了!!!

            终端要在源码目录下打开,源码!

    1. source /opt/st/stm32mp1/4.2.1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
    2. export FIP_DEPLOYDIR_ROOT=$PWD/../../FIP_artifacts

            source是要用arm-ostl-linux-gnueabi这个交叉编译器

            export是设置FIP的目录,绝对路径或者相对路径都可以,可能写到Makefile.sdk里也可以,可以写一个sh脚本,不用每次都加载这个环境。

            注意:笔者交叉编译器安装路径直接默认了,大家安装的时候记得路径记一下

    (3)编译

    make -f ../Makefile.sdk all

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

            没有关系,别在意这个,这是因为Makefile.sdk里自动调用fiptool给我们打包了,但是现在又还没有编译u-boot和optee,所以会报这个

            最后会在FIP_artifacts/arm-trusted-fimware里生成如下:

    1.        tf-a-stm32mp135f-dk-emmc.stm32

    2.        tf-a-stm32mp135f-dk-usb.stm32

    3.        tf-a-stm32mp135f-dk-uart.stm32

    4.        ...(这几个都是.stm32文件,不列了

    n.        metadata.bin

    n+1.        fwconfig/stm32mp135f-dk-fw-config-optee.dtb

    三、移植

    修改头文件引用

    #include "stm32mp13-pinctrl-atk.dtsi"

    3.1 复制官方文件

    1. cd fdts/
    2. cp stm32mp135f-dk.dts stm32mp135-atk.dts
    3. cp stm32mp13-pinctrl.dtsi stm32mp13-pinctrl-atk.dtsi
    4. cp stm32mp135f-dk-fw-config.dts stm32mp135-atk-fw-config.dts
    5. cd ..

    3.2 修改电源

            最重要的部分就是修改电源配置,ST官方使用的是电源管理芯片,而正点原子考虑成本因素使用分立电源的设计。

            打开stm32mp135-atk.dts文件,第67行开始的代码,这一部分的代码全部删了,是ST官方关于电源的描述

    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. regulators {
    13. compatible = "st,stpmic1-regulators";
    14. buck1-supply = <&vin>;
    15. buck2-supply = <&vin>;
    16. buck3-supply = <&vin>;
    17. buck4-supply = <&vin>;
    18. ldo1-supply = <&vin>;
    19. ldo4-supply = <&vin>;
    20. ldo5-supply = <&vin>;
    21. ldo6-supply = <&vin>;
    22. vref_ddr-supply = <&vin>;
    23. pwr_sw1-supply = <&bst_out>;
    24. pwr_sw2-supply = <&v3v3_ao>;
    25. vddcpu: buck1 {
    26. regulator-name = "vddcpu";
    27. regulator-min-microvolt = <1250000>;
    28. regulator-max-microvolt = <1250000>;
    29. regulator-always-on;
    30. regulator-over-current-protection;
    31. };
    32. vdd_ddr: buck2 {
    33. regulator-name = "vdd_ddr";
    34. regulator-min-microvolt = <1350000>;
    35. regulator-max-microvolt = <1350000>;
    36. regulator-always-on;
    37. regulator-over-current-protection;
    38. };
    39. vdd: buck3 {
    40. regulator-name = "vdd";
    41. regulator-min-microvolt = <3300000>;
    42. regulator-max-microvolt = <3300000>;
    43. regulator-always-on;
    44. st,mask-reset;
    45. regulator-over-current-protection;
    46. };
    47. vddcore: buck4 {
    48. regulator-name = "vddcore";
    49. regulator-min-microvolt = <1250000>;
    50. regulator-max-microvolt = <1250000>;
    51. regulator-always-on;
    52. regulator-over-current-protection;
    53. };
    54. vdd_adc: ldo1 {
    55. regulator-name = "vdd_adc";
    56. regulator-min-microvolt = <3300000>;
    57. regulator-max-microvolt = <3300000>;
    58. };
    59. vdd_usb: ldo4 {
    60. regulator-name = "vdd_usb";
    61. regulator-min-microvolt = <3300000>;
    62. regulator-max-microvolt = <3300000>;
    63. };
    64. vdd_sd: ldo5 {
    65. regulator-name = "vdd_sd";
    66. regulator-min-microvolt = <3300000>;
    67. regulator-max-microvolt = <3300000>;
    68. regulator-boot-on;
    69. };
    70. v1v8_periph: ldo6 {
    71. regulator-name = "v1v8_periph";
    72. regulator-min-microvolt = <1800000>;
    73. regulator-max-microvolt = <1800000>;
    74. };
    75. vref_ddr: vref_ddr {
    76. regulator-name = "vref_ddr";
    77. regulator-always-on;
    78. };
    79. bst_out: boost {
    80. regulator-name = "bst_out";
    81. };
    82. v3v3_sw: pwr_sw2 {
    83. regulator-name = "v3v3_sw";
    84. regulator-active-discharge = <1>;
    85. regulator-always-on;
    86. };
    87. };
    88. };
    89. };

           

            然后在第49行代码之后,补上我们对电源的描述↓↓

    1. vddcore: regulator-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: regulator-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: regulator-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: regulator-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: regulator-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. };

    这里有一个天坑!!!天真的我以为改了设备树就好了,如果就这么改,压根跑不起来,烧录的时候卡死在第一步

     找了全网,只找到一个帖子提到了,我们添加了电源描述之后,还要去一个文件里修改电源描述的数量。

    在plat\st\stm32mp1下的stm32mp1_def.h里,第695行有一个

    1. #define PLAT_NB_FIXED_REGUS U(6)
    2. /* 把它改成电源描述数量+1 */

    3.3 修改TF卡和emmc

            找到sdmmc1这个节点(就在stm32mp135-atk.dts下),删掉它,替换成我们的

    1. &sdmmc1 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_clk_pins_a>;
    4. disable-wp;
    5. st,neg-edge;
    6. no-1-8-v;
    7. bus-width = <4>;
    8. vmmc-supply = <&v3v3>;
    9. status = "okay";
    10. };
    11. &sdmmc2 {
    12. pinctrl-names = "default";
    13. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_b4_b7_pins_a &sdmmc2_clk_pins_a>;
    14. non-removable;
    15. st,neg-edge;
    16. mmc-ddr-3_3v;
    17. no-1-8-v;
    18. bus-width = <8>;
    19. vmmc-supply = <&v3v3>;
    20. vqmmc-supply = <&v3v3>;
    21. status = "okay";
    22. };

    3.4 添加clk_hse

            在末尾添加一个节点

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

    3.5 删除其他串口

            ST官方板子有uart1和uart8,我们把它删掉,只留下uart4

    1. aliases {
    2. serial0 = &uart4;
    3. serial1 = &usart1;
    4. // serial2 = &uart8;
    5. // serial3 = &usart2;
    6. };
    1. &uart8 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&uart8_pins_a>;
    4. status = "disabled";
    5. };
    6. &usart1 {
    7. pinctrl-names = "default";
    8. pinctrl-0 = <&usart1_pins_a>;
    9. uart-has-rtscts;
    10. status = "disabled";
    11. };

     然后打开stm32mp13-bl2.dtsi文件,我们把对应删了的引脚也给删掉

    1. // /omit-if-no-ref/ &i2c4_pins_a;
    2. /omit-if-no-ref/ &sdmmc1_b4_pins_a;
    3. /omit-if-no-ref/ &sdmmc1_clk_pins_a;
    4. /omit-if-no-ref/ &sdmmc2_b4_pins_a;
    5. /omit-if-no-ref/ &sdmmc2_clk_pins_a;
    6. /omit-if-no-ref/ &uart4_pins_a;
    7. // /omit-if-no-ref/ &uart8_pins_a;
    8. // /omit-if-no-ref/ &usart1_pins_a;

    3.6 修改引脚

            切换到stm32mp13-pinctrl-atk.dtsi文件,这里为了方便,直接复制了原子的文件,也可以对照着修改,笔者直接用原子的文件替换掉了,代码如下

    1. // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
    2. /*
    3. * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
    4. * Author: Alexandre Torgue
    5. */
    6. #include
    7. &pinctrl {
    8. sdmmc1_b4_pins_a: sdmmc1-b4-0 {
    9. pins {
    10. pinmux = 'C', 8, AF12)>, /* SDMMC1_D0 */
    11. 'C', 9, AF12)>, /* SDMMC1_D1 */
    12. 'C', 10, AF12)>, /* SDMMC1_D2 */
    13. 'C', 11, AF12)>, /* SDMMC1_D3 */
    14. 'D', 2, AF12)>; /* SDMMC1_CMD */
    15. slew-rate = <1>;
    16. drive-push-pull;
    17. bias-disable;
    18. };
    19. };
    20. sdmmc1_clk_pins_a: sdmmc1-clk-0 {
    21. pins {
    22. pinmux = 'C', 12, AF12)>; /* SDMMC1_CK */
    23. slew-rate = <1>;
    24. drive-push-pull;
    25. bias-disable;
    26. };
    27. };
    28. sdmmc2_b4_pins_a: sdmmc2-b4-0 {
    29. pins {
    30. pinmux = 'B', 14, AF10)>, /* SDMMC2_D0 */
    31. 'B', 15, AF10)>, /* SDMMC2_D1 */
    32. 'B', 3, AF10)>, /* SDMMC2_D2 */
    33. 'B', 4, AF10)>, /* SDMMC2_D3 */
    34. 'G', 6, AF10)>; /* SDMMC2_CMD */
    35. slew-rate = <1>;
    36. drive-push-pull;
    37. bias-pull-up;
    38. };
    39. };
    40. sdmmc2_b4_b7_pins_a: sdmmc2-b4-b7-0 {
    41. pins {
    42. pinmux = 'F', 0, AF10)>, /* SDMMC2_D4 */
    43. 'B', 9, AF10)>, /* SDMMC2_D5 */
    44. 'C', 6, AF10)>, /* SDMMC2_D6 */
    45. 'C', 7, AF10)>; /* SDMMC2_D7 */
    46. slew-rate = <1>;
    47. drive-push-pull;
    48. bias-pull-up;
    49. };
    50. };
    51. sdmmc2_clk_pins_a: sdmmc2-clk-0 {
    52. pins {
    53. pinmux = 'E', 3, AF10)>; /* SDMMC2_CK */
    54. slew-rate = <1>;
    55. drive-push-pull;
    56. bias-pull-up;
    57. };
    58. };
    59. uart4_pins_a: uart4-0 {
    60. pins1 {
    61. pinmux = 'D', 6, AF8)>; /* UART4_TX */
    62. bias-disable;
    63. drive-push-pull;
    64. slew-rate = <0>;
    65. };
    66. pins2 {
    67. pinmux = 'D', 8, AF8)>; /* UART4_RX */
    68. bias-pull-up;
    69. };
    70. };
    71. };

    四、编译

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

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

    make -f ../Makefile.sdk all

            可以看到FIP_artifacts/arm_trusted_firmware文件夹里多了几个文件

  • 相关阅读:
    实在智能应邀出席中国移动科技工作者论坛,分享基于大模型+Agent智能体的“企业大脑”
    ⼀⽂读懂加密资产交易赛道的新锐⼒量Bitdu
    Linux程序的地址空间
    【java期末复习题】第13章 多线程
    Linux内存管理(二十五):shrink_node
    从零开始!如何安装和配置Jupyter Notebook
    MySQL核心SQL:结构化查询语句SQL、库操作、表操作、CRUD
    小米12sultra支持ip68级防水吗 小米12sultra有光学变焦吗
    ubuntu 多版本cmake共存的终极方法
    生成视频 zeroscope_v2_576w 学习笔记
  • 原文地址:https://blog.csdn.net/qq_42697289/article/details/133561449