【北京迅为】《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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于海思soc的智能产品开发(音视频处理的三个方向)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 音视频处理这个需求一直都有&#xff0c;那我们为什么需要soc来处理音视频。或者说&#xff0c;用soc来处理音视频有什么好处&#xff1f;传统的pc…

msvcr100.dll丢失怎样修复,介绍6个简单靠谱的方法

msvcr100.dll是Microsoft Visual C 2010 Redistributable Package中的一个关键动态链接库文件。该文件包含了运行基于Visual Studio 2010编译的应用程序所必需的一系列函数和资源。具体来说&#xff0c;它提供了C运行时库的支持&#xff0c;使得许多使用Visual C库编译的应用程…

雷池社区版compose配置文件解析-mgt

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多个 Dock…

并发编程的深入探索(3/5)

目录 1. Java线程模型 示例代码&#xff1a;创建线程的两种方式 2. 同步机制与锁 示例代码&#xff1a;synchronized的使用 显式锁&#xff08;ReentrantLock&#xff09; 3. Java并发工具包&#xff08;java.util.concurrent&#xff09; 线程池&#xff08;Executor F…

gcc与mingw64版本介绍

三类编译器 GCC&#xff0c;全称为GNU Compiler Collection&#xff0c;是一个强大的编译器集合&#xff0c;它不仅支持C和C语言&#xff0c;还支持Fortran、Ada、Java等多种编程语言的编译。在GCC工具链中&#xff0c;gcc和g是两个核心的编译器工具。gcc是专门用于编译C语言程…

PostgreSQL使用clickhouse_fdw访问ClickHouse

Postgres postgres版本&#xff1a;16&#xff08;测试可用&#xff09;docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…

【高级IO】IO多路转接之epoll

epoll接口 epoll_create 创建一个epoll模型 自从linux2.6.8之后&#xff0c;size参数是被忽略的返回值是一个文件描述符用完之后, 必须调用close()关闭 epoll_ctl epoll_ctl用于添加、修改或删除关注的文件描述符&#xff0c;并设置感兴趣的事件类型&#xff08;如读事件、写…

windows 11 mpksldrv.sys 导致蓝屏

#mpksldrv.sys 导致蓝屏 windows 11 在运行Twincat 3进行仿真时&#xff0c;就会蓝屏 尝试了各种其他的办法修改什么注册表&#xff0c;各种办法都尝试了没有用&#xff0c; 后面尝试了下面的办法竟然解决了&#xff0c;请参考下面链接&#xff1a; 链接: 两条命令可以帮助你…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明&#xff1a;使用的是github提供的Azure OpenAI的服务&#xff0c;可以无限薅羊毛。开源地址 进入&#xff1a; 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…

WPF+MVVM案例实战(九)- 霓虹灯字效果控件封装实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、运行效果2、主菜单与界面实现1、主菜单2、霓虹灯字界面实现3、字体资源获取3、控件封装1.创建自定义控件2、依赖属性实现3、封装控件使用4、运行效果4、源代码获取1、运行效果 2、主菜单与界面实…

Vulkan 开发(五):Vulkan 逻辑设备

图片来自《Vulkan 应用开发指南》 Vulkan 开发系列文章&#xff1a; 1. 开篇&#xff0c;Vulkan 概述 2. Vulkan 实例 3. Vulkan 物理设备 4. Vulkan 设备队列 在 Vulkan 中&#xff0c;逻辑设备&#xff08;Logical Device&#xff09;是与物理设备&#xff08;Physical D…

Hue3.9.0-cdh5.14.0安装

hue的安装需要准备如下的前置条件 1、Java-jdk8 2、python2.6 3、安装时非root用户 4、另行安装maven和ant&#xff0c;并配置HOME 5、hue安装节点需要hadoop、hive的配置文件 6、准备一个mysql库来做hue的元数据库 第一步&#xff1a;前置准备中的Javajdk和python准备本简单就…

自动驾驶-传感器简述

自动驾驶车辆上的传感器类型包含激光雷达、毫米波雷达、相机、imu、rtk、超声波雷达等&#xff0c;这些传感器用来接收外部世界多姿多彩的信号&#xff0c;根据接收到的信号&#xff0c;车载大脑对信号进行处理&#xff0c;那信号的准确程度就尤为重要。 本文将各个传感器的特性…

OpenCV图像处理方法:腐蚀操作

腐蚀操作 前提 图像数据为二值的&#xff08;黑/白&#xff09; 作用 去掉图片中字上的毛刺 显示图片 读取一个图像文件&#xff0c;并在一个窗口中显示它。用户可以查看这个图像&#xff0c;直到按下任意键&#xff0c;然后程序会关闭显示图像的窗口 # cv2是OpenCV库的P…

HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例

用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中&…

深度学习Pytorch-Tensor的属性、算术运算

深度学习Pytorch-Tensor的属性、算术运算 Tensor的属性Tensor的算术运算Pytorch中的in-place操作Pytorch中的广播机制Tensor的取整/取余运算Tensor的比较运算Tensor的取前k个大/前k小/第k小的数值及其索引Tensor判定是否为finite/inf/nan Tensor的属性 每一个Tensor对象都有以…

记录一个容器间访问不通问题

docker-compose装了zookeeper和一个服务。 zk服务如下&#xff1a; szxc-zk:image: "image.sd001.cn:30003/base/zookeeper:3.8"privileged: trueenvironment:- "TZAsia/Shanghai"#- "ALLOW_ANONYMOUS_LOGINyes"- "ZOO_MY_ID1"- &qu…

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…

使用pytest单元测试框架执行单元测试

Pytest 是一个功能强大且灵活的 Python 单元测试框架&#xff0c;它使编写、组织和运行测试变得更加简单。以下是 Pytest 的一些主要特点和优点&#xff1a; 简单易用&#xff1a;Pytest 提供了简洁而直观的语法&#xff0c;使编写测试用例变得非常容易。它支持使用 assert 语…

WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装

文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现2、使用封装的按钮控件1.主界面引用2.按钮属性设置3 总结1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目,在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.xaml ,修改 Us…