【北京迅为】《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:执行…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...