(二)正点原子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 打补丁
官方的源码还是不能编译的,要先打补丁!!!
先进入到源码目录,就是上一步解压出来的文件夹
cd tf-a-stm32mp-v2.8.6-stm32mp-r1-r0.tar.xz
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)设置环境变量
打开一个终端,之后就不要关闭它了!!!
终端要在源码目录下打开,源码!
source /opt/st/stm32mp1/4.2.1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabiexport 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 复制官方文件
cd fdts/
cp stm32mp135f-dk.dts stm32mp135-atk.dts
cp stm32mp13-pinctrl.dtsi stm32mp13-pinctrl-atk.dtsi
cp stm32mp135f-dk-fw-config.dts stm32mp135-atk-fw-config.dts
cd ..
3.2 修改电源
最重要的部分就是修改电源配置,ST官方使用的是电源管理芯片,而正点原子考虑成本因素使用分立电源的设计。
打开stm32mp135-atk.dts文件,第67行开始的代码,这一部分的代码全部删了,是ST官方关于电源的描述
&i2c4 {pinctrl-names = "default";pinctrl-0 = <&i2c4_pins_a>;i2c-scl-rising-time-ns = <185>;i2c-scl-falling-time-ns = <20>;clock-frequency = <400000>;status = "okay";pmic: stpmic@33 {compatible = "st,stpmic1";reg = <0x33>;status = "okay";regulators {compatible = "st,stpmic1-regulators";buck1-supply = <&vin>;buck2-supply = <&vin>;buck3-supply = <&vin>;buck4-supply = <&vin>;ldo1-supply = <&vin>;ldo4-supply = <&vin>;ldo5-supply = <&vin>;ldo6-supply = <&vin>;vref_ddr-supply = <&vin>;pwr_sw1-supply = <&bst_out>;pwr_sw2-supply = <&v3v3_ao>;vddcpu: buck1 {regulator-name = "vddcpu";regulator-min-microvolt = <1250000>;regulator-max-microvolt = <1250000>;regulator-always-on;regulator-over-current-protection;};vdd_ddr: buck2 {regulator-name = "vdd_ddr";regulator-min-microvolt = <1350000>;regulator-max-microvolt = <1350000>;regulator-always-on;regulator-over-current-protection;};vdd: buck3 {regulator-name = "vdd";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;st,mask-reset;regulator-over-current-protection;};vddcore: buck4 {regulator-name = "vddcore";regulator-min-microvolt = <1250000>;regulator-max-microvolt = <1250000>;regulator-always-on;regulator-over-current-protection;};vdd_adc: ldo1 {regulator-name = "vdd_adc";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;};vdd_usb: ldo4 {regulator-name = "vdd_usb";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;};vdd_sd: ldo5 {regulator-name = "vdd_sd";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-boot-on;};v1v8_periph: ldo6 {regulator-name = "v1v8_periph";regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;};vref_ddr: vref_ddr {regulator-name = "vref_ddr";regulator-always-on;};bst_out: boost {regulator-name = "bst_out";};v3v3_sw: pwr_sw2 {regulator-name = "v3v3_sw";regulator-active-discharge = <1>;regulator-always-on;};};};
};
然后在第49行代码之后,补上我们对电源的描述↓↓
vddcore: regulator-vddcore {compatible = "regulator-fixed";regulator-name = "vddcore";regulator-min-microvolt = <1250000>;regulator-max-microvolt = <1250000>;regulator-off-in-suspend;regulator-always-on;};vddcpu: regulator-vddcpu {compatible = "regulator-fixed";regulator-name = "vddcpu";regulator-min-microvolt = <1350000>;regulator-max-microvolt = <1350000>;regulator-off-in-suspend;regulator-always-on;};v3v3: regulator-v3v3 {compatible = "regulator-fixed";regulator-name = "v3v3";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-off-in-suspend;regulator-always-on;};vdd: regulator-vdd {compatible = "regulator-fixed";regulator-name = "vdd";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-off-in-suspend;regulator-always-on;};vdd_usb: regulator-vdd-usb {compatible = "regulator-fixed";regulator-name = "vdd_usb";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-off-in-suspend;regulator-always-on;};
这里有一个天坑!!!天真的我以为改了设备树就好了,如果就这么改,压根跑不起来,烧录的时候卡死在第一步
找了全网,只找到一个帖子提到了,我们添加了电源描述之后,还要去一个文件里修改电源描述的数量。
在plat\st\stm32mp1下的stm32mp1_def.h里,第695行有一个
#define PLAT_NB_FIXED_REGUS U(6)
/* 把它改成电源描述数量+1 */
3.3 修改TF卡和emmc
找到sdmmc1这个节点(就在stm32mp135-atk.dts下),删掉它,替换成我们的
&sdmmc1 {pinctrl-names = "default";pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_clk_pins_a>;disable-wp;st,neg-edge;no-1-8-v;bus-width = <4>;vmmc-supply = <&v3v3>;status = "okay";
};&sdmmc2 {pinctrl-names = "default";pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_b4_b7_pins_a &sdmmc2_clk_pins_a>;non-removable;st,neg-edge;mmc-ddr-3_3v;no-1-8-v;bus-width = <8>;vmmc-supply = <&v3v3>;vqmmc-supply = <&v3v3>;status = "okay";
};
3.4 添加clk_hse
在末尾添加一个节点
&clk_hse {st,digbypass;
};
3.5 删除其他串口
ST官方板子有uart1和uart8,我们把它删掉,只留下uart4
aliases {serial0 = &uart4;serial1 = &usart1;// serial2 = &uart8;// serial3 = &usart2;};
&uart8 {pinctrl-names = "default";pinctrl-0 = <&uart8_pins_a>;status = "disabled";
};&usart1 {pinctrl-names = "default";pinctrl-0 = <&usart1_pins_a>;uart-has-rtscts;status = "disabled";
};
然后打开stm32mp13-bl2.dtsi文件,我们把对应删了的引脚也给删掉
// /omit-if-no-ref/ &i2c4_pins_a;
/omit-if-no-ref/ &sdmmc1_b4_pins_a;
/omit-if-no-ref/ &sdmmc1_clk_pins_a;
/omit-if-no-ref/ &sdmmc2_b4_pins_a;
/omit-if-no-ref/ &sdmmc2_clk_pins_a;
/omit-if-no-ref/ &uart4_pins_a;
// /omit-if-no-ref/ &uart8_pins_a;
// /omit-if-no-ref/ &usart1_pins_a;
3.6 修改引脚
切换到stm32mp13-pinctrl-atk.dtsi文件,这里为了方便,直接复制了原子的文件,也可以对照着修改,笔者直接用原子的文件替换掉了,代码如下
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/** Copyright (C) STMicroelectronics 2019 - All Rights Reserved* Author: Alexandre Torgue <alexandre.torgue@st.com>*/
#include <dt-bindings/pinctrl/stm32-pinfunc.h>&pinctrl {sdmmc1_b4_pins_a: sdmmc1-b4-0 {pins {pinmux = <STM32_PINMUX('C', 8, AF12)>, /* SDMMC1_D0 */<STM32_PINMUX('C', 9, AF12)>, /* SDMMC1_D1 */<STM32_PINMUX('C', 10, AF12)>, /* SDMMC1_D2 */<STM32_PINMUX('C', 11, AF12)>, /* SDMMC1_D3 */<STM32_PINMUX('D', 2, AF12)>; /* SDMMC1_CMD */slew-rate = <1>;drive-push-pull;bias-disable;};};sdmmc1_clk_pins_a: sdmmc1-clk-0 {pins {pinmux = <STM32_PINMUX('C', 12, AF12)>; /* SDMMC1_CK */slew-rate = <1>;drive-push-pull;bias-disable;};};sdmmc2_b4_pins_a: sdmmc2-b4-0 {pins {pinmux = <STM32_PINMUX('B', 14, AF10)>, /* SDMMC2_D0 */<STM32_PINMUX('B', 15, AF10)>, /* SDMMC2_D1 */<STM32_PINMUX('B', 3, AF10)>, /* SDMMC2_D2 */<STM32_PINMUX('B', 4, AF10)>, /* SDMMC2_D3 */<STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */slew-rate = <1>;drive-push-pull;bias-pull-up;};};sdmmc2_b4_b7_pins_a: sdmmc2-b4-b7-0 {pins {pinmux = <STM32_PINMUX('F', 0, AF10)>, /* SDMMC2_D4 */<STM32_PINMUX('B', 9, AF10)>, /* SDMMC2_D5 */<STM32_PINMUX('C', 6, AF10)>, /* SDMMC2_D6 */ <STM32_PINMUX('C', 7, AF10)>; /* SDMMC2_D7 */slew-rate = <1>;drive-push-pull;bias-pull-up;};};sdmmc2_clk_pins_a: sdmmc2-clk-0 {pins {pinmux = <STM32_PINMUX('E', 3, AF10)>; /* SDMMC2_CK */slew-rate = <1>;drive-push-pull;bias-pull-up;};};uart4_pins_a: uart4-0 {pins1 {pinmux = <STM32_PINMUX('D', 6, AF8)>; /* UART4_TX */bias-disable;drive-push-pull;slew-rate = <0>;};pins2 {pinmux = <STM32_PINMUX('D', 8, AF8)>; /* UART4_RX */bias-pull-up;};};
};
四、编译
先去Makefile.sdk里面,把设备树修改成我们的板子
还记得刚才打开没关闭的终端吗?如果关了,那就要重新设置环境变量了哦!回到2.3节的第二步,重新把环境变量设置好,然后编译
make -f ../Makefile.sdk all
可以看到FIP_artifacts/arm_trusted_firmware文件夹里多了几个文件
相关文章:

(二)正点原子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 添…...

将二叉搜索树转化为排序的双向链表
链接: LCR 155. 将二叉搜索树转化为排序的双向链表 题解: /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node() {}Node(int _val) {val _val;left NULL;right NULL;}Node(int _val, Node* _left…...

电脑dll丢失应该怎么解决,dll文件丢失怎么恢复方法分享
DLL(Dynamic Link Library,动态链接库)是一种可执行文件,它包含了在程序运行时需要调用的代码和资源。DLL 文件的主要作用是实现代码和资源的共享,这样在多个程序之间就可以避免重复的代码和资源,从而节省系…...

通达信和同花顺能否实现程序化自动交易股票,量化交易如何实现?
以下写给正在寻找自动交易接口的朋友,首先,不是那种设置个简单条件的条件单,或者某些客户端上形同鸡肋的策略交易,那些策略根本称不上策略,还有各种限制,不支持这个不支持那个,可设置的参数也不…...

基于Kylin的数据统计分析平台架构设计与实现
目录 1 前言 2 关键模块 2.1 数据仓库的搭建 2.2 ETL 2.3 Kylin数据分析系统 2.4 数据可视化系统 2.5 报表模块 3 最终成果 4 遇到问题 1 前言 这是在TP-LINK公司云平台部门做的一个项目,总体包括云上数据统计平台的架构设计和组件开发,在此只做…...

Linux CentOS7 vim寄存器
计算机中通常所说的寄存器Register一般指的是CPU中的寄存器,用来暂存CPU处理所需要的指令、数据等。 vim中同样也有寄存器,使用的方式和CPU非常类似。 vim中的寄存器(register)作用和windows中的剪切板类似,不过vim中的寄存器不止一个&…...

摄影后期图像编辑软件Lightroom Classic 2023 mac中文特点介绍
Lightroom Classic 2023 mac是一款图像处理软件,是数字摄影后期制作的重要工具之一,lrc2023 mac适合数字摄影后期制作、摄影师、设计师等专业人士使用。 Lightroom Classic 2023 mac软件特点 高效的图像管理:Lightroom Classic提供了强大的图…...

一种4g扫码付费通电控制器方案
之前开发了一款扫码付款通电控制器 功能:用户扫码付款后设备通电,开始倒计时,倒计时结束后设备断电,资金到账商家的商家助手里面,腾讯会收取千分之6手续费。 产品主要应用场景 本产品主要应用于各类无人值守或者自助…...

桌面自动化工具总结
引言:产品经理提出桌面程序需要自动化的测试,避免繁琐的人肉点击。说干就干。 现有自动化工具是五花八门,我找了两个框架。 这两个框架都是基于微软的UIA 框架,链接地址 https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-providerportal?source=recommen…...
Python入门教程 | Python 常用标准库概览
Python3 标准库概览 Python 标准库非常庞大,所提供的组件涉及范围十分广泛,使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块: os 模块:os 模块提供了许多与操作系统交互的函数,例如创…...

【JavaScript】读取本地json文件并绘制表格
本文为避免跨域问题,使用了改造过的本地json文件的方法实现读取json数据并绘制表格。 如果发起http请求获取本地 json文件中数据,需要架设本地服务器,本文不做阐述。 概述 1、json在本地,并不需要从服务器下载。 2、采用jquery…...
前端笔试题总结,带答案和解析(一)
1. 执行以下程序,输出结果为() var x 10; var y 20; var z x < y ? x:y; console.log(xx;yy;zz);A x11;y21;z11 B x11;y20;z10 C x11;y21;z10 D x11;y20;z11 初始化x的值为10,y的值为20,x < y返回结果为tru…...
LeetCode 202 快乐数
今天再次做到需要int转化成String,从而方便运算的题目。(当然还可以直接使用int运算也是没问题的) 再次出现了我容易弄混淆的问题,Integer.valueOf和ASCII码转化的差异? 其实之前我以及有记录过该问题,详…...
国庆作业day6
服务器 #include <my_head.h> #define IP "192.168.101.66" #define PORT 6666 int main(int argc, const char *argv[]) {//创建套接字int fd socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){ERR_MSG("socket");return -1;}struct sockaddr_in s…...

李沐深度学习记录4:12.权重衰减/L2正则化
权重衰减从零开始实现 #高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l#整个流程是,1.生成标准数据集,包括训练数据和测试数据 # 2.定义线性模型训练 # 模型初始化(函…...

堆--数组中第K大元素
如果对于堆不是太认识,请点击:堆的初步认识-CSDN博客 解题思路: /*** <h3>求数组中第 K 大的元素</h3>* <p>* 解体思路* <ol>* 1.向小顶堆放入前k个元素* 2.剩余元素* 若 < 堆顶元素, 则略过* …...
ipad使用技巧
1、goodnotes中批量导入pdf文件 法一: 直接参考视频: 【目前为止所知iPad上goodnotes批量导入网盘文件最快的方法】 大致步骤:pdf文件传到百度网盘,然后ES软件登录百度网盘,在goodnotes中导入,选择ES&a…...

Windows系统上使用CLion远程开发Linux程序
CLion远程开发Linux程序 情景说明Ubuntu配置CLion配置同步 情景说明 在Windows系统上使用CLion开发Linux程序,安装CLion集成化开发环境时会自动安装cmake、mingw,代码提示功能也比较友好。 但是在socket开发时,包含sys/socket.h头文件时&am…...

github搜索技巧
指定语言 language:java 比如我要找用java写的含有blog的内容 搜索项目名称包含关键词的内容 vue in:name 其他如项目描述跟项目文档,如下 组合使用 vue in:name,description,readme 根据Star 或者fork的数量来查找 总结 springboot vue stars:>1000 p…...

Python生成器
生成器 Generators 要理解生成器,首先要理解迭代器,迭代器由以下三个部分组成: 可迭代对象(iterable)迭代器(iterator)迭代(iteration) 1. 可迭代对象 只要定义了可以…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...