【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植
iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
- 嵌入式Linux系统移植篇
第六十七章 Trusted Firmware-A 移植
在“第十章 编译TF-A”已经对Trusted Firmware-A进行了编译以及介绍,且对编译出的文件作用做了简单的说明,下面我们对官方提供的源码来进行移植,以此来适配我们自己的开发板。
官方提供的系统源码存放路径为“iTOP-STM32MP157开发板网盘资料汇总\07_系统移植\01_官方源码”下的tf-a-stm32mp-2.2.r1-r0文件夹。
移植好的系统源码存放路径为“iTOP-STM32MP157开发板网盘资料汇总\07_系统移植\02_移植好的源码\tf-a”。
67.1 源码的导入以及打补丁
将官方提供的系统源码文件夹拷贝到ubuntu上,如下图所示

使用命令“cd tf-a-stm32mp-2.2.r1-r0/”,进入源码文件夹如下图所示:

然后使用命令“tar -vxf tf-a-stm32mp-2.2.r1-r0.tar.gz”,对源码的压缩文件进行解压,如下图所示:
![]()
解压完成之后,使用命令“ cd tf-a-stm32mp-2.2.r1”进入tf-a-stm32mp-2.2.r1源码文件如下图所示:

然后使用命令“for p in `ls -1 ../*.patch`; do patch -p1 < $p; done ”对源码打上ST官方提供好的补丁,如下图所示:

67.2 准备编译所用到工具(用我们提供的环境可以跳过本小节)
在编译TF-A之前需要先编译 stm32wrapper4dbg 这个工具,否则编译会报错。ST 提供了这个工具的源码,我们需要在 Ubuntu 下编译并安装这个源码,源码的下载地址为:https://github.com/STMicroelectronics/stm32wrapper4dbg,存放的路径为:“iTOP-STM32MP157开发板光盘资料\04_TF-A、uboot和内核源码\stm32wrapper4dbg-master.zip”,将源码压缩包通过ssh拷贝到 Ubuntu下,如下图所示:

然后使用命令进行解压缩,如下图所示:
unzip stm32wrapper4dbg-master.zip

使用命令“cd stm32wrapper4dbg-master”进入stm32wrapper4dbg-master文件夹之中,如下图所示:

然后使用命令“make”,命令进行编译,如下图所示,即编译成功:

然后将编译出来的工具使用命令
cp stm32wrapper4dbg /usr/bin
拷贝到/usr/bin目录下。至此我们的准备工作就结束了。
67.3 编译TF-A源码
67.3.1 增设自己的平台
回到源码文件之后,使用命令“cd fdts”进入设备树文件存放目录,可以看到ST官方开发板的设备树文件,而我们的板子同样也是参照官方开发板来进行设计的,所以为了方便我们直接通过修改官方开发板的设备树文件来适配我们自己的开发板。
使用以下命令,将官方的设备树文件进行复制并修改文件名,如下图所示
cp stm32mp15xx-dkx.dtsi stm32mp15xx-itop.dtsi
cp stm32mp157a-dk1.dts stm32mp157a-itop.dts

使用命令“vim stm32mp157a-itop.dts”进入stm32mp157a-itop.dts文件,将头文件中的
#include "stm32mp15xx-dkx.dtsi"
修改为
#include "stm32mp15xx-itop.dtsi"
修改完成如下图所示:

并将model从STMicroelectronics STM32MP157A-DK1 Discovery Board修改为STMicroelectronics STM32MP157A-iTOP Discovery Board,修改完成如下图所示:
![]()
保存退出之后使用以下命令进入stm32mp15xx-itop.dtsi文件夹
vim stm32mp15xx-itop.dtsi
由于官方的DK1开发板内存默认为512MB而我们的内存为1G,所以我们需要将头文件之中的
#include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
修改为
#include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
修改完成如下图所示:

67.3.2 修改Makefile.sdk文件
然后回到tf-a-stm32mp-2.2.r1-r0目录下,使用命令“vim Makefile.sdk”进入编译配置文件夹,如下图所示:

进入文件夹之后首先修改交叉编译器,将“CROSS_COMPILE=arm-ostl-linux-gnueabi-”修改为“CROSS_COMPILE=arm-none-linux-gnueabihf-”,修改完成如下图所示:

然后在EXTRA_OEMAKE_SERIAL配置项中添加以下内容,主要是设置交叉编译器,以及一些编译所需要的配置
CROSS_COMPILE=arm-none-linux-gnueabihf- DEBUG=1 LOG_LEVEL=40 PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7
添加完成之后如下图所示:

然后我们继续在TFA_DEVICETREE 配置项中添加 stm32mp157a-itop,将我们的设备树也添加到编译的进程之中,添加完成如下图所示:

至此我们的Makefile.sdk文件就修改完成了。
67.3.3 编译TF-A文件
然后进入tf-a-stm32mp-2.2.r1源码文件夹,如下图所示:

使用命令“vim create.sh”,创建create.sh脚本文件,并在该脚本文件之中添加以下内容:
#!/bin/sh
make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-itop TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-itop TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all
添加完成之后如下图所示:

保存退出之后,使用命令“chmod 777 create.sh”,赋予create.sh文件可执行权限,如下图所示:

然后使用命令“./create.sh”,运行该脚本,如下图所示:

编译完成如下图所示:

回到上一级目录下,可以看到新生成了一个build文件夹,使用命令”cd build”,进入该文件

可以看到两个文件夹,分别为serialboot和trusted。

我们所需要的文件为serialboot文件夹内的tf-a-stm32mp157a-itop-serialboot.stm32和trusted文件夹内的tf-a-stm32mp157a-itop-trusted.stm32。如下图所示:

这这里需要说明的是其中tf-a-stm32mp157a-itop-serialboot.stm32文件是使用OTG烧写所用到的文件,而tf-a-stm32mp157a-itop-trusted.stm32文件是真正要烧写到EMMC中的文件。
67.3.3 烧写初始TF-A镜像
注意由于官方的开发板默认没有配置EMMC,我们本小节使用TF卡进行烧写测试,如果目前手上没有TF卡,可以不进行本小节的测试,但对应的流程需要浏览一下。
将“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\02_烧写文件模板”路径下的image文件夹拷贝到ubuntu虚拟机上,拷贝完成如下图所示:

然后我们使用命令“ ls tf-a/”命令查看对应的文件夹,可以看到tf-a文件夹内的文件正是我们上一小节所编译出来的文件夹,如下图所示:

使用命令将编译出来文件拷贝到tf-a文件夹内,对原有的文件进行替换如下图所示(每个人路径并不一样,在此需要注意):

使用命令“stm32.sh”打开烧写软件,如下图所示:

烧写的tsv规则文件我们选择tfcard.tsv如下图所示:

将开发板的拨码开关设置为“0000”,接好otg线之后,对开发板进行上电。在烧写软件之中选中对应的设备USB1,然后进行烧写(具体的烧写过程可以查看第八章STM32MP157烧写系统,在这里没有进行太多的讲解)。
烧写完成之后将拨码开关设置为“1010”,然后重启开发板,打印信息如下图所示:

从打印信息来看,我们成功进入了uboot证明我们的移植并没有出现问题,由于目前还没有配置EMMC,所以用同样的方法将镜像烧写到EMMC之中,然后将拨码开关设置为“0100”通过emmc启动会报如下的错误,在下一小节之中,我们会配置tf-a的emmc。
67.4 适配EMMC
再上一小节之中我们已经成功的通过TF卡经过tf-a启动到了u-boot,但是emmc并没有适配,所以会启动错误,下面我们来适配EMMC。
首先进入tf-a源码目录,如下图所示:

然后使用命令
vim fdts/stm32mp15xx-itop.dtsi
进入stm32mp15xx-itop.dtsi设备树文件如下图所示:

使用搜索命令查找sdmmc,只能找到sdmmc1的定义如下图所示:

sdmmc1正是对应的TF卡,在该配置下方我们添加以下内容:
&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";
};

保存退出之后,回到源码目录,使用命令“ ./create.sh”进行编译,如下图所示:
![]()
编译完成之后根据“20.3.3烧写初始TF-A镜像”章节按照同样的步骤进行烧写,这次要烧写的是EMMC,所以我们在进行烧写配置选择的时候选择emmc,如下图所示:
![]()
烧写完成之后,将拨码开关拨打“0100”EMMC启动,上电,在打印信息之中我们可以看到我们新编译出来的tf-a镜像已经能够成功进入uboot了。
至此我们的tf-a移植就结束了。移植好的源码我们存放路径为“iTOP-STM32MP157开发板网盘资料汇总\07_系统移植\02_移植好的源码\tf-a”

相关文章:
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植
iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…...
`a = a + b` 与 `a += b` 的区别
在 Java 中,a a b 和 a b 都用于将 b 的值加到 a 上,但它们之间存在一些重要的区别,尤其是在类型转换和操作行为方面。 使用 操作符时,Java 会自动进行隐式类型转换,而使用 则不会。这意味着在 a b 的情况下&am…...
mysqld.log文件过大,清理后不改变所属用户
#1024程序员节# 一、背景 突然有一天,我的mysql报磁盘不足了。仔细查看才发现,是磁盘满了。而MySQL的日志文件占用了91个G.如下所示: [roothost-172-16-14-128 mysql]# ls -lrth 总用量 93G -rw-r----- 1 mysql mysql 1.1G 7月 30 2023 m…...
v4.7+版本用户充值在交易统计中计算双倍的问题修复
app/services/statistic/TradeStatisticServices.php 文件中 $whereInRecharge[recharge_type] no_system; $whereInRecharge[recharge_type] system; app/model/user/UserRecharge.php 中 修改此搜索器内容 public function searchRechargeTypeAttr($query, $value){ if…...
[GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)
知识点: 命令执行 linux空格绕过 反引号绕过 变量绕过 base64编码绕过 打开页面提示 "听说php可以执行系统函数?我来康康" 然后输入框内提示输入 bjut.edu.cn 输入之后回显信息,是ping 这个网址的信息 输入127.0.0.1 因为提示是命令…...
MODSI EVI 数据的时间序列拟合一阶谐波模型
目录 简介 函数 ee.Reducer.linearRegression(numX, numY) Arguments: Returns: Reducer ee.Image.cat(var_args) Arguments: Returns: Image hsvToRgb() Arguments: Returns: Image 代码 结果 简介 MODIS/006/MOD13A1数据是由美国国家航空航天局(NASA)的MODIS…...
Java:String类(超详解!)
一.常用方法 🥏1.字符串构造 字符串构造有三种方法: 📌注意: 1. String是引用类型,内部并不存储字符串本身 如果String是一个引用那么s1和s3应该指向同一个内容,s1和s2是相等的,应该输出两…...
【日志】力扣13.罗马数字转整数 || 解决泛型单例热加载失败问题
2024.10.28 【力扣刷题】 13. 罗马数字转整数 - 力扣(LeetCode)https://leetcode.cn/problems/roman-to-integer/description/?envTypestudy-plan-v2&envIdtop-interview-150这题用模拟的思想可以给相应的字母赋值,官方的答案用的是用一…...
Mybatis高级
系列文章目录 高级Mybatis,一些结果映射,引入新的注解 目录 系列文章目录 文章目录 一、结果映射 1.ResultType 2.ResultMap 基础应用: 二、一对一 嵌套结果和嵌套查询 嵌套结果 嵌套查询 区别 三、一对多 四、多对多 五、注解补充 1.一对一…...
【spark】spark structrued streaming读写kafka 使用kerberos认证
spark版本:2.4.0 官网 Spark --files使用总结 Spark --files理解 一、编写jar import org.apache.kafka.clients.CommonClientConfigs import org.apache.kafka.common.config.SaslConfigs import org.apache.spark.sql.SparkSession import org.apache.spark.sql.streaming.T…...
【脚本】B站视频AB复读
控制台输入如下代码,回车 const video document.getElementsByTagName("video")[0];//获取bpx-player-control-bottom-center容器,更改其布局方式const div document.getElementsByClassName("bpx-player-control-bottom-center")[0];div.sty…...
leetcode - 257. 二叉树的所有路径
257. 二叉树的所有路径 题目 解决 做法一:深度优先搜索 回溯 深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。这种搜索方式会尽可能深地探索每个分支,直到无法继续深入为止,然后回溯到上…...
python 相关
python 1. pip 安装某个版本范围的软件 pip install “elasticsearch>6,<7” pip install elasticsearchX.Y.Z 2. pip 查看包版本 pip show pandas 3. pip 下载whl包 https://tendcode.com/subject/article/pip-offline-download/ (更多平台与架构)pip downl…...
静态分析2:控制流分析(构建CFG)
参考:南京大学《软件分析》课程2 1、控制流分析 控制流分析实际上指的是构建控制流图(Control Flow Graph,CFG)CFG是静态分析的基础数据结构CFG的节点可以是单个指令、基本块(Basic Block,BB)…...
Linux 应用领域
目录 服务器领域 桌面环境 软件开发 数据分析与科学计算 嵌入式系统 虚拟化和云计算 人工智能与机器学习 物联网(IoT) 网络安全 服务器领域 Linux在服务器领域的应用是其最为广泛和成熟的领域之一。由于其开源、稳定、高效和安全的特性…...
FPM383C指纹模块超详解 附驱动
0. 本人使用环境介绍 0.1 硬件环境 ESP32-C3FPM383C指纹模块一根破旧的usb数据线 0.2 软件环境 Clion2024.2.2ESP-IDF5.3.1Clion插件ESP-IDF 1. 硬件接口说明 1.1 UART UART 缺省波特率为 57.6Kbps,数据格式:8 位数据位,2 位停止位&am…...
若依框架篇-若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)、EasyExcel 框架(实现 Excel 数据批量导入功能)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 实现使用 Excel 文件批量导入 1.1 导入功能的前端具体实现 1.2 导入功能的后端具体实现 1.3 使用 EasyExcel 框架实现 Excel 读、写功能 1.4 将 Easy Excel 集成到…...
.rmallox勒索病毒肆虐:如何有效防范与应对
引言 在当今这个数字化时代,网络安全已成为一个不可忽视的重要议题。随着信息技术的飞速发展,网络空间的安全威胁也日益复杂多变。病毒、木马、勒索软件等恶意程序层出不穷,比如.rmallox勒索病毒。它们利用先进的技术手段,如代码…...
人工智能能否影响未来生活:一场深刻的社会与技术变革
随着人工智能技术的不断发展,我们已经目睹了它在各行各业掀起的巨大变革浪潮。从医疗行业的病例诊断、药物研发,到企业运营的数据分析、智能决策,再到日常生活中的智能语音助手、自动驾驶汽车、智能家居,人工智能正以前所未有的速…...
cmu 15-445学习笔记-3 存储引擎
03 Database Storage-Part Ⅰ 数据库存储上半部分 数据库分层划分结构图: Disk Manager:存储引擎,管理磁盘上的文件Bufferpool Manager:管理内存的缓存池Access Methods:访问方法Operator Execution:执行…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
