96SEO 2026-02-20 07:58 0
。

我们还将FSBL的相关代码移植成功了。
大家还记得FSBL的下一个步骤是什么吗#xff1f;没错#xff0c;就是SSBL#xff0c;而且常见的我们将SSBL作为存放U-Boot的地方。
所以本次教程…一、前言
在上一次教程中我们了解了STM32MP157的启动流程与安全启动机制。
我们还将FSBL的相关代码移植成功了。
大家还记得FSBL的下一个步骤是什么吗没错就是SSBL而且常见的我们将SSBL作为存放U-Boot的地方。
所以本次教程我们需要移植一份适用于我们开发板的U-Boot。
当然本次教程依然使用的是正点原子的STM32MP157开发板这里还是强烈建议大家的开发板和我一样的如果你准备好了就让我们开始吧
因为STM32MP157的程序下载需要U-Boot的辅助也就是说我们想要移植并下载一个U-Boot前提是先有一个U-Boot这就非常抽象了又像是回到了TF-A那样的“死锁”状态。
当然这里我们下载Uboot时可以直接使用正点原子已经移植好的Uboot来将我们自己移植的Uboot下载进去。
所以在移植之前请确保你对STM32MP157的程序下载有一定的了解。
关于STM32MP157的程序下载在之前TF-A移植教程中已经讲过了而且正点原子的手册中也有非常详细的讲解本次教程就不过多讲解了
TF-A移植[Linux]从零开始的STM32MP157启动流程讲解与TF-A的移植-CSDN博客
这里我们使用到的资料同样是正点原子的官方资料在最开始的环境搭建教程中已经讲解了如何下载正点原子的官方资料如果你还不知道如何下载请前往STM32MP157的开发环境搭建教程
STM32MP157开发环境搭建[Linux]从零开始的STM32MP157交叉编译环境配置_stm32mp157
首先我们需要明确一点Uboot并不是有一个系统它是一个非常庞大的裸机程序主要用于基本外设的初始化和拉起操作系统。
我们的操作系统在被编译以后并不是单纯的二进制文件而是一个以img为后缀的系统文件。
显然这个文件不像二进制文件那样可以直接被烧录运行这时我们就需要一段代码来拉起这个img格式的系统文件。
这个拉起系统的程序就是我们常说的Bootloader引导程序。
Bootloader有非常多的种类比如U-Boot、vivi、RedBoot。
在嵌入式领域或者一些智能通讯设备领域最常用的还是Uboot。
所以为了能在我们的开发板上运行Linux内核我们就必须用一个Bootloader程序来引导它这里正点原子的开发板选择的是Uboot。
总结一下简单来说Uboot主要就是一个用于引导系统的Bootloader程序。
当我们准备移植Uboot时我们可能会面临三种Uboot分别是Uboot官方开源出来的Uboot这个Uboot往往是最纯正的还有就是芯片厂家开放的Uboot芯片厂家会从Uboot的官方下载一份Uboot并且对其进行修改使其适配自己的芯片最后就是开发板厂家的Uboot就拿正点原子来举例正点原子使用ST公司的STM32MP157芯片生产了开发板正点原子会从ST那里下载芯片对用的Uboot并且对其进行修改从而适配自己的开发板。
这里我们要进行的移植其实就是让原本芯片厂商的Uboot对我们的开发板进行适配。
不同厂家的Uboot的关系可以看下面这张图
当然大家可能会有疑问明明正点原子已经帮我们移植好了Uboot为什么我们还要再移植一次呢其实答案也很简单正点原子移植Uboot的当然只适配正点原子的开发板。
如果我们自己设计了一块开发板这个板子的外设或者供电和正点原子的开发板不一样就会导致这个Uboot在我们的开发板上不适用。
我们移植Uboot的目的就是学习这个移植的过程在以后我们自己设计了开发板以后也能将Uboot移植上去。
这里我们先来编译一下正点原子官方的Uboot让大家体验一下Uboot编译与烧录的过程这样也有助于大家对Uboot移植的整个步骤有一定的了解。
这次的教程同样同步于正点原子的“【正点原子】STM32MP1嵌入式Linux驱动开发指南V2.1.pdf”文档它被放在了正点原子资料下
下面我们来编译正点原子的Uboot吧正点原子的Uboot被放在了正点原子资料下
创建的路径无所谓大家自己决定即可。
我们再在这个已经创建好文件夹中再创建一个文件夹用于存放正点原子的Uboot源码我这里文件夹就叫“atk-uboot”:
然后大家可以使用FTP服务将正点原子的Uboot源码上传到目录中这里FTP传输文件在环境搭建的教程中已经讲得很详细了大家自行操作即可这里就不进行多的演示了。
u-boot-stm32mp-2020.01-gdb2b13ef-v1.6.tar.bz2
这里压缩文件的文件名可能会变化大家根据自己当时的文件名解压就好。
解压过程可能比较久毕竟uboot是一个非常庞大的程序并且也兼容了非常多的芯片。
解压完成以后就得到了下面的文件
现在我们先不着急编译正点原子的uboot源码我们先安装编译所需的环境不然编译会产生错误我们使用下面的命令来安装对应的环境
安装好环境以后我们在正点原子的uboot源码目录执行下面的命令来清除一下已经编译的内容
CROSS_COMPILEarm-none-linux-gnueabihf-
下面我来逐一解释一下这些选项的含义首先是ARCHarm它指定我们交叉编译的架构为arm。
然后是CROSS_COMPILEarm-none-linux-gnueabihf-它指定了我们要使用的交叉编译器这里表示要使用名为“arm-none-linux-gnueabihf-”的交叉编译器也就是我们在STM32MP157开发环境搭建中安装的交叉编译器。
最后stm32mp157d_atk_defconfig表示使用预定义的配置文件。
编译之前会使用stm32mp157d_atk_defconfig生成
.config文件。
后面的make命令会根据对应的.config文件进行编译。
这里生成的.config文件是对我们开发板的基础配置。
当我们执行完上面的命令以后就得到了以下输出在输出中已经提示我们.config已经被成功写入了
当我们成功生成.config文件以后就可以开始准备编译了我们使用下面的命令对正点原子的uboot进行编译
CROSS_COMPILEarm-none-linux-gnueabihf-
这里多了一个V1的选项这个选项表示在uboot编译时输出详细的编译过程。
这里还多了一个
DEVICE_TREEstm32mp157d-atk选项表示要使用的设备树文件这里我们指定要使用的设备树文件为我们自己的开发板的设备树。
最后面的all表示编译所有所以这个all不能少。
我们同样可以加上-j的参数来修改编译时使用的线程数量编译完成以后就得到了下面的输出
这里正点原子官方的uboot编译一般是不会有错误的如果你出现的错误可以看看是不是遗漏了上面的某些步骤。
编译之后生成的文件就被放在了uboot的源码目录下
我们这里重点关注u-boot.bin文件和u-boot.stm32文件。
这里的u-boot.bin就是uboot源码被编译以后生成的二进制文件而u-boot.stm32则是在u-boot.bin的基础上加上头部信息的文件。
是的uboot也和TF-A一样需要在编译后的二进制文件前面加上一段头部信息。
下面我们就可以来烧录这个我们已经编译好的正点原子的uboot。
这里我直接在自己电脑的桌面上新建了一个“stm32mp157_uboot”文件夹用于存放uboot相关的文件和下载时会用到的文件以及STM32CubeProgrammer的配置文件
还记得我们在上一次教程中创建的“stm32mp157_tf-a”文件夹吗是的这个文件夹我们主要是用来下载TF-A的我们可以直接借鉴这个文件夹中的内容我们可以将stm32mp157_tf-a文件夹中的文件全部复制到stm32mp157_uboot中
复制完成以后我们需要进行一些小小的修改首先就是将原本的u-boot.stm32删掉换成我们自己编译出来的u-boot.stm32文件大家注意文件的时间确保自己替换成功了
然后我们需要将原本的STM32CubeProgrammer配置文件的名字改以下以前的配置文件名为“tf-a.tsv”我们将其改为“uboot.tsv”修改完以后如下图所示
然后我们需要对“uboot-tsv”的内容就行一些修改我们在tsv文件的最下面插入下面这样一行
注意这里的开头就是P不是PD或者别的如果从正点原子原本的文件中复制这里可能是PD这会导致烧录不成功。
配置文件修改完以后如图所示
这里我们启动STM32CubeProgrammer对我们编写好的uboot进行下载连接和下载的具体步骤在TF-A的教程中已经讲得很清楚了这里就不多说了。
下载完以后会收到如下提示如果前面一直按照我的步骤下载的话应该是不会有错误的
我们可以看到下面这里我们的uboot已经成功启动并且输出了uboot的编译时间。
我们也可以通过这里的编译时间判断我们的烧录是否成功。
在上面我们已经成功的编译了正点原子的uboot源码并且已经成功的在正点原子的开发板上运行了起来。
当然使用正点原子的开发板的目的就是为了让我们学习并且理解uboot的移植过程。
那么现在就来教大家如何在ST官方uboot的基础上为我们的开发板移植一份uboot。
这里大家可能会有疑问为什么我们一定要从ST官方的uboot的基础上进行移植而不是直接移植uboot官方开放出来的uboot。
这是因为虽然uboot官方开放的uboot对ST的芯片有适配但是适配程度肯定没有ST那么好。
而且让我们在原本的uboot上进行移植这几乎是不可完成的。
所以让uboot官方代码适配自己的芯片这个事一般是芯片厂商来做我们只需要在芯片厂商已经移植的uboot的基础上为我们的开发板移植一份uboot。
这里我们首先需要编译ST官方的uboot代码只有将uboot官方代码编译过了以后我们才能开始移植。
ST官方的代码被放在了正点原子资料下
我们同样使用FTP服务将其传输到Linux中这里我创建了一个名为st_uboot的文件夹
en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz
这里我们进入“stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”文件夹中的“sources/arm-ostl-linux-gnueabi”文件夹下可以看到以下文件夹。
这些文件夹里面就是里面就是uboot、optee、tf-a、kernel
这里很明显我们要用到的文件夹是“u-boot-stm32mp-2020.01-r0”。
我们可以在一开始创建的“UBOOT”文件夹中新建一个my_uboot的文件夹将u-boot-stm32mp-2020.01-r0下的所有文件都拷贝进去使用下面的命令
/home/chulingxiao/linux/UBOOT/my_uboot/
这里和我们TF-A的源码一样以.patch结尾的文件都是补丁文件我们需要使用这些补丁文件为uboot打补丁。
我们使用下面的命令将uboot的源码解压
u-boot-stm32mp-2020.01-r0.tar.gz
解压以后我们进入uboot的源码下使用下面的命令对源码进行打补丁
下面我们需要修改以下makefile文件还记得一开始我们编译正点原子提供的uboot的时候吗当时我们编译输入了命令非常长为了编译方便一些我们直接修改makefile将我们编译时的一些选项直接写入makefile中这样我们也就省去了很长的命令。
uboot的makefile就放在了uboot的源码目录下我们直接使用下面的命令打开修改即可
我们这里在使用nano编辑时可以直接按下“ctrlw”搜索“CROSS_COMPILE”找到如下位置
CROSS_COMPILEarm-none-linux-gnueabihf-
修改完makefile以后我们使用下面的命令来生成编译所需的.config文件
然后我们再使用下面的命令进行编译用编译命令时还是需要指定设备树并且也要加上all表示编译所有最后可以加上-j的参数来选择编译时使用的线程
这里大家可能会有疑问为什么我们要使用stm32mp157d-ev1开发板的设备树文件我们不是要编译正点原子开发板的uboot吗。
因为正点原子的STM32MP157开发板参照了stm32mp157d-ev1开发板所以我们这里编译一份与正点原子开发板非常类似的开发板uboot。
我们可以将这个编译出来的uboot烧录到正点原子的开发板中当然烧录进去肯定是不能运行的我们要根据具体的问题对代码进行修改这就是移植的过程通过不断的烧录测试从而移植一个能运行的uboot。
当我们编译完ST官方的uboot以后就可以准备烧录了。
但是在烧录期间我们会遇到一个问题因为STM32MP157的程序下载方式是先将uboot加载到DDR中然后通过uboot将程序下载到EMMC中但是我们现在uboot都没有移植成功那就更不可能可以成功的将uboot下载到EMMC中了。
怎么办呢我们可以使用正点原子已经移植好的uboot将我们现在编译的uboot烧录进去。
我们先将我们编译好的uboot改名为my_u-boot.stm32然后将其复制到我们下载uboot的文件夹中
然后我们需要修改一下tsv文件这里我们将tsv文件的最后一行替换为如下
这里表示我们烧录代码时使用的uboot名为“u-boot.stm32”实际烧入的uboot名为“my_u-boot.stm32”。
然后我们使用STM32CubeProgrammer加载文件
烧录以后我们将拨码拨到从EMMC启动以后我们使用串口终端工具查看输出发现我们的开发板正在反复重启并且蜂鸣器也在响。
当然实际的代码中没有让蜂鸣器鸣响的代码只是因为uboot不能运行开发板反复重启拉到的蜂鸣器的电平。
总的来说我们将EV1开发板的uboot直接放在正点原子的开发板中是无法运行的
因为我们要将uboot移植到正点原子的开发板上那么我们需要为正点原子的开发板添加一些必要的文件。
首先就是配置文件还记得一开始我们编译uboot使用的生成配置文件的make
stm32mp15_trusted_defconfig命令吗这个命令调用相关的文件为我们生成了编译所需的.config文件。
我们现在也要为正点原子的开发板创建一个这样的文件用来生成正点原子开发板独有的.config配置文件。
因为正点原子的开发板参考了EV1的开发板所以这个配置文件我们可以直接复制我们首先进入uboot源码
然后使用下面的命令复制开发板的配置文件并将其改名为“stm32mp15_atk_trusted_defconfig
stm32mp15_atk_trusted_defconfig
复制以后得到的这些设备树文件就是正点原子开发板的专属设备树文件了我们修改也是在我们复制出来的文件的基础上进行修改。
在修改文件之前我这里为大家推荐一种更为简单的文件修改方式——samba我们可以将linux虚拟机中的文件直接映射为windows中的一个磁盘这样我们就可以直接在windows上修改Linux中的文件了查看起来也会更简单。
当然如果你觉得这个方法不好也可以不采纳直接在Ubuntu中使用vscode修改的效果也是一样的。
下面是samba的安装教程
samba服务安装[Linux]在Ubuntu中安装samba并且正确配置详细_ubuntu
这里再次强调一下如果你是小白直接使用ubuntu里面的vscode配置即可如果你有一定的基础并且觉得我的这个方法还不错那么你可以采用我的方法。
下面我们就可以直接打开uboot的源码文件夹不管你是使用samba映射或者是直接在ubuntu中直接使用vscode都需要使用vscode打开uboot的文件夹打开以后如图
下面我们打开uboot源码下的stm32mp157d-atk.dts文件
随后我们需要修改一下电源管理设置我们打开同位于这个目录下的“stm32mp157d-atk-u-boot.dtsi”文件
这里文件比较长我就不放删除以后的截图了大家按照我的步骤进行操作即可。
下面我们要修改stm32mp157d-atk.dtsi文件,同样位于这个目录下。
我们找到“i2c4”节点我们将“i2c4”节点整个删掉也就是文件中的143行到298行
然后我们再找到“dac”节点也就是114-125行将其全部删除
然后我们继续修改stm32mp157d-atk.dtsi这个文件找到“led”和“sd_switch”节点
我们需要在stm32mp157d-atk.dtsi文件的\下添加自己的电源管理信息我们直接来到58行处添加如下代码
1800000;regulator-max-microvolt
上述代码定义了5个电源节点分别为vddcore、v3v3、v1v8_audio、vdd和vdd_usb
下面我们来修改TF卡和EMMC相关的配置我们继续修改stm32mp157d-atk.dtsi文件找到sdmmc1和sdmmc2两个节点将其修改为如下
就在这个文件中我们找到“usbotg_hs”节点直接将其注释掉
这个节点配置了OTG的电源因为ST官方的开发板电源是使用电源管理芯片配置的而正点原子的开发板中并没有使用电源管理芯片给OTG供电所以为了避免报错我们直接注释掉即可。
下面我们来编译一下uboot在编译uboot之前要先让编译器知道我们要编译哪个设备树
arch/arm/dts/Makefile文件找到“dtb-$(CONFIG_STM32MP15x)”配置项然后在此配置项中
加入“stm32mp157d-atk.dtb”添加完以后如图所示
大家还记得我们一开始的编译经历了哪些步骤吗我们首先清除了以前编译的内容然后生成了.config的配置文件最后才是编译这样的步骤我们每次编译都需要输入三条命令太麻烦了我们可以直接在uboot的源码下使用下面的命令来创建一个shell脚本
注意这个脚本一定要创建在uboot的源码目录下。
然后我们再使用下面的命令给这个脚本可执行权限:
然后我们打开这个脚本输入下面的内容这些内容就是我们要使用的命令了
stm32mp15_atk_trusted_defconfig
然后我们直接在uboot的源码目录下输入下面的命令就可以调用这个编译脚本来编译了
注意这里的“./”不能省略。
大家别忘了在编译时将修改过的文件都保存一下。
一定要保存这一步很重要。
如果你上面是严格的跟着**作的那么编译是不会有错误的编译完成后如图
我们使用查看命令可以发现这里已经编译出了我们所需的uboot.stm32文件
这里我们同样将其改名为my_u-boot.stm32然后复制到uboot对应的下载目录中
这里的tsv文件我们不用修改下面打开STM32CubeProgrammer并且加载tsv文件
这里我们可以看到我们的uboot已经成功的在我们的开发板上运行起来了那这就表示我们的uboot已经移植成功了吗当然还没有我们uboot的网络和OTG都不能正常工作我们还需要修改网络和OTG相关的部分。
下面我们首先来修改网络节点打开stm32mp157d-atk.dtsi文件将下面的网络节点添加到文件的最后面
下面我们还需要为网络芯片添加驱动正点原子的开发板使用了YT8511作为网络驱动芯片它的驱动文件被放在了正点原子资料目录下的“1、程序源码\08、模块驱动源码\01、YT8511驱动源码\uboot下修改方法”文件夹下
我们使用这个phy.c替换掉uboot源码目录下的“/drivers/net/phy/phy.c”我这里为了方便就直接使用samba文件映射进行替换了
这里我们使用vscode打开这个phy.c的文件找到phy_connect这个函数大概在1095行的位置我们需要将这个函数中的addr直接写0
首先我们来为USBOTG添加一个节点我们可以直接将下面的代码添加到stm32mp157d-atk.dtsi文件的“\”节点下注意这里一定要是“\”节点
来实现此接口功能STUSB1600有一个I2C接口此I2C接口用来配置芯片因此我们还需要
在设备树中添加STUSB1600相关的I2C节点内容。
将如下内容添加到stm32mp157d-atk.dtsi的
同样是在这个文件下面继续添加USB接口相关节点我们直接将下方的代码复制到文件末尾即可
最后我们需要在“stm32mp157d-atk-u-boot.dtsi”文件中添加osbotg_hs节点将下面的代码直接添加到stm32mp157d-atk-u-boot.dtsi的最下方
下面我们还需要使能boot和bootd命令在ST原本的uboot代码中这两条命令并没有被使能。
使能这两条命令也非常简单只需要添加一条宏定义就行我们打开uboot源码下的stm32mp1.h文件
下面我们还需要一下LCD的驱动使uboot能够支持LCD显示。
我们再次回到“stm32mp157d-atk.dts”这个文件
我们需要在这个文件下的“\”节点下添加panel_backlight和panel_rgb两个节点:
正点原子不同的屏幕对应的panel-rgb下的display-timings
也不同我代码中对应的是正点原子的1024x600的7寸屏幕其他屏幕的display-timings
就在当前文件我们需要添加一个ltdc节点我们可以在文件的最后添加下面的代码
当我们完成上面的步骤以后我们的uboot就算是已经移植完成了。
至此我们的uboot已经和正点原子的uboot并没有什么区别了我们再也不需要my_u-boot.stm32了。
我们可以直接将uboot下载下
这篇教程未免有些太长了我写起来也有些累在下一次的教程中我会教大家如何使用uboot中的基础命令在使用基础命令的同时也可以测试我们的移植是否成功。
好了最后感谢大家的观看
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback